|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 r% [/ D( {! f5 R! J
input mcasp_ahclkx,( y. H. w8 c8 i2 W! s
input mcasp_aclkx,: A4 g' f( P! Q# K7 e4 f4 ?/ b" `
input axr0,
) s/ U' @( w4 U6 q6 b3 @: q% y+ G' r U; [ U6 F4 s0 k
output mcasp_afsr,4 ?+ O& W0 `4 g4 L$ A7 X/ o
output mcasp_ahclkr,$ B) M3 F) K) _4 w7 E
output mcasp_aclkr,
$ K( N# p% W4 q3 h5 U2 aoutput axr1,
/ }( a2 g! \ v1 a0 u! i" f0 T. F assign mcasp_afsr = mcasp_afsx;, x" F% l4 a F* Y2 a
assign mcasp_aclkr = mcasp_aclkx;( z! }& W: j2 A1 ~- W9 c
assign mcasp_ahclkr = mcasp_ahclkx;
; y/ m6 n7 @1 `: u, Gassign axr1 = axr0;
$ D4 K0 E0 f2 ^# `0 d) x9 Y/ _6 u& t6 i6 v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % v: i" r4 O7 r& K- I" |' R4 z
static void McASPI2SConfigure(void)
( ~+ n2 j% _9 R/ M4 Y{/ i$ L4 e# F4 k) D" u7 j) d' v4 J
McASPRxReset(SOC_MCASP_0_CTRL_REGS);3 u( s' I+ t/ X* [3 `8 I: j* J, H: y
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
5 T. m: q9 F: P5 g' w0 s+ _McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
+ P) U, O5 `) E$ f8 w; u' vMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
( [3 L/ X1 Y& ^ ?6 A a) d! Z( PMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 ?; m& Y( H/ D/ Y
MCASP_RX_MODE_DMA);6 Q- K" |. S* a7 b
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 a' j- u) _& V; mMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; n# a& r% f7 @" }McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & i5 b5 @( O1 n0 o
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 d+ U T4 m* ?5 {8 g3 i: g* M) [
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * U( g' o, T+ |. ?0 F
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: P! l3 h/ K/ Y6 v+ N
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& N% X3 n! s9 D1 a$ T) Y" G, {
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 L& ]: n1 b6 ZMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 h; K+ w7 y' q* I8 K. z$ ^& w
0x00, 0xFF); /* configure the clock for transmitter */6 ]9 J, R; T: Q. }; p7 B
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
w* Z8 a/ y) A5 t( |- TMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( r+ h2 Q! P3 q: U9 @4 j6 H7 ]
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
3 W( T! ^+ ~& J+ w1 m. V0x00, 0xFF);
4 K0 ^+ `! b+ Z/ I
2 x6 T' U5 |( X8 e/* Enable synchronization of RX and TX sections */ ; z( \( D" w9 I3 E$ S4 P o
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */# j3 B$ b$ j; ~" K( s" p* Z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! s4 f3 E. ~ C( F2 i( o* _. f6 [! b
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*$ G3 @# t; P$ X- L7 ^
** Set the serializers, Currently only one serializer is set as
& l9 f- t0 E+ ^- D3 e9 y4 H** transmitter and one serializer as receiver.
* S8 B! V1 M/ } ?4 ^ T( n1 c*/
/ s" R9 S5 M3 [McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 R9 d2 [2 \$ }7 R# T* F' q, h7 w, `& YMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
# Z$ d/ a$ W+ ]# ]% j) _- o7 S** Configure the McASP pins
# o6 ?# X4 J4 \/ ^# U** Input - Frame Sync, Clock and Serializer Rx9 N" ~; Q$ J& j( L* W( f( l5 U s
** Output - Serializer Tx is connected to the input of the codec 2 { ~8 W% R3 F5 ~0 _
*/5 n$ u& ]9 _' P, P+ H
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
J; c d" s" p6 p6 b$ h @& tMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); e$ k' s, j# t( @
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX: Z5 y/ @2 y! _4 t. u) n% V/ T
| MCASP_PIN_ACLKX
: ^9 G/ H" e( N( _4 a* o| MCASP_PIN_AHCLKX
, z9 w7 }# x/ x6 [, ]| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
) k2 j7 O3 K8 J7 MMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, J6 Y# r* R6 E/ d| MCASP_TX_CLKFAIL 6 j! v E* v; D! `% ~
| MCASP_TX_SYNCERROR' |* S/ V2 S; s7 O& c T
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 A* e$ B/ j" f) U( R% M, }2 N) ^| MCASP_RX_CLKFAIL9 v! ^0 C, ~# k: f% Y" _+ F6 h
| MCASP_RX_SYNCERROR
* n& q, L+ x% S, `! o| MCASP_RX_OVERRUN);
# S! E* X; K5 c* C/ x" B3 r} static void I2SDataTxRxActivate(void)
4 D' f% c) o3 V- {+ ^0 q r{1 K m! p* h/ o! I2 i
/* Start the clocks */
! v- a; Z( ^0 u T7 h) M0 MMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);! X: `$ T- g( O1 ?! C/ F4 `2 y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( m$ m+ ]8 _ Y) I$ n
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! q* N7 D9 V6 s2 d
EDMA3_TRIG_MODE_EVENT);8 h1 S3 a" a' x' S0 H- v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, . J( N: Y+ U1 H: h
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
! C, `# f/ u& |8 x! \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ p: k/ Q' U# L/ e) V
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 p# s1 K9 k/ Q/ v# r( ?0 y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */% y, B( W2 {3 X
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 {2 P7 Q& {+ E2 C) Z$ hMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);; j) v9 O( [: M1 ?* e
}
' c2 P2 F1 U3 e" k' V' \ N请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. - i; T3 E. |" N: }; [
|