|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,6 p+ O. Z. D6 v) J' l' }3 l! {( X
input mcasp_ahclkx,
5 A [) o6 J' x" v( p; X+ linput mcasp_aclkx,. R. e P0 E4 E6 Y
input axr0,
I) {$ h9 ^: K0 {. P& Y8 y0 l3 X( J5 O1 {; x! `' b
output mcasp_afsr,& N$ e" s; w4 b, v0 C
output mcasp_ahclkr,, \8 x1 x' y! Z
output mcasp_aclkr,
: F3 `+ u4 W$ I noutput axr1,+ P3 L. s7 J" t) H9 x
assign mcasp_afsr = mcasp_afsx;+ q+ _% g b0 n1 E3 E- `
assign mcasp_aclkr = mcasp_aclkx;
: H5 ^% Q/ \% [7 z# yassign mcasp_ahclkr = mcasp_ahclkx;) n6 L( T( @+ X( L1 e/ i& E& J3 e
assign axr1 = axr0;
; g1 @0 t' T8 d( @5 o0 f: u: _ U
5 R) k9 g: r, t: L2 L在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
- R+ W9 \" q1 [- b& w: mstatic void McASPI2SConfigure(void)
6 B6 w7 b5 S" Z k+ C- W: T/ x{
# V! X6 I7 w& M) E8 q5 MMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
) x3 X/ ~" w) s; n# xMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) U( g" h/ A% K4 N" ~/ J1 JMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 D) A( p$ O* |4 |
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 Q# c4 n/ z! z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ a. j$ x- j7 bMCASP_RX_MODE_DMA);; U3 r: }; }; Y" [# j8 W2 {
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 c+ h2 Y' D, I0 M/ w# Y0 H- QMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 P0 U+ h5 _6 E: _McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 s( d: b/ m0 J8 \MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ r9 O2 g$ ~% \: L& ?8 [
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 I1 \$ C W" E+ L* Y F8 v8 ?
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */. { \. G" S! h5 M) K' g& a
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! ~3 G( x3 U, G" U" B$ g# }# F1 wMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' F0 t2 E0 P) l, D: y+ IMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 o: p6 x4 e w5 L0 ?( u( Y5 x$ i1 `
0x00, 0xFF); /* configure the clock for transmitter */
$ h2 E/ }7 X+ A$ I" n$ V/ ZMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% f- B! j: w- c. QMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" l4 v; Q, T0 d0 b1 h8 Q! jMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
5 J5 F" c. b8 Q8 G3 [ E. V$ ]8 u0x00, 0xFF);
9 v6 ~, U; H+ E0 y( o8 u1 ]4 e9 @4 X
/* Enable synchronization of RX and TX sections */
5 @8 o5 p/ Q" |* \, w0 EMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */( c& D# X9 Z" z( b9 b1 z, Q, q8 ~7 l- w
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% t( x" b( A, X R3 G# ]McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
' a( M- e) U$ P** Set the serializers, Currently only one serializer is set as
4 s' C9 T% A+ K' I. G/ D4 S** transmitter and one serializer as receiver.
5 F( }$ b' g0 h d; k c*/
/ H( y, `: `9 j9 M& nMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ E" k* j1 @! ^6 }, o S6 l9 ]
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*+ d- }2 q- T4 ]* h. X8 F; i: Z
** Configure the McASP pins 9 c3 ^/ N+ Y0 v0 S2 V/ o
** Input - Frame Sync, Clock and Serializer Rx2 Z9 |1 v7 z8 ^: F: A: U! g
** Output - Serializer Tx is connected to the input of the codec
8 _, \* Y/ h& o: N% |*/* b9 O% y6 v d
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# H. ^7 z z- |McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
/ X" n% X& D# |# c5 V. w" V; k* I* Q/ YMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; G& Z. \$ V% B+ O# G, W
| MCASP_PIN_ACLKX
) o" X$ k- T/ n0 K| MCASP_PIN_AHCLKX8 }; L6 y5 u2 R0 y3 R7 R+ L" s
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */6 E2 Z3 M" ]) W7 S/ w
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 a6 o. j0 R5 X8 K
| MCASP_TX_CLKFAIL $ n9 b, E( _* g) J B4 W8 n, L
| MCASP_TX_SYNCERROR( x2 f1 H* ]; f; F2 t# V) C
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 e- q3 ]1 Y) w. `| MCASP_RX_CLKFAIL. w4 v# |; P) }, Q n4 g
| MCASP_RX_SYNCERROR
d+ B2 H* i( ~/ o% {: X| MCASP_RX_OVERRUN);, J7 b% J- D. k D6 C
} static void I2SDataTxRxActivate(void)( Z& [- z1 H+ L9 m5 k3 J
{) A) o. X4 q% J/ K7 G+ w0 ~
/* Start the clocks */( l* p! \- ?' C ~6 U( ~
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);, }: ^2 ?$ y9 X0 l5 a* X% f& _
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */2 z6 N, V! e8 p/ i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 j, L' ~6 \# s/ C4 \EDMA3_TRIG_MODE_EVENT);
( g+ @! }& B7 ^# o1 LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 w* p. r5 b3 c+ M- i) A% mEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
! N, _* Y! i0 z& LMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! t- T) l8 L/ o! h
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
7 z3 o7 }, M- P) Dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */4 x7 N- s1 {. [8 c
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. m6 }8 c. O, B* kMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 v$ Z$ Y+ a# E& {) b9 @- Q) y' D+ @
} 8 ^/ ^7 H& b- U" v, W$ T1 W+ F4 Z
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% h2 w$ N0 m/ b r5 R/ p |