|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ C% p2 g' n1 r& c8 o
input mcasp_ahclkx,& B+ R$ N: g6 Y7 e
input mcasp_aclkx,
( z8 S0 m- x4 P5 x8 J* zinput axr0,& x7 h1 S# s, i( T. s' U
( Q- E9 ]* L- \% p4 |# Zoutput mcasp_afsr,
5 i! j/ e4 C& o; `3 coutput mcasp_ahclkr,
% ]; K% }! W& h F6 ?* Ooutput mcasp_aclkr,
; q. E' ^/ X ]) soutput axr1," @5 @/ z8 m. {
assign mcasp_afsr = mcasp_afsx;$ ?- t5 Q6 M* }9 U9 C- E
assign mcasp_aclkr = mcasp_aclkx;
n7 V) R) P. m) t+ Gassign mcasp_ahclkr = mcasp_ahclkx;
w# f# o, q& C4 [# n% n" g+ U" Y% @assign axr1 = axr0;
8 K. h0 a5 ]% p
^. P5 b( q( `4 r$ R7 g( R5 H在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 / N [% Q# Z$ i+ _# L! j- c9 c5 f, V* f
static void McASPI2SConfigure(void)
6 Q; M- h" B5 w4 N. V2 {1 B{
( P' z/ C& O0 t8 PMcASPRxReset(SOC_MCASP_0_CTRL_REGS);7 E L8 J( y' \. o
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
m0 b6 c1 e4 O) h0 c# XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; s) r, F% K: oMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */6 L7 Z( ^5 I0 X
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ }$ E$ T5 W7 E' h$ s7 Q& O" G" o; z
MCASP_RX_MODE_DMA);
2 H3 Q* E7 G: nMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ h5 i- W$ A3 p' HMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
) n8 T8 S+ I2 Y9 }7 _1 b' xMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 p3 g! P' b: `( N
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* F! m$ r9 v+ wMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& T N8 O4 P$ {# |MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: [6 v& A; Y8 \, x, i/ Z9 {
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% P% S8 H- g7 X7 Z5 p
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 R; d9 p0 Z+ z b; g4 Q- P6 J
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( t3 R, ~* h1 G* k/ ?0 o# C: p0x00, 0xFF); /* configure the clock for transmitter */3 a E y" z8 Y2 ^8 A8 X4 c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- h9 G0 j' K" r1 ^5 V2 e5 n+ ~( RMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
/ ]" o7 w' d/ DMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 K& a4 u+ X3 s# d0x00, 0xFF);& i# ]+ W4 u" e: Y5 n
7 z+ ^9 e4 r) t9 [$ F; S0 W/* Enable synchronization of RX and TX sections */
" e' y# R( Q- d- O, O$ m: HMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" v3 ]5 V; a' I+ X# m3 E
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; v& Q, j/ @% ~6 m" E
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
& X+ B g# c! z** Set the serializers, Currently only one serializer is set as
) W3 V) n I( R8 C** transmitter and one serializer as receiver.
% o7 r8 ?7 R/ C*/! r( ~8 Y# P; C
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);2 M) B1 T6 Y* W7 y% T- A# ~
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 d% A( a$ D" {# c+ F( ^, b
** Configure the McASP pins " t. j% y6 R$ O/ |
** Input - Frame Sync, Clock and Serializer Rx# j W5 ?; K- l! o: y; [1 O% l
** Output - Serializer Tx is connected to the input of the codec
- r' W/ j% C' R8 p. C$ V*/
# d+ a! x4 s2 E5 sMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
2 j( s6 q1 _2 y1 d4 O# R( i' a- yMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 \' g6 M; t! R
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' S, o. I1 }; a0 k* T
| MCASP_PIN_ACLKX4 B4 o7 m/ A+ c1 S
| MCASP_PIN_AHCLKX* j+ x! u4 X& S8 X) ~: z. |6 C4 Q1 v' [7 ^
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */& {, f* w/ O6 S: L
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) h4 ^) }; m* ~7 A# r" ?2 P| MCASP_TX_CLKFAIL
- p$ ~1 E" h, b7 J& k5 Z( m' h| MCASP_TX_SYNCERROR
8 N7 ~* ]9 }' ?1 {9 e$ g+ w) P, Q| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 8 _" E. ^8 e ^' |. W0 W3 B: ]
| MCASP_RX_CLKFAIL
* S, \1 y! p2 B* b6 l1 C. s| MCASP_RX_SYNCERROR , P2 k! q1 p1 i9 \9 e
| MCASP_RX_OVERRUN);
7 p" w& i3 [/ \/ \) t1 ` ~} static void I2SDataTxRxActivate(void)0 b8 l' r3 b! i) ~
{
# B( v1 ?; d2 x! B0 n) p' [, i s/* Start the clocks */
4 K$ e* _9 r9 C. A0 G: xMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: Z, X! ?* t) S2 Q! T0 K1 j
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
0 K" G, J! M2 y, \EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 a( Y7 r1 d: b
EDMA3_TRIG_MODE_EVENT);7 D7 H& ]1 Y# y. K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 j; t; p3 H% O+ M( b e9 d
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
+ z# Q3 t% o3 e' S. _. hMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" Z; E% |5 B8 L9 VMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 R* C0 A1 n! w& B4 V
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */! A9 h" P) _2 t1 }. g! N* I$ W
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
# d2 {& m/ N0 X i! nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 K# X2 K# }$ W+ Q4 S}
# Z0 H& z9 `0 Z4 K% N# q请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. , J. w$ ] g5 b( L, R2 ` I
|