我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,% ]0 y/ d' P | P; ?
input mcasp_ahclkx,
) W& Q" p ~# a) D0 D2 h( Sinput mcasp_aclkx,7 G/ z- ~8 J+ C' n- g0 e
input axr0,
$ Z+ w6 ]- M) n2 \2 b/ J; }; q
2 W/ O5 k5 o6 s7 V N0 t8 V) Moutput mcasp_afsr,0 O4 [9 |& s. X3 T6 V
output mcasp_ahclkr,8 D7 v/ D: Z% G6 s
output mcasp_aclkr,8 F; M3 W; s0 d3 W! z
output axr1,
# C* {& v- L' t assign mcasp_afsr = mcasp_afsx;1 M8 F0 S' O: u8 M' t: j% Y7 K$ ]
assign mcasp_aclkr = mcasp_aclkx;1 A: c$ V+ Q: s/ R
assign mcasp_ahclkr = mcasp_ahclkx;: i8 ^' W7 I1 a6 y0 m! J
assign axr1 = axr0; 7 L8 Q# Q) B; J( R+ \9 L, g
; r+ n9 g m" R; I/ j [$ X
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
4 V( C" e! _. m4 astatic void McASPI2SConfigure(void)6 U! h: L! C5 R: J! ^$ T$ s' H! q+ `
{/ W6 X( z5 B0 {' \& z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);5 z+ z" W2 B3 f% ^9 |
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
|1 ?9 x1 y3 X3 {4 ~' kMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- k& t$ H" Y1 ^* G& O+ C& L# P0 d
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
1 N: t- m. H* l. m" z0 x }3 Z: hMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) O6 X2 q) I( t0 A: N) a' E
MCASP_RX_MODE_DMA);# i5 B; E' A2 `: g
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: @- j2 P6 K7 ~& mMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' Q( Q/ T0 ?4 U" l$ i) eMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; x6 N3 L/ M8 Y( f( BMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) Y* n; Z+ d4 P" [
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ @4 ?( ]$ |# G' s! _3 ?& yMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */# R; c) {" c) @; b3 a$ H$ }
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 g) ]4 x5 ]+ f3 f; d! y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + e" \, {" U" M' M$ X8 L
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,3 h% B/ `* x! E ?1 f y
0x00, 0xFF); /* configure the clock for transmitter */9 m8 x; V3 U0 G* f
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
* k6 C5 ^" p& v x6 ]McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
2 h7 Q( L3 g8 W XMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,$ q; A7 x$ b, }! X) D" u
0x00, 0xFF);
2 c( p$ |& |- c
* C2 b% n2 `& p/* Enable synchronization of RX and TX sections */
# k0 h3 y5 R( y$ \- c6 K' d2 yMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( r* o0 ^) c! |% F3 [. a6 \
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; r. V, N- V" o) g4 Q
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
5 ~7 Z: X5 {9 _( l0 o2 A% s) r* |** Set the serializers, Currently only one serializer is set as( u+ u: u6 D- |3 y; j, M9 l) ]: V7 I
** transmitter and one serializer as receiver.2 b- h8 Y/ K; }( P
*/. u% U! O9 i( w3 u2 i9 O
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 x, I3 s1 |, X4 b( f! V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
/ N. S; N0 W0 r$ Y+ t** Configure the McASP pins ( q/ w& ^, Z/ \' G
** Input - Frame Sync, Clock and Serializer Rx t: v* m& P6 s6 h/ N6 x7 O/ O
** Output - Serializer Tx is connected to the input of the codec
/ n1 [1 b, o+ P$ [*/, ], @4 J3 A( l$ B% s% G. i; r9 |
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 s: {9 v7 r- u7 P
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% }5 `& n4 ^) kMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
% s: W C) P/ X| MCASP_PIN_ACLKX
, t r( t9 m2 D' Q| MCASP_PIN_AHCLKX
9 @4 z6 j% U7 o+ W, `" w( || MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
; F$ t- V: i( c( mMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # L5 z- Y. t v( y+ s
| MCASP_TX_CLKFAIL 0 p0 I' i9 D6 T6 M4 |2 ` O
| MCASP_TX_SYNCERROR
9 L3 x7 F$ g$ b: W' Q) v9 v) }| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 d; e% c W+ u| MCASP_RX_CLKFAIL
! r7 _! z# }3 a y; y| MCASP_RX_SYNCERROR $ V% t" ~$ U4 |
| MCASP_RX_OVERRUN);- Q. U1 A# K, w7 y
} static void I2SDataTxRxActivate(void)+ A: J0 S% D' g5 |* D6 k
{
" P, L$ n* }* h$ B; ?( G4 | R: C/* Start the clocks */
/ g7 M6 S) H% V e3 U' j- OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 |( v/ r0 i5 }' @" f$ r
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */$ R" d: I+ a. l+ n. e: w! E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* \- M% o" A' @! @/ BEDMA3_TRIG_MODE_EVENT);
}2 |" I( a1 S& ^' j5 ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
1 F' }2 d I s& |EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 s$ B3 b' T1 m0 h7 hMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# a% p2 ?& j# D( P. n, h3 Z& _
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */! c! _# s$ S( {( e+ {
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
; b/ [3 U# t/ EMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 z4 V( c: D: |7 d
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 a6 r( k& n" c( G}
2 C) _: a% k' W c1 k0 c: t请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. E( @: k) K7 m8 c! ]' i
|