|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,4 w+ T# V& H7 l$ g- Z
input mcasp_ahclkx,
6 s5 d% j* f1 a m4 n7 i, m+ ^input mcasp_aclkx,
9 `1 m: O- [) t- ~9 x0 Sinput axr0,
! B% H2 m, R2 X" S. U; j4 z i5 k; y c& @( ]5 l. I2 T% c2 |
output mcasp_afsr,6 c( j2 Q, f1 ~1 T7 ^
output mcasp_ahclkr,
+ n/ M. {& ^; [: w( k7 r$ Routput mcasp_aclkr,, U& f! W5 @4 I9 {8 [; D ~
output axr1,
6 \ g; ~4 V/ }, G: M assign mcasp_afsr = mcasp_afsx;
+ Z9 z; a {5 \0 ?assign mcasp_aclkr = mcasp_aclkx;
h5 l- U: F5 I% U+ {' `assign mcasp_ahclkr = mcasp_ahclkx;
4 N8 n% W: r% S" d4 k& Eassign axr1 = axr0; 2 ]/ W* h1 B* v7 n9 u( d Q
1 M8 ^; W4 w9 \+ \在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 e3 q" c& e. U& Jstatic void McASPI2SConfigure(void)
5 l# `5 e- h( j* l8 y{
5 ?9 R+ G, ?' | n e6 e4 QMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; G$ @; X8 ?/ K$ ~# ~4 P# E# ~, U
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */. u( T" d/ n0 `/ i8 ]9 z8 S4 t
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: D0 }; v( R* zMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
8 s2 ^2 r7 J( N; P# wMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# d6 C+ }; y0 e) x6 u
MCASP_RX_MODE_DMA);9 l6 d" d8 {0 d" v( l% Q/ d. ?
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 K: x- q; `! T0 N2 J/ m; qMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ e) O4 B6 v8 U! @: b( W; bMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! r8 B6 h: A0 K- z8 x! u& aMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# y* b: ]. }/ l# PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' C1 |: i1 U5 _9 V2 J( m% Y7 W dMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
$ `; n. ]1 w3 z' i% n G5 d# bMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 H" r& h- U( k+ R1 I( H5 j
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) I0 s7 `% W/ y. ]" i8 H' o
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 ]0 b$ k. w* o5 L; g2 s0x00, 0xFF); /* configure the clock for transmitter */
3 j* A" c) @( ^! o* {$ W5 {' wMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);% t. p- n$ V. `6 H; @# [, `
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; {4 ^& G2 v/ i2 P0 x1 A
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,- @/ F' H+ T4 o( [8 }
0x00, 0xFF);
% N8 g% C& J! Q1 T. ?: b. f( ^3 `4 P& H1 p! V5 r5 T3 ^
/* Enable synchronization of RX and TX sections */ : G3 r4 l; Y; h5 U/ ~8 D
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 `' U( {4 v6 Y- NMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
$ Z$ N" |; Z# V+ K) nMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*0 s7 q9 ^3 C; }" H& s
** Set the serializers, Currently only one serializer is set as6 Q& {: s4 q* F4 t- @/ D
** transmitter and one serializer as receiver., A& l; l8 R j" f' X
*/
: _. s1 \7 q1 P6 b- g0 I) eMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% A, l2 x1 n Y, I
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 L( Q# }' U7 y7 e4 _
** Configure the McASP pins * v1 u* n% Y% S
** Input - Frame Sync, Clock and Serializer Rx4 N; u3 W; p1 _/ L7 U
** Output - Serializer Tx is connected to the input of the codec
2 M4 w' j( j5 S C* T*/
u( t, C6 j; r: y/ p! O9 P2 kMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" c. p- [$ q0 K$ P
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& f1 b# \9 M" ]& X' Q7 P |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- ^, F/ `: E/ b) g* N+ \
| MCASP_PIN_ACLKX
+ Y5 Q' T8 {# H0 Y0 C0 n| MCASP_PIN_AHCLKX' _6 b) W1 m( s3 P# n! E4 Q2 _: i8 Q
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
$ G! A- H+ U. Z) mMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, ]" z( X" }( j| MCASP_TX_CLKFAIL
( \' j1 ~, B. n, c/ E' V" K| MCASP_TX_SYNCERROR" h5 [6 |7 B; k& ]% ?7 }
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 7 X! {) o5 K) ^$ |3 _
| MCASP_RX_CLKFAIL3 E' t/ O9 }2 g ^" k! @
| MCASP_RX_SYNCERROR $ F/ t; m' e2 S9 N: I9 k
| MCASP_RX_OVERRUN);
& u7 s% u+ @! y& Y1 ?1 }3 _} static void I2SDataTxRxActivate(void)
( D, w4 d# ~% l. w' B{
2 T6 M9 }6 n. V R7 u/* Start the clocks */
) f2 w1 [" Z, K* y* f1 V$ B1 VMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 ~0 T! X# @: T' ~9 S! oMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */) p" |! h; e8 Z' e; p4 `; q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,3 o0 r6 i# J, ~4 L/ W
EDMA3_TRIG_MODE_EVENT);
3 k" E6 l- w, q ~2 k2 [ VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( A' e, |1 r& sEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
b! U- A3 g: \6 h! y+ nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 O3 W$ L& E& y- k" u( v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 y' h% K) n: F0 S5 `) N! B! T
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" e; e# K) ^. A: p4 v, U' \9 r! w
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
9 A% p4 l% F( R' S! |5 [McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& A x+ B9 ~; h0 a} ) F5 H+ N5 C7 w( G/ O. |. H' k
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. " D( V/ m8 d. t8 v
|