|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,4 E9 q" C" ?( C& X% u& G
input mcasp_ahclkx,6 Z( M. n2 h* A3 i+ B
input mcasp_aclkx,
; M# A2 `' X7 Z1 Yinput axr0,9 c2 m, ?/ m$ U7 |- f& j
B. V; \2 d* {0 ]output mcasp_afsr,
b3 f6 h3 ]. N! boutput mcasp_ahclkr,
- n, s$ j' _% Zoutput mcasp_aclkr,
+ z" b! N1 q1 eoutput axr1,
& c4 p1 W9 g" q- j- T assign mcasp_afsr = mcasp_afsx;- X5 _& {* e U, N0 z
assign mcasp_aclkr = mcasp_aclkx;
( p6 p6 |7 C) V# a6 ~: ?3 o; _assign mcasp_ahclkr = mcasp_ahclkx;* U; q2 F; [6 l& Q- j- P/ |
assign axr1 = axr0;
# x7 R9 y }0 \6 k3 C- Z: Y n7 u1 r* ~
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 8 Q& e( A' T* D
static void McASPI2SConfigure(void)& i% \, `" x' L
{$ f7 I8 ]! u+ J) }- ~4 e4 V1 U+ P9 C( e
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
! `9 s3 `% R5 v5 u* i1 y) OMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- b% F+ l. z" Y9 u$ h1 D
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 S0 D% U! v" ?' H( Z# D0 `
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ }5 S8 w+ x4 l$ _3 c) f l+ K
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# C+ g( |* I& }# J5 U9 }
MCASP_RX_MODE_DMA);
* \! B* q- B* iMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! |$ U+ m9 c! F) ]3 J& X! ^3 S# e
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 B. e/ A: `* zMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( d/ [. m- Z0 @3 Z' |# _6 s0 K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- {' V4 W7 G( h1 C7 s' n1 x* A/ f3 J6 Y% R
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 p6 L/ U2 [) T0 P8 I6 ?8 fMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */4 `, t# X) x% {) N
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& S/ I9 E6 D. D, xMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & W$ t. B& o/ Q" b0 a) R/ w2 ~/ b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% [2 X: w. U$ J7 v& @, b W0x00, 0xFF); /* configure the clock for transmitter */
9 Y* d9 Q6 w+ i4 @* XMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& K- t9 {1 q0 d: lMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); & _$ F6 m" T [" g0 T1 D2 S' E: o
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( I9 h8 k+ E, S+ x8 |9 E2 I3 h0x00, 0xFF);7 g9 }- ~0 S4 k' L" D9 J1 q: r
, m+ t; B! o- I# J
/* Enable synchronization of RX and TX sections */
) e; X @" |3 ?McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
# {6 ?% r4 H5 r2 f7 l( ~' S! \5 rMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) J# F. C( M# z3 U+ T5 N9 \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*( Y- y/ F0 a- L8 a, \% Y/ @8 D
** Set the serializers, Currently only one serializer is set as
! T7 _5 w& L$ S8 o( {+ k: `9 X** transmitter and one serializer as receiver.
0 _2 F/ g! M1 K) ]# h. v*/
' H' {7 N2 P; _/ R; T( jMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 M$ n1 \$ | }0 RMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
+ z' {; s/ W1 O2 @& k L8 g** Configure the McASP pins
% l& T. @0 h2 m2 Z# l** Input - Frame Sync, Clock and Serializer Rx- u3 D& m0 C7 Q/ ^* V7 [/ z* }, @7 [
** Output - Serializer Tx is connected to the input of the codec
5 v% O" ]7 a) U' }*/
! t- \6 ?. _( _7 A4 _6 yMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 P' D- D4 {$ K' _7 z: R
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% y$ X! d1 V; N7 w+ ]( IMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, j w( {3 D! y: M& }$ A+ L4 J
| MCASP_PIN_ACLKX
/ L2 U& ]; \( k) _# E- F# t5 L; O| MCASP_PIN_AHCLKX
2 P$ y* u+ r" Y1 H% I* O| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
- _' C0 A, s* w) b! w) {6 n, PMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 E1 c" ?; F/ m5 I8 g* {9 D| MCASP_TX_CLKFAIL 3 ^) W8 x6 N' h3 H k& }0 W4 ^$ U
| MCASP_TX_SYNCERROR
3 |' F0 S3 ?0 o| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 D4 q+ l" E( [/ b6 A" h| MCASP_RX_CLKFAIL
7 d& r+ V/ z1 W| MCASP_RX_SYNCERROR - U4 V% v: @+ b' G
| MCASP_RX_OVERRUN);3 a9 M) {; a" U7 c
} static void I2SDataTxRxActivate(void)
7 W' P2 U2 c0 z9 r5 W& z. U/ h* u5 A# L{
+ l! B* Q. x$ v( R# o0 i9 I$ O/* Start the clocks */
; `+ P3 M7 l# e, ?( P$ M- NMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 ~5 r( X- E' H& l6 `, }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */) X0 w$ W2 y5 b4 a u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: M$ K- e; Q1 u2 R8 s- [) [
EDMA3_TRIG_MODE_EVENT);
1 x0 Z5 p$ s% ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) T) x% _/ `3 \3 e4 Y0 U$ y3 \- T
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
3 \% L. k1 b; {4 E4 H' kMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& ^( I1 `2 W. T- R% @8 _7 R: T& r ~
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */% ]2 e4 R5 t3 @9 v" x" ~% q+ j+ j
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */' a" ~8 g) t2 K) |- U
McASPRxEnable(SOC_MCASP_0_CTRL_REGS); g' L2 @+ A) s! e8 L, ^$ [/ C, v
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);* R% T/ J, d5 J; u8 ~ `2 Y9 i
} % c( T! X6 R; p% S% l# o
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. / q2 \+ b' C) t$ f7 y9 q
|