|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
5 j% d) i% [0 ^! g6 \0 Xinput mcasp_ahclkx,8 _8 K; V; Z. Q }# ?
input mcasp_aclkx,% ~) `% H3 r: N* t( |& k& k. A
input axr0,
1 {+ O% }2 E7 n1 _
( ~$ I! X+ N* y1 [output mcasp_afsr,) ~1 Z. o* t+ R
output mcasp_ahclkr,
- N1 W- z: l/ t: Koutput mcasp_aclkr,
, \5 v9 ?, \0 y7 I8 Ooutput axr1,- Y% J4 X- r; R& e2 \& I
assign mcasp_afsr = mcasp_afsx;
* K8 }. ?# F% U9 V F- w. p( Gassign mcasp_aclkr = mcasp_aclkx;: A( u4 \$ R4 Q( {6 z% S
assign mcasp_ahclkr = mcasp_ahclkx;
- ]( X2 l; y6 Dassign axr1 = axr0;
! o6 v: O8 R/ g( w- i$ a0 l. _8 {4 i" p
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 3 u* r" N, q. }! Y
static void McASPI2SConfigure(void)2 h, e4 j4 c' a7 w5 ]4 S
{) O0 h. S8 j: @
McASPRxReset(SOC_MCASP_0_CTRL_REGS); R* t7 k( q$ u3 x* e
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */1 e; x) X Y% H: z1 F7 \
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
) d0 p4 y& c9 U @& k4 oMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
/ \8 C% ~, l" Z& R. }McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 V, b3 u7 t- r. Y8 Q2 zMCASP_RX_MODE_DMA);
, R; W4 A0 G; F! u- YMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; j5 }- C) J$ I7 LMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */: p, Q R6 G9 e$ Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
( M! r. Q6 v7 r, z8 _3 S0 E% B) n9 `MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' {+ |. [+ {) O% |* I
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . E. P4 Y3 n- ]5 `5 y2 Z) g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 [. M& X/ v( G3 c
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
5 r+ i0 c2 d0 o, l! x, x0 x. GMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 p9 E* P+ w/ Y& s; Z0 PMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
7 z1 x/ p1 I1 i4 u+ e0x00, 0xFF); /* configure the clock for transmitter */% Q& y0 N5 \' d( i A& ^5 F
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ L. I$ J: _" ~4 p
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 o3 a! l- d9 |5 r
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ r* ?, L, [9 G5 V5 a$ m/ @: c. a! n' D0x00, 0xFF);/ [, n4 V5 `1 _0 n* S |6 q
9 F. d+ I4 ^& `" u/* Enable synchronization of RX and TX sections */ ; n' U6 z& T, s# y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
5 a. ^8 _5 K% H* `5 UMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; X2 i% R2 z% d( A. T" UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! F: o. N0 Q, ~: ]3 s** Set the serializers, Currently only one serializer is set as. i0 i2 V7 }; E7 Y
** transmitter and one serializer as receiver.
4 s& C" t+ N9 ^6 W# q*/
2 R% E# ?% J5 x3 x. vMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
* R0 X. }( N$ y4 i4 b9 hMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
" L2 V |4 n5 a$ s) A** Configure the McASP pins : Y' ?; j+ G R; P; ^9 A
** Input - Frame Sync, Clock and Serializer Rx
7 s8 {8 F7 Q" @7 y* i; }' \** Output - Serializer Tx is connected to the input of the codec
2 e! N7 ~! o( T' F& J. J*/
, u {) Z% r( [) T8 L& p/ l4 _" ^McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; m- L) {; @6 ?$ `4 r% A
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 w1 b; X D, v: M! [" @! \McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 y/ I4 Q5 ]( J) c| MCASP_PIN_ACLKX
}% E/ g* {1 U, ]/ I. y# I| MCASP_PIN_AHCLKX4 E! Y+ V5 c/ x. i
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
* ^$ b9 n0 G5 V" \# O/ Z4 RMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , r5 N9 A$ t& p) d5 M
| MCASP_TX_CLKFAIL
6 j+ S, P+ a/ l' O( y8 C& o| MCASP_TX_SYNCERROR, f- i! W) Q1 W* N3 C6 D
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 N5 U/ {2 Y" T* k7 F
| MCASP_RX_CLKFAIL& x4 ?/ I) x1 F/ U# m
| MCASP_RX_SYNCERROR & n9 v' k j) a! T- }& U% v
| MCASP_RX_OVERRUN);5 G" H$ P3 g2 X$ c! z
} static void I2SDataTxRxActivate(void)
" \4 h: e) {4 t( m{* q# T+ G4 \" d3 |
/* Start the clocks */
4 ^' Q, S0 T3 r& E0 AMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 e! y' z7 @/ {3 v/ h2 W' ]McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
$ j) \- f" j( w( I% h0 f0 E8 a/ M! dEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) b- Y& F; R) J$ pEDMA3_TRIG_MODE_EVENT);; k' Y2 J; P/ g8 F% ^/ [. X2 [ S
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, , ?0 v2 z: Y0 D) R6 M( {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */) A! c( l2 p; x4 m# k5 x
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 Y: d- U' B; w
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */4 v. l4 P" ]4 l$ o, o( V- G) R7 f
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */0 r# w! ]+ }: ^3 e6 |/ W
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 h Q' n# P& |: q/ B
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. H0 s! p1 e1 m7 u
} + v) I' V- {2 \! J( _! g5 d# Q5 N
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ b: m9 Y( n9 R: { |