|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,. `4 ~+ N0 U* j+ Q+ W
input mcasp_ahclkx,
( J0 \ Q9 e" }9 V" L K U) Cinput mcasp_aclkx,
4 L' N G. H5 T* K' u d. T |2 Hinput axr0,: V6 F2 r# z( x
, D4 q- h9 d+ @0 [- |8 c
output mcasp_afsr,
& A r7 ?; T/ e$ I# M ?output mcasp_ahclkr,
7 C/ F/ [+ Q7 W% q. m! _* |output mcasp_aclkr,
' Y+ a" e" ?$ ?* Y& W6 foutput axr1,: ]5 @- \ |/ a. [! [* \
assign mcasp_afsr = mcasp_afsx;! n6 `' y0 ^# p# P9 C7 j7 M
assign mcasp_aclkr = mcasp_aclkx;
$ C, O/ b* c3 \: X# xassign mcasp_ahclkr = mcasp_ahclkx;) g: H! O* E1 x- G, j
assign axr1 = axr0;
3 q! }5 ^' g% n+ e8 X/ N1 d" S5 Q! T I+ w9 C6 w( D! N. p h
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ O) g* r5 \! r) z+ x* j3 b; H! ^static void McASPI2SConfigure(void)
3 d3 L4 U; U# ?5 `{
3 o' ]) V' ^' C% d; i1 ]0 hMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 I6 t' I# ^$ l. ~( m& aMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */+ X! Z) c# t% r) S3 o) X) }
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 F1 q) g+ B6 YMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
' T0 {; G* f- m% ^2 X2 Q) @0 tMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 o# A2 D; H5 Q$ Z |2 c
MCASP_RX_MODE_DMA);
?4 q# V- F+ u% n7 K: oMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 T% E) ~$ y6 @1 a( B
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 u4 ]1 O! n/ i, R. PMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" t2 n: x" ?0 ]( ?' ^/ Q2 ZMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, M$ }- a- }* c, i6 Z7 X
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 j: l% w$ a8 RMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 B) L9 A) t: i. HMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ I4 [9 T1 y7 t- W( zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( J$ U3 i. I( G( ]. G- H- NMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
7 e5 R! ?8 W8 Q" J0x00, 0xFF); /* configure the clock for transmitter */0 B* F% A* ^# [4 ]3 s' T. j
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);6 o; |; {" |7 o4 Y/ Z
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 X1 |3 @9 a# m2 L5 C7 P" X3 E" vMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 j( I1 n1 T' N; ~5 b
0x00, 0xFF);! X7 p6 T* s' z+ L% T
3 K. ?& l, N6 d/* Enable synchronization of RX and TX sections */ : P7 a3 l/ d, d1 H& I8 T1 ?6 x
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) R% m8 A S& kMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ u+ q1 V! a4 q M$ ~* D1 _McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
0 g e4 Q! t0 B, [% L. L; e6 X X** Set the serializers, Currently only one serializer is set as
- d5 j/ _0 T+ i& \** transmitter and one serializer as receiver." z1 \8 Q4 l9 d n
*/7 @& T9 C) P( e# S" I7 a
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% k u- k: i/ D, M2 ^# h' H
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*5 D+ C% [- {7 i- q& n/ ]" ?
** Configure the McASP pins
1 S9 `8 A: b) F8 ~** Input - Frame Sync, Clock and Serializer Rx
# X6 l& d0 B6 t, T* Y3 I! u( B** Output - Serializer Tx is connected to the input of the codec
" q; g' e6 E$ J+ [3 J4 n0 e$ `*/
9 z# I r F- |7 ^/ MMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: }0 c( a/ ?( f# z6 T7 b' y. }/ g
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); o0 N7 `! y+ u! g1 ]2 y7 `$ y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
/ Q" n7 _; G ]- F| MCASP_PIN_ACLKX% Y7 S, B# h) b( r2 V, v
| MCASP_PIN_AHCLKX' Z% W/ V) a* k, f( n
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- S, V- f) m5 c9 W9 H* }
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 K, p: a3 ^! V+ P+ J4 C| MCASP_TX_CLKFAIL 2 o" ?) r4 p4 E- @" ^# b' V
| MCASP_TX_SYNCERROR0 W) b# h4 V& k" k: E" _
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
( ~5 }# ]' e3 z( k, F| MCASP_RX_CLKFAIL+ D3 o/ K* }$ G8 h) K
| MCASP_RX_SYNCERROR 4 g- ]; C8 `- q, `- o/ X
| MCASP_RX_OVERRUN);2 Q& b. \8 Z1 }
} static void I2SDataTxRxActivate(void)$ K8 H) [( ]* s. R( R0 F6 u, C
{& O2 o0 i, W; Z) S% ^' z& F
/* Start the clocks */8 ]' g1 P0 B8 K% h
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
$ q9 K! C0 ^* f8 J* rMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
F: e" \5 Q7 L4 I% r+ UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
3 R1 U1 t# a' V- UEDMA3_TRIG_MODE_EVENT);
3 e" W" d& N& F2 B* p6 P! KEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( Z( @4 P8 G( m/ m7 z2 [5 s$ iEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 h. P8 B ~6 n2 y5 x% C% n* [9 h1 f9 pMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);+ S% T; {- D3 X
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
5 o, }8 a& @, d% l# H& \8 E: |while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */0 C0 \+ Y9 c/ [" J
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);- ~: q0 s, R$ j% @4 \
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
# Y5 F. S% z3 }} 9 u" k j; v$ s$ ]- Y/ F$ O
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , r4 V$ `/ ~. v' Z9 s1 Y* L, J
|