|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
/ N9 E, k# s0 p& U: V" d binput mcasp_ahclkx,, V4 |9 }3 h2 v7 ^# z3 e7 }' `6 {
input mcasp_aclkx,
( O' E( ]' o6 R5 e7 e1 a/ Oinput axr0,
2 ]* y6 c; H( j: x
& e2 L$ `1 g5 F* z1 g8 _output mcasp_afsr,. B% e5 T8 S3 }1 c; m7 e/ j3 N, v
output mcasp_ahclkr,
7 X. M, X+ d. F; k' [output mcasp_aclkr," R! y9 k1 U: _9 N
output axr1,
& w0 s1 ]' F* k& d3 l assign mcasp_afsr = mcasp_afsx;
H9 U3 D" ]! H# Z& N# j& V: q4 z& rassign mcasp_aclkr = mcasp_aclkx;) T5 v, M) X8 P' b
assign mcasp_ahclkr = mcasp_ahclkx;. Y( E* z7 r+ \$ v+ J2 _/ b4 \0 E
assign axr1 = axr0;
) |' ~ P) O, p' H
# G: Z/ B1 Y* `' }6 h0 [/ F1 b3 ~( W在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 5 w- A7 ^% h9 Y; n# T
static void McASPI2SConfigure(void)) f4 [; M0 f J6 \
{
4 b8 T2 O8 c( A/ Z9 w& S/ D6 zMcASPRxReset(SOC_MCASP_0_CTRL_REGS);6 j/ P# z) `3 T! v
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */) K4 b* t" s& W2 ]
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' N; H3 z( ^7 _5 v/ n1 K) TMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */5 ?, w; R$ A2 Y2 e8 v9 O8 N
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" R& j8 q! x: sMCASP_RX_MODE_DMA);" v1 W* p& ^, m2 ~: I- g2 l/ y
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 B. X) l5 J9 ]$ _% IMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 r. L4 F1 j- [* H1 L3 ~
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + J7 }2 Y+ J6 y2 W" W; Y
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! X' N a2 S' R3 u, E' qMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
p) E% ?7 |2 G$ z0 gMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
_4 {! J# F1 I: m+ ^0 S4 xMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) v2 d' ]) h3 q/ zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
) u) L/ O. k' _% A; vMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 A9 O4 g- _, z. k6 |8 Q0x00, 0xFF); /* configure the clock for transmitter */
/ K3 h% E4 h( g8 t: h9 PMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 V5 q8 V% w, wMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # @5 H+ R0 G5 |
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) N$ {& @" n7 L% i0 N U0x00, 0xFF);
# {7 g4 ]! }: s W0 y$ W' N0 ^/ Z+ A& N j' O
/* Enable synchronization of RX and TX sections */ # G. q; P" N: j. a9 N
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ x, b& s4 Q+ sMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 ~- M [( D6 f ]' h; c8 S/ R/ u0 u
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
+ b; V3 ^7 |$ M ]0 i** Set the serializers, Currently only one serializer is set as
' ]4 o$ |- ~3 w# |. Q** transmitter and one serializer as receiver.
2 P1 V' l: F4 A: y*/ M7 K5 D3 P" E% ~6 P; }5 ~; c
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ ?# c, f: y2 O+ W
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 G! P3 N8 H4 {3 ~1 j$ N Q
** Configure the McASP pins
3 o, a: Z/ b; n! S; t) J5 ~** Input - Frame Sync, Clock and Serializer Rx
0 Y, D, u! R. |# O. z( z9 F** Output - Serializer Tx is connected to the input of the codec
1 V1 W$ s# X, h# X' h*/9 m, d4 R- X, a3 F3 t& m) E# |
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);2 u. o1 a0 v/ z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));6 y3 _4 _( l1 r" u. S; o
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( s3 X9 x, U Q, b
| MCASP_PIN_ACLKX) b% ~$ c' Y/ M$ Z$ Q& C$ r+ y* `
| MCASP_PIN_AHCLKX$ o: j, D; [' ^2 N4 _3 y
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
) a8 m- f9 W1 UMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! ]2 @! e7 r( L7 G1 U: I: V* e
| MCASP_TX_CLKFAIL 7 j' z7 R( E Q
| MCASP_TX_SYNCERROR
; Q- e) b5 Q- w" H+ l9 }| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
; s6 @$ W$ l& ^' R# o- h7 B' m9 Y& U| MCASP_RX_CLKFAIL
A0 ~ z4 k1 q| MCASP_RX_SYNCERROR % H& y* j# N, ^" u1 \
| MCASP_RX_OVERRUN);# b9 g0 b- `8 O1 o( c" x; i4 V
} static void I2SDataTxRxActivate(void)* T3 J" }6 T$ Y; L% @; \ a0 X
{
8 \! h+ y+ s; |/* Start the clocks */% G' g: v' w! ?( _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 L- O& c8 h- D7 c! S2 }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */% G! ^0 D+ w: g% A
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 y+ k# A% Q/ d; G
EDMA3_TRIG_MODE_EVENT);
; A( d9 x4 z- U. eEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - @. l0 S! V" X7 S; i% }6 [/ w
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
: O [& O" I- a5 [McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 V. e2 `0 ]" c ZMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
1 i& a+ E* ?( N1 n3 f! Wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
P- C" P, X+ CMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
- z3 m2 _* D# |, s" RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 J4 I4 g% {6 c2 ?) S
} % ]3 j$ x: b) `2 C- u
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ c& U, Z& B- c5 t; q0 r |