|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 R) T0 _0 Y/ F/ s
input mcasp_ahclkx,
' P3 z% y) V* ]8 x6 Qinput mcasp_aclkx,3 l! y: o g; w3 B5 y; C: W
input axr0,* W8 `, Q4 }( t& B& P' A& x2 ?
3 [$ G$ G/ E/ g, L. C* G# Boutput mcasp_afsr,
) |9 M% p- o; Z' Y/ Xoutput mcasp_ahclkr,
3 R$ F/ _( I' v9 |* J3 n% L \0 @( @output mcasp_aclkr,7 @/ m$ W8 ^9 r& K" R
output axr1,
7 ]* r. U* k; z: ]( W assign mcasp_afsr = mcasp_afsx;) X ?! n6 B/ W- E. J4 y
assign mcasp_aclkr = mcasp_aclkx;
; s1 X; E5 Q( oassign mcasp_ahclkr = mcasp_ahclkx;& @, @6 {6 P, P
assign axr1 = axr0; : }2 l% O8 H, u6 n1 Y% N# X! v
9 C0 H$ s: r% s
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ; u- q& S& c+ Y* O6 t0 W
static void McASPI2SConfigure(void)# e* b# K1 H- l( h5 y1 T2 j
{
: O- }6 X% i$ R' s6 y$ K0 F/ d0 E8 d/ I) kMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
( g- G: { r% o9 C* F2 hMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */% u. R/ x" I& K! @
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 U7 v8 p1 ]5 f8 C3 a
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */+ a! A0 T" x; H6 d( g% c
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& a( ~1 t* H1 g; R
MCASP_RX_MODE_DMA);
" ?* q; |# ^; x, k V1 e- C6 _McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ E' ^/ p1 R, N6 cMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. J+ l% q3 l- Q- Q* h: G# CMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; g( e m `1 V/ P8 PMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" ?/ L; e& u x( [$ w' C' d! h
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ ^) U( O. r" ?MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 F3 T+ S! x8 T
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 o6 ~. W! V& A/ ]" e# S8 SMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 9 a; r. S2 x. _3 c/ e- Q" ?! t0 C# _. C
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ V% [0 X1 i9 c4 [7 X
0x00, 0xFF); /* configure the clock for transmitter */: Y" ^2 p. w6 s1 ^ w
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 v* o! D5 Q: y
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, i1 U r5 k* q- |McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 ?/ N* {! y3 H, B$ G# w0 O9 ]7 Y0 a. t
0x00, 0xFF);- g2 a. T: L, z
4 ^# X" P! k' `; A( o6 C3 e/* Enable synchronization of RX and TX sections */ 7 x+ U" Y6 y0 @1 T7 c s& `# R. F
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. Z3 h6 @& J5 e- z. W& ZMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- w( [5 a+ N- \- G5 V3 pMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*3 v; _& ~* T+ R/ \6 Q
** Set the serializers, Currently only one serializer is set as4 b7 K$ g6 w% r0 W7 [+ s
** transmitter and one serializer as receiver.( g/ A/ Y* E$ \; S+ P4 \4 J
*/2 S- v1 _4 t% F1 U
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" M5 d! I: x* P( D! o8 E, t) ? _
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
1 H$ a/ i0 |5 x, t** Configure the McASP pins
+ }+ E: y- a, p1 u5 e$ G7 u** Input - Frame Sync, Clock and Serializer Rx5 k: b" Z/ y( ~7 h6 S( K
** Output - Serializer Tx is connected to the input of the codec ?, w6 h* Z# L9 k) V6 D+ Y
*/
# ~: B; ?3 x! a9 ~8 KMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 T5 B9 T& Y# L9 X! q" p. z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& d2 W8 v) o! P, s7 U# X+ }& ^
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 f7 q( z1 M1 ^+ Q! {$ n| MCASP_PIN_ACLKX7 _; w9 v, k% z6 z' f1 ?
| MCASP_PIN_AHCLKX
" p5 l) Y+ Q+ m: ]* S5 b3 T| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */; c0 v# \ M# W5 X
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! j. F' o8 u7 m1 D: D
| MCASP_TX_CLKFAIL 8 e* L( r$ K2 S2 L v0 L* [
| MCASP_TX_SYNCERROR
& n D) p l7 w v1 I$ Z3 R( b| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % Q, r3 G& w8 @9 d( }
| MCASP_RX_CLKFAIL
3 }4 {$ ?2 n! g i| MCASP_RX_SYNCERROR
5 P' e5 X; c; x/ K3 P| MCASP_RX_OVERRUN);" i$ s$ X g+ x% z: B/ a
} static void I2SDataTxRxActivate(void)
' ]. \/ Q8 x% q1 p{4 v& H1 c1 H9 U$ ~' O: W* V
/* Start the clocks */( N( i/ y! v% ~ K5 Z
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- c7 ~2 i, U: IMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
! ]0 F9 d$ v* J+ K2 U4 lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: n# `% D5 L# b
EDMA3_TRIG_MODE_EVENT);6 }( h6 m, |6 i$ P& V
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
: K+ i2 t% ?+ ~EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* B- p/ i1 ~2 T1 `3 ~6 j5 VMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
7 F* f) s( d! p3 }" D! GMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) b) F! H9 A, m3 W# c0 Q
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ d. O( M2 C0 J+ q: R2 _" @
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 d# v9 b$ ~/ x/ ?1 X' @0 z p
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) [1 P+ [4 j/ _2 w}
& p; o4 K' I) q# ?* x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. . W$ D5 L6 Q% t1 \8 k, I
|