|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,' [& s2 [2 p( a! \* x6 M. {; }
input mcasp_ahclkx,
. n- M8 @2 D& O% N; yinput mcasp_aclkx,
0 ] Z4 [& q- D/ |9 y0 i. Ainput axr0,1 B" M9 E/ L. I6 B3 h' H5 W
0 E! u/ v! d1 v+ L1 `8 K) x* H% \
output mcasp_afsr,, g. [' `9 C4 X* j& H; B; E
output mcasp_ahclkr,' P' u* Z8 E" x0 E: z% ^
output mcasp_aclkr,+ b- e0 z. y' o5 g
output axr1,1 u) c, r- v7 q4 |- U! z2 y6 D
assign mcasp_afsr = mcasp_afsx;
4 d6 W9 z1 _8 ?% h; p/ t" M8 n7 @assign mcasp_aclkr = mcasp_aclkx;0 ~( z5 {# F2 ? c
assign mcasp_ahclkr = mcasp_ahclkx;) K$ P- x1 M: O1 Q5 o
assign axr1 = axr0;
% ^1 P5 W/ u9 Q6 a' W* \; d
* t% Z) B% O- m' z& w( {在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 2 j% a: O* v: L* D
static void McASPI2SConfigure(void)
4 P8 v0 Z2 g/ E% o4 R' R- ~3 P4 C{
' O8 C6 z* H( B( P1 T2 b: f# ?McASPRxReset(SOC_MCASP_0_CTRL_REGS);
& H2 c8 }! W! { Y! G* iMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) I8 j( t4 v: B3 {McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 p* @2 Y0 ~1 [3 OMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */5 C. u# p) ?9 ^9 @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 K4 U! ~# h$ LMCASP_RX_MODE_DMA);
* i, S; n, j% DMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, |+ o$ C% |! I! B a; xMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */" p( F! U D- o# A) n% w S( f
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " |3 c6 \$ B! q% V/ q
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 p! C8 J5 w! K U: N$ o: X9 i; w l7 _McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, U4 K/ t1 e9 y: BMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
6 `# ?+ d/ O# W. ?$ ~; d2 e8 {/ t$ N ~McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" {' t( `: | B& t' m/ z% B& ~
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% V1 F1 X: z0 ^2 C# W/ Q, a2 p9 P- JMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
! V+ |. i z# T+ ?, h. V0x00, 0xFF); /* configure the clock for transmitter */0 S+ f& L; Y# b" ^4 ]. M' X& ]
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ l+ @8 w! o- [5 f" ?, AMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% G/ e; u( }. { y: {, JMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ d4 i' f+ |* F( [1 H K5 A0x00, 0xFF);9 S+ ^5 E; Y, x! H# i
. }& x9 s" h3 R: \8 ^7 F/* Enable synchronization of RX and TX sections */ 6 l$ V1 A3 b% k( h* B% e) y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */) U* g ^0 N: `& J9 P5 x# w" E
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 R. d3 |# D* |/ e- O( BMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*/ p; p/ Z( c$ y; e6 h4 E
** Set the serializers, Currently only one serializer is set as% b# p0 [* k' m! D. I$ P
** transmitter and one serializer as receiver.
9 g: o9 [) C. R0 o+ x/ L$ A*/
& I8 a& T" P$ F4 Q9 q9 EMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- J4 m- c/ I+ c/ xMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*6 p0 T) G8 y- P1 ^8 ~) ~
** Configure the McASP pins
& F9 }! ~2 ?) |4 H** Input - Frame Sync, Clock and Serializer Rx
$ Z6 x! X6 O: \* m' p0 |** Output - Serializer Tx is connected to the input of the codec % e1 d8 X2 c. m& u
*/
, m: F4 e4 Y1 Q1 S( I+ Q" {McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ J) G/ s1 s4 S0 YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
) V) X* w2 O2 y- ^McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; A! F% ~$ ~+ E& \- k% F2 J| MCASP_PIN_ACLKX( C q0 }5 @2 u' Q
| MCASP_PIN_AHCLKX E6 V, i) W7 k1 b" n* ~# E% d
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- V( f! }' Y8 z- w2 y4 x: ^5 u
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' F: S9 M0 G' O6 e| MCASP_TX_CLKFAIL + A5 u1 n7 v; N; X" _
| MCASP_TX_SYNCERROR+ u7 W6 C! U4 D9 Z' T; _; N7 v
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 2 z" _8 i; i* G5 W) _( U5 G. T
| MCASP_RX_CLKFAIL
) E, o/ |/ q) }1 i| MCASP_RX_SYNCERROR 0 \; T. E" x |2 P! T
| MCASP_RX_OVERRUN);
9 _* s- r$ v. z2 f} static void I2SDataTxRxActivate(void)
& W3 m; w) [$ g" E8 R/ k. r{( H, T/ F6 P" B9 r1 t- q
/* Start the clocks */$ ?1 s) a7 t5 W7 W
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ ?1 c; w% ]9 G) ^McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 K7 f+ g1 n3 P$ {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 L' O8 Q: U4 e5 P# |+ tEDMA3_TRIG_MODE_EVENT); m. S- z) y/ ? Z( L
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 r9 B9 Z. r6 R4 I9 I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */: U h( @) w$ O+ g( w2 S
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! b& }, F$ E: c4 [2 Z8 R
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */! @2 x* z) B6 a b# W3 @ }
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
) B' y( s! `8 Y6 b. R4 q; yMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);" A8 U% j6 b; r% ?- K% G
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
7 T, S( ^, M E( V}
3 J+ H, `' h5 v) n3 j: a8 b# O% j9 Y请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: P5 ~9 ?/ m9 R0 s# |" A( ?; v; u S- m |