|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,0 Y$ d3 K3 n) p
input mcasp_ahclkx,8 @: ]9 p9 d2 h+ t) C2 M2 ^8 e
input mcasp_aclkx,
7 h8 u, @ `6 n! D5 z/ Rinput axr0,4 n2 f( o0 M, v& C- l9 k
1 j2 l+ `& ^4 Youtput mcasp_afsr,
& T+ ?; L' d3 w7 U+ C4 _6 H: doutput mcasp_ahclkr,
/ Z5 F! J6 o, h- J; S( Poutput mcasp_aclkr,
3 z3 S& ?8 Y9 o6 x; woutput axr1,
. [7 n: A [4 w/ f" n2 F5 X$ }! o/ J assign mcasp_afsr = mcasp_afsx;
- s# w3 _8 S4 S L( u* `# Passign mcasp_aclkr = mcasp_aclkx;
+ D0 z% ]; {5 r# N1 u# k. w3 _assign mcasp_ahclkr = mcasp_ahclkx;
- |6 M& `4 p- V: n# c4 nassign axr1 = axr0;
|$ p' I) C* V- _$ b* }
/ C# o, p$ ?. k7 Q1 @4 P2 e9 h在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# @5 t1 q' @2 ]+ rstatic void McASPI2SConfigure(void)+ \ n3 v9 O/ o- \# z
{, z1 M: N! s7 I7 S# w
McASPRxReset(SOC_MCASP_0_CTRL_REGS);# z" X |' p( E2 T4 d8 y! j
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
" o% p$ ]4 s7 bMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);( ]& B3 Y+ m! Z0 R
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */0 Z3 c$ E0 H5 X- S. |" ?
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ Q, J( B3 d+ N5 {8 ~9 `( iMCASP_RX_MODE_DMA);
7 b, }9 o2 O; {" C$ F. k0 wMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 U+ o: l0 G' a% `MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" ?1 v6 n. ~7 R3 Z9 {McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & U8 v) G3 D% a- p
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ c( l4 P) A, r) q! K SMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ' _+ a5 p: Y. T+ y- H/ `
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
" U6 X5 n' J: p* mMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# ~ ^: b% s8 J1 J8 s2 hMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# g2 R6 i# D1 A/ |. lMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" z1 @. @1 i) {3 z; R3 I0x00, 0xFF); /* configure the clock for transmitter */
3 Q+ s9 o1 D* tMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ \ g7 [6 w1 F* C0 b
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( z% d4 n* H5 o# \5 P4 ^" S
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
2 h- `3 D6 R R0x00, 0xFF);
, @5 a0 K) G u( c8 }* U M3 Y9 H8 D" W) w! \% P
/* Enable synchronization of RX and TX sections */
% ]5 L6 e: [; [- MMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */9 Z! A4 a3 h. [+ g- `* m: j6 E
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( G9 u# v& y; w
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
' }9 o8 F+ ^' s9 N* M5 u* r' C** Set the serializers, Currently only one serializer is set as
4 e n! B8 T9 f. @" _% L1 }) X** transmitter and one serializer as receiver.
3 \$ n4 M7 I J. h2 W$ G*/
( g& P. ^$ b2 g0 n7 r- L7 VMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ M- m) c+ X3 @. s' TMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*: l9 w5 f2 B: w) g: p) V- F) p# G
** Configure the McASP pins
1 [1 [0 ^; { v# u8 e% O** Input - Frame Sync, Clock and Serializer Rx
1 N9 a& t3 G: p' ~5 U" `4 G& e0 |** Output - Serializer Tx is connected to the input of the codec
. c( x( ^% @& ~*/' V4 e# B4 ^3 l1 W& [9 y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' k$ [8 n6 r7 }, c4 W, y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
( z) z7 r$ r! _( k CMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
I4 t4 ?+ u7 S2 x7 c| MCASP_PIN_ACLKX
, N4 R# H8 g; |. O0 J| MCASP_PIN_AHCLKX
3 Q+ T. q& U, d( X3 i: B| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
7 @, C+ M; L9 n4 I' ~& EMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; K/ Y; m4 X! F- B
| MCASP_TX_CLKFAIL
" c& T6 }4 v2 j8 z, s" u; Q; D| MCASP_TX_SYNCERROR. ]) m( C7 G+ f* {( e
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 ?. C+ O, ~& E7 a, Y
| MCASP_RX_CLKFAIL9 d; B. c3 A6 Q3 s; e* k
| MCASP_RX_SYNCERROR - @1 u6 e+ d. U. `% l* I
| MCASP_RX_OVERRUN);* L0 i$ T% p5 h5 ^& `
} static void I2SDataTxRxActivate(void)
2 E+ O. b+ W) B) s* R+ p. H7 B8 v9 W+ q{
# V s/ j1 w6 n: _5 j; c7 t4 O: E* }/* Start the clocks */
0 O' R Z. L+ O, \# {4 ^0 O& WMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' D$ ]( A& f; F$ k" L) v
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// e; [7 F0 x3 \* Y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, O% T. E/ P* s1 x- I3 p& ~- N- u
EDMA3_TRIG_MODE_EVENT);
$ Z0 n* S1 i5 e6 ^( dEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 e5 M: Q6 B7 _4 n" D2 i( e8 R; ~
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& O5 i1 F* `2 I! CMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. h0 J, T4 s$ i0 Z2 v2 q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
. g: E% U) Z5 Zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */3 c2 i8 Y+ b! B$ |. l" ]
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);) O0 W* |3 Y- |% g
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ A# R! ~5 Q1 D2 Y" I' c} , k/ \ b9 g5 d$ [! U7 B9 h' V1 j
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 B( \$ n% z* M( e0 ^
|