|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
1 q0 u) h) H) R# a8 }3 w6 t: Cinput mcasp_ahclkx,2 _( c; Y* {. j1 Z; }9 K+ B2 k
input mcasp_aclkx,
+ W' N7 K3 B. _$ j, E- W) S! winput axr0,4 ]" u% h3 s2 N) {
: g7 X* M: L, ^: `output mcasp_afsr,
( Y0 q9 l# [4 t3 k$ @output mcasp_ahclkr,
$ j& e) q$ ]% m3 M' o0 O* Y" t$ Loutput mcasp_aclkr,; J8 _% ^8 \$ f& N/ T
output axr1, ]- P4 q' X) `" {3 L8 V& f
assign mcasp_afsr = mcasp_afsx;5 X+ g* f v% E* g
assign mcasp_aclkr = mcasp_aclkx;
( I- f y# p$ m+ [/ }! F# I. Z- y$ u# \assign mcasp_ahclkr = mcasp_ahclkx;
2 r8 f% }+ i4 e9 G- V5 lassign axr1 = axr0;
3 B2 b+ W7 w6 v4 d% ^" |3 D' y* g6 W
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
' n( ~, V/ u) ]: g/ D% P/ ]static void McASPI2SConfigure(void)7 d5 `+ t' h0 K0 a/ R9 t9 y% H
{. J1 ]0 x# A+ ^/ g
McASPRxReset(SOC_MCASP_0_CTRL_REGS);) d4 y# f0 E# ? B( x+ t
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
; W- y" x. |/ g- D9 \9 v: r; ^McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 D+ C8 u' U. t) [( b4 s
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
; B: v2 s8 c( F/ x1 Q) CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 N1 [% i9 Q' ~6 x
MCASP_RX_MODE_DMA);8 t1 |& R9 v$ Z9 X4 t! B( ]
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 a1 @6 D) f2 A$ C$ Q' RMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 s( u" b) Q2 ?) R' eMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 h9 \/ M M/ q& R- D" q: Z' H& ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 U- H6 W' f9 t% P3 qMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; c/ e5 E, X, k' N d3 D8 n. I* tMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, e5 q: ]. h1 v& ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& [0 w4 C' @7 c/ W! m% R3 \; m! u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' m! w0 ^1 y& B' u6 v) G. C6 L5 i
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% h3 Z8 [- Z2 R0x00, 0xFF); /* configure the clock for transmitter */
3 S% s2 Z, ]) f. N6 R( j8 IMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
. g$ O- C" T, T wMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); , _% w; q9 K7 J
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 J) W' ?' o- M+ O; v
0x00, 0xFF);
+ Q$ W- \' F* c. C- x0 t0 @/ z% I5 A3 v+ Z9 C# p) l! s# n$ {9 w
/* Enable synchronization of RX and TX sections */ ; i0 m. s0 d g3 l: }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* |7 c9 w& M# K6 y! D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ g% ]) u: x( g$ j: G: h
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*3 P7 O) N8 B# F; @) {3 m
** Set the serializers, Currently only one serializer is set as4 h# e6 g/ I/ E$ x6 v
** transmitter and one serializer as receiver.
. p* \, O' G( ? i. |; @9 I*/
' s W" I2 s C6 w8 BMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: }' _# }0 w' U- k" J! I& g6 |. mMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*' x: z2 N* t) j: V+ _
** Configure the McASP pins
9 \. y, c6 S% ]. i$ _3 b** Input - Frame Sync, Clock and Serializer Rx
& A3 A1 |% w; n/ R9 o* g0 I** Output - Serializer Tx is connected to the input of the codec
5 w2 R# e. h9 e*/! f" _% V# D* |5 q3 Z
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 R6 h1 }8 `* tMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ M6 E/ K) @' {6 v0 X# _# |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 ~ l+ q9 f4 [- I- c9 x
| MCASP_PIN_ACLKX
6 E& M3 o) }2 s' L5 v: B| MCASP_PIN_AHCLKX1 K) Q* f3 F, I7 i7 v M: H% G
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
, e' z2 J; k4 k. gMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # v# E7 P! C+ z* ?9 F" P+ B
| MCASP_TX_CLKFAIL 9 [$ z3 U) l! m5 D* s9 S% @
| MCASP_TX_SYNCERROR" O( d0 {0 X+ q& v8 B3 U) e& i
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
2 W- p% K; S B# i| MCASP_RX_CLKFAIL
. m" r$ N4 _; o( Z" ~3 H% ]- ]| MCASP_RX_SYNCERROR
$ F( f# |( w1 V7 M( l: x/ Z v$ R| MCASP_RX_OVERRUN);
- V( X. E9 m' I& m' ^2 B m0 w} static void I2SDataTxRxActivate(void)
1 H) r X6 U9 L9 _3 b{
; p, I, T6 Y! c j/* Start the clocks */
7 { q# a0 g- \7 V- G0 D! R- s8 u, YMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: L9 Q+ r/ B) _0 o/ |
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */8 o" J) J& U1 g2 I4 m" ?
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,$ O9 A# ?; u7 E4 k& F: ], B: C
EDMA3_TRIG_MODE_EVENT);
. q6 J$ u. s2 G* cEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
9 i/ t( u I9 `* uEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
8 H+ P0 \; r2 L1 i" u& z! QMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 u& l$ {% H' \0 [$ f
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */# h/ `7 O5 X9 ?+ L, g' e
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
1 Y; T( J' D4 l" v3 UMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 p9 K& P8 z. M, @; p
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: D5 K* ]( g$ T0 x9 ^' x. N}
; M d) [" b/ I请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 `' Z/ a3 f- p" P; v |