|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
8 B" o" G, ~9 Z! A5 F* x' _$ y$ Hinput mcasp_ahclkx,
3 k' j0 w& \; ^! W6 Minput mcasp_aclkx,
( R* M# N- H$ N2 _# einput axr0,1 d7 z' J9 c) ]% H ]3 [
/ I4 h9 M6 s4 Y( A1 y/ I3 S
output mcasp_afsr,
. S6 V9 L0 E2 C; Eoutput mcasp_ahclkr,3 y0 y) B5 \- Z1 O9 u; [, c
output mcasp_aclkr,- b" K7 j2 \! Q6 k
output axr1,
- {/ X6 I- x! Q/ [( Y4 D7 x0 C assign mcasp_afsr = mcasp_afsx;
2 @. S" k- Q9 p8 m0 C7 m" yassign mcasp_aclkr = mcasp_aclkx;
! y j+ h5 ~; A5 K) bassign mcasp_ahclkr = mcasp_ahclkx;4 ]7 G* C6 L; X! F/ X( O: x
assign axr1 = axr0; 1 n6 d9 _2 v& k* [
4 k$ `$ ]7 M, f4 I, J$ Z1 e9 j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 c2 k [" u7 z7 x8 jstatic void McASPI2SConfigure(void)
: O4 W7 [8 o" ^& q, T{( s, X8 N8 k9 K; s" E
McASPRxReset(SOC_MCASP_0_CTRL_REGS);: |, L1 p4 S3 v$ P4 x# k" V
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */ Y! J( ^7 B# J# \8 d7 D
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; j- R$ i0 E& H2 I
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */& }# [6 {# c% k; ]7 j+ ?
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 A/ } d6 p" aMCASP_RX_MODE_DMA);
2 y0 B9 G/ D: i W! m7 i5 c: ^2 CMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 H7 ~, l0 l8 v$ l7 n7 ~6 nMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 K7 s, r! \* }: f% u+ z2 dMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 D- z$ X" @4 G6 h
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: b& I& M! u+ @2 x
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 6 Q& i" i# @, A
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */1 B; H6 o' |8 `! g- N
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. Z+ a& S- i/ u: ~! U
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . Z2 O( Q# w) m* F8 K
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& C! `! k4 \: X0x00, 0xFF); /* configure the clock for transmitter */
1 r% T2 V8 L# D8 h8 A) _) n+ vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. v& o+ C8 [ R( t4 QMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 V) M/ a3 s0 V' rMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 }/ p8 U, p1 y: H0 E5 c, G0x00, 0xFF);
$ @: A! k9 o2 G) Y5 l7 ^$ p6 Z" p2 |: [9 U" `0 p1 X
/* Enable synchronization of RX and TX sections */ $ m; F- S7 T7 O( y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
}- S9 F6 R8 }$ _( \McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);1 T- T7 q- G9 p8 a
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
8 `" x7 q5 J9 D" W% S( I/ O" o** Set the serializers, Currently only one serializer is set as
9 O% A# f7 [1 _9 c# r. Q** transmitter and one serializer as receiver.$ S5 m2 O6 w4 O2 E* q2 [+ b# C: Y
*/
. T2 |6 \! \! j' i C; bMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 }4 f: \6 z& S& Y1 }& f4 }, yMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*0 J% \# s. r6 f4 z, p7 W7 V
** Configure the McASP pins % k! J0 N" P3 E. h! b
** Input - Frame Sync, Clock and Serializer Rx
% C- |. M8 X# @0 K# [** Output - Serializer Tx is connected to the input of the codec 4 x: M; ]+ k2 i' y& j5 O# }
*/
: Z# q/ D& Y$ q- s+ @McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
4 b+ Q4 l. ]! {2 k& tMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
# G8 w. r7 x3 X2 XMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' P) p% _7 {# R, g( t' j& D
| MCASP_PIN_ACLKX- C. s( n! ~7 P" @9 o3 @
| MCASP_PIN_AHCLKX
& h; r* z6 n# P. A( U| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
& e# `( E2 V0 R) @9 Q* H; R4 tMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: b2 ]; @- R/ l. D4 ~+ j M7 X8 E| MCASP_TX_CLKFAIL
/ x6 S" v7 r8 P* { x| MCASP_TX_SYNCERROR
3 ^4 K% @% ~( q' h3 n; V| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
# G- g+ } }/ C7 s: T| MCASP_RX_CLKFAIL
# P$ m) M' f+ ^) F+ Q| MCASP_RX_SYNCERROR - D3 E, g$ ~! O! {" n1 X5 ^
| MCASP_RX_OVERRUN);; K: q& k f# X0 G/ v+ M
} static void I2SDataTxRxActivate(void)
2 g$ p" u0 A/ y( T- k/ d{ Y9 w7 W; B( ~% m; `9 Y
/* Start the clocks */
& h* X" n2 R* UMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- U7 A: |9 N% \% q; H/ E& `! S( [
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */+ s: E8 E& i) T- W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 E. k0 \5 c) W& @$ K4 {EDMA3_TRIG_MODE_EVENT);0 o! e( ~" j; Z, W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' O1 S# a0 v# N; k1 e; L" k; s, fEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
9 P1 p3 `: a) c9 b1 O8 t* hMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* \" A7 i. a. h
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ k, d# r- H2 K5 x% J# wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */) o- N9 |$ m3 w' [) r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, g3 ? Y! c0 Q+ rMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% k$ I% A& T- g' p9 V}
* U- C6 U0 `4 c" C请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ H$ ^' K% }- ^ |