|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,2 o4 e3 n3 C) V2 U. Y
input mcasp_ahclkx,
6 ~) P5 {; K9 d$ ?1 k# d' z1 `input mcasp_aclkx,* ^8 D U) Y# l5 F
input axr0,% a6 g. ?" s" U% P. K1 Z
6 U/ R: T, t/ [6 |" w' |output mcasp_afsr,8 E6 x$ f2 m9 W* W) r, r3 m/ m5 q6 D
output mcasp_ahclkr,
T+ X# w8 G! c7 o2 Foutput mcasp_aclkr,/ |/ Z; U; s2 T X W1 b
output axr1,
7 F C# j. h+ m! l% J assign mcasp_afsr = mcasp_afsx;# q$ E' X! e" C; J1 r5 I& ?' g4 c
assign mcasp_aclkr = mcasp_aclkx;
0 L; A+ e$ B( m- yassign mcasp_ahclkr = mcasp_ahclkx;
& F% ]) R [) Q8 Rassign axr1 = axr0;
# H& H1 J. c+ i: y* T( }
8 `1 U& {# I$ E8 c' S* q2 i' M/ n0 E在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 , M0 ~& ^# R. ^' C, `
static void McASPI2SConfigure(void)
$ |7 y+ y$ [: v5 G" Z2 y{$ ]( D/ ~0 j6 y
McASPRxReset(SOC_MCASP_0_CTRL_REGS);' W; O- S+ ^8 q W. f
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( G4 F1 y' h: M( i4 a8 `McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 J; N! s. t/ s- b8 H, aMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) Z0 d, e% E, f# ?/ T
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," v: }8 [) y8 ]1 A4 x' T
MCASP_RX_MODE_DMA);
7 o5 C+ C) n% W3 AMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ z B }" Z$ @3 E# g
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 Y2 W0 P, l+ G, O. q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ q2 C5 H9 d% w! k$ n1 |MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% ~6 L# @4 ^) k) w/ e: YMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / }# _' P `1 g0 M/ n
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ |* M6 K& l3 i) ]8 hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) E/ B) I' d4 c7 \- f3 aMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); |8 }9 O4 Q0 r' _) I0 ]: m) C
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& t% B/ z! @' w" x0x00, 0xFF); /* configure the clock for transmitter */* Z9 T* y! }9 k* b) j, t; P" c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; Z& p& ?" w7 g4 B& B6 [# ~9 g( aMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% Z" `$ k: T3 P7 mMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ Y& v: T) }$ b1 f/ |0x00, 0xFF);$ r, ]0 p, {# e. ^% m" |- H
$ o9 s! @4 G* F! S" ]" ^! Y: C
/* Enable synchronization of RX and TX sections */
- G- C2 U0 V. I2 j( _McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */7 J; A) n1 @& { A
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# q, M8 |6 ~ u3 h DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
+ X5 `- G$ \9 s u) I** Set the serializers, Currently only one serializer is set as
; l( z$ L* L s4 f" `2 G** transmitter and one serializer as receiver.. ^" f; \+ o+ g9 g- P
*/
5 W# h! \: `% | A- ]) r5 }! ^McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
) d/ i" V% n( Q0 W5 Q9 ^; YMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /* H: J* z" O2 N( n
** Configure the McASP pins
, [5 m% {% n5 H. G R** Input - Frame Sync, Clock and Serializer Rx6 J) ?7 k0 p5 l9 y- k* W
** Output - Serializer Tx is connected to the input of the codec + H! b, J, m1 ~2 K
*/
0 [% l3 \2 h: l/ t% w: ^McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 {3 U! n% T) y8 [McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) T0 a! |5 ]9 D# G) W( H
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX! v! A9 K7 n5 {( g" W& K" \; [: F
| MCASP_PIN_ACLKX* E8 p7 u6 k8 P1 E
| MCASP_PIN_AHCLKX( D8 [: ?0 w! w7 ]
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
. I4 @* i# s4 {4 x9 hMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + S' w& o1 z! ?6 ^( h: Z) a4 s
| MCASP_TX_CLKFAIL 4 J6 @8 Y7 h- H! y% }
| MCASP_TX_SYNCERROR" h$ c& G) G* ]
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR / M- p2 a2 s0 U: \
| MCASP_RX_CLKFAIL
( ]* F$ l3 r2 s* y$ { ]1 g' y6 G| MCASP_RX_SYNCERROR
- d8 k+ P! z# I7 m0 H1 ~| MCASP_RX_OVERRUN);" s o: R; v3 Z$ N
} static void I2SDataTxRxActivate(void)2 [) F F; ~+ A2 T. p1 C
{
# u. d) I! S g, L' G3 _/* Start the clocks */8 ?( l1 Z) |% X
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" R. S1 P$ I' x+ FMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
, d) \6 o B1 X% wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, t* T& @& Z# o7 @
EDMA3_TRIG_MODE_EVENT); n3 I" G/ @9 G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: d$ \. p8 V4 f, W* WEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
' Y4 u! F% m# a L- s: ?McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 a# j& a0 t& o u9 A+ BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */. Y* ?5 w0 s1 b% Q7 f
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 A! h% ] n2 j+ e, ^McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
" N& Q# v- `5 |; a+ X' NMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);& \$ T& a/ S4 @- G( {3 D j
}
- i' y. T/ j* _% d0 j: @. |请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ z8 \, l! r' K5 i/ k" h; H2 x- j" C. T
|