|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,; o+ |5 E$ }/ k+ Y5 J
input mcasp_ahclkx,
9 |5 ^/ A2 ~" j2 b& { \input mcasp_aclkx,5 \2 C. t9 e+ Q! e# ?1 J$ Y& L
input axr0,
. F* K3 K: T+ b( N+ j: L9 G o' n- A5 o$ i& H& r2 r
output mcasp_afsr,* Y [) a' p' }$ F
output mcasp_ahclkr,% X/ d8 h) p( F
output mcasp_aclkr,: C( v& R" M# \/ b \
output axr1,
( q( M2 j; ^. e0 W! g- {7 [ assign mcasp_afsr = mcasp_afsx;
* f. k5 E. v3 m4 dassign mcasp_aclkr = mcasp_aclkx;# R# }0 I) N! e6 Z3 v, o
assign mcasp_ahclkr = mcasp_ahclkx;; c$ _" N$ M$ u: U
assign axr1 = axr0; 9 e6 N! c( W+ f- ^
3 X. G: [3 H) m在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
2 o0 U ^: n/ Y3 }# \* z4 Ustatic void McASPI2SConfigure(void)
. {6 ?: e) w1 F7 u' _( J9 b{- X9 E, n4 }2 U& j% P S7 T1 x
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 q# d$ ~6 c! m& pMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */9 R0 S5 e' U" r0 }3 d2 d2 h7 L" V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* T) C( z1 m) `. OMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
8 ~: z$ h3 r6 @, ?McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 b# I6 S$ w) `9 { y5 d8 y
MCASP_RX_MODE_DMA);9 a! k( I) S/ |# M
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ {9 q# R- k7 [2 J4 _! @! @8 H& c: LMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 j5 ^" S' z+ W+ U6 d
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! H+ {: p. Q1 G/ Q; M( d
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. x) O- h$ o" z) w/ A6 TMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 l; c1 \' d1 t
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 ^' C- y9 O" M7 s
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, V' g9 i7 K0 T
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ ]) W9 T) f: f% L ~McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
7 r& M( {6 g5 U# H- |# h: i0x00, 0xFF); /* configure the clock for transmitter */
. s% y4 b, [) Q) tMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# N- o* J( S% j) J; N
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 7 h) ~+ A) b. @4 z5 [
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: x, Z/ S7 i( ~6 V0 I
0x00, 0xFF);
' E/ D+ E5 I3 h {6 F0 r. C
$ E6 l+ {# ~3 o0 M1 F/* Enable synchronization of RX and TX sections */ 7 _6 @* @ S: `- Z* h* F
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
# G3 V. ~$ s- x" T: g8 ] Q" UMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. H) s* Y) Y( Z- uMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*( C1 k: B$ e3 i% S6 V! X
** Set the serializers, Currently only one serializer is set as4 j/ f1 L4 t. d& A4 ]- k
** transmitter and one serializer as receiver.: c, L, \6 F/ f8 B
*/1 |& r" b# f" ] q( V4 a1 g' s! U+ K
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& a, K& i# ]3 ]! |8 v2 g
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* E) ~/ j5 s1 F) Q u6 Z** Configure the McASP pins ; n$ H% z7 f3 g, E7 b0 }# U/ ?
** Input - Frame Sync, Clock and Serializer Rx9 ?* G/ [4 O5 I$ a [
** Output - Serializer Tx is connected to the input of the codec
1 H5 M5 z0 M+ J4 O3 u*/
& s: @ N1 z" T, |5 ~& JMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);3 M* L% S( s! ^5 ^
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' \( r; S. I! o1 ^ Z. }8 q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
, `* ` g' O! c$ U2 \. \| MCASP_PIN_ACLKX
) g1 ^( n- |: D: m, B; Q! ~| MCASP_PIN_AHCLKX/ i' b4 G8 l- |
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# w2 O0 z! S/ o, R aMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 2 l1 s2 z/ }8 H
| MCASP_TX_CLKFAIL
9 ^: ~1 C. U9 U2 g' K1 a0 L| MCASP_TX_SYNCERROR
6 V" G7 u) ?* n$ j* F6 O| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR + {& i- b, I5 y( P
| MCASP_RX_CLKFAIL7 \* O( v$ z! ~
| MCASP_RX_SYNCERROR + w6 c; P8 ~3 r. O3 a
| MCASP_RX_OVERRUN);' h$ W4 t" @' a7 Z: r$ o
} static void I2SDataTxRxActivate(void), T. U4 E* U) b5 P
{
1 b( \& T/ X$ g3 \2 w' S, [ C. S/* Start the clocks */
( ^* W4 ~5 X5 O: B: m0 SMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) i/ N2 f9 I% SMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
5 g; V2 A L: p( ^. W8 |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 e( M! U! }" KEDMA3_TRIG_MODE_EVENT);
! w& Y- O+ l$ rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / y+ z' w2 j+ |
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
* F) C, r! o# |; g9 h6 @' t3 x% dMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
0 X4 N. F0 P' \* p. p4 NMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
- r0 A0 S b" z- N4 wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */2 P9 o+ G* Z# s' ?0 V' F' A
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! m" N" V/ j# S& w( N. R' jMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 T! R1 b2 V# `1 u' ^, O
}
( E" y7 @$ C8 ]- W8 o9 P- j/ v0 T" l请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 2 }0 t$ H) n+ \2 i, d
|