|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
0 \0 c' F7 M) _1 _input mcasp_ahclkx,+ H+ K- x: [ m1 z- K
input mcasp_aclkx,4 g( _; n, w4 }8 n
input axr0,2 t4 N9 B; k L+ ~, r( L& R
5 ^$ `; l' p" A3 G2 F; L
output mcasp_afsr,; ]9 N" N# c, n. z3 g1 I5 N `
output mcasp_ahclkr,* L; ~, h# z: |8 Y8 q1 \
output mcasp_aclkr,
( w- h. j' T9 V4 X/ ] _output axr1,1 Q+ _* m3 m& K* g4 o' {& I9 x Q
assign mcasp_afsr = mcasp_afsx;! s5 ?& z; j8 [: \8 p1 }
assign mcasp_aclkr = mcasp_aclkx;6 K1 F* e: D- v" B6 g- w' ^
assign mcasp_ahclkr = mcasp_ahclkx;7 a2 f2 `+ G. Q' i: g
assign axr1 = axr0; + L3 o- R- G" c$ a
# f. p i u1 Y/ }% r, v在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ! [% ]+ ]0 e1 N2 G, O8 v% o: f
static void McASPI2SConfigure(void)$ C) y# c9 I9 Q- i' u
{
9 Y& r; K3 x: P/ `McASPRxReset(SOC_MCASP_0_CTRL_REGS);; O# U" y0 s. @: {
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- n: b. h- H" A+ t
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);5 @3 o, Q: H$ v$ g: R# K# a
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# h4 g! Z1 d( u+ E4 _' N
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* x" [0 }! h3 O! B! T0 P% y9 V7 SMCASP_RX_MODE_DMA);7 b1 V' j. u9 B0 L' }4 Z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ i/ w9 P# c7 @3 x6 V" m+ c( ~MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 _; E! r0 G9 L Q) ?( A2 j1 {
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! t- `. z# ~8 x# X
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# S; `) w6 n7 e0 M. J2 }McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- c c' [+ o$ z2 BMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ F/ x4 h, T, K- _' k G O0 D
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- T1 i7 I i! |/ S" K* T5 TMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 C! n1 r4 V. C( y- b$ ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 B7 z- L0 S. c" b c# c0x00, 0xFF); /* configure the clock for transmitter */3 a+ ^+ m( B1 v' J" }. u% u
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);- S- c3 b* B u; X# p
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
h" D% x& r! H, u6 g0 B4 VMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' I' T/ T# F6 X1 m U4 P. C0x00, 0xFF);
+ [4 m$ N W- h1 u' A: [- D$ W; u! t, U8 k
/* Enable synchronization of RX and TX sections */ 8 Z0 p; U- W, i* r, B$ n8 P( n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) r S. ^5 b% n4 LMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 N v8 {, j) a- f7 l0 Z) h5 d( IMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*+ m1 S$ [# C. o/ Z' `; y. K
** Set the serializers, Currently only one serializer is set as. u! D" i0 z }; j" V
** transmitter and one serializer as receiver.8 V; t; g* D; K, [+ k
*/
# R- b) u) }+ p, _% R j7 H ], ?2 ^, KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ W$ B0 S! k" ^; jMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*6 p5 O# b- J8 {4 _! B
** Configure the McASP pins # S5 ?6 E$ V; k4 a. T/ C
** Input - Frame Sync, Clock and Serializer Rx
6 c4 t1 ~" j' M1 A$ v** Output - Serializer Tx is connected to the input of the codec
( P' C+ E+ L) ~6 t*/. B# \7 x6 u; ^6 D4 a5 D
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# v/ I5 ^& f- m5 C+ s, eMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));. L2 \& m+ E( x2 w
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' b# g ]2 f1 o7 M5 n: P& g6 ~! P
| MCASP_PIN_ACLKX
& Q' c; s. z e; p| MCASP_PIN_AHCLKX: @0 [) Z! U b: [3 b
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */% w$ b2 d% W( k2 S7 @' v$ b
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR - A: Z' o+ K- e7 L5 W. J
| MCASP_TX_CLKFAIL ' D5 l" y' H1 F0 M) h; c1 y
| MCASP_TX_SYNCERROR* c0 ]5 j |& A4 a9 E/ k& B4 x
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 P& l6 z/ R) |5 _" Y V| MCASP_RX_CLKFAIL. f. r- a1 o u1 {
| MCASP_RX_SYNCERROR ) y0 K" ?# d* V9 @& \ \
| MCASP_RX_OVERRUN);
9 M! a9 h5 O- Q; N} static void I2SDataTxRxActivate(void)3 J" n. B" h) m, Y8 y, u1 z
{
5 ?7 D2 {! [, H$ j3 r4 c# `9 R/* Start the clocks */
2 V. l2 C( |& ?3 NMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 P" {* C4 p) h5 pMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 M& V9 i5 ^2 o; jEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' e8 X" r# t: OEDMA3_TRIG_MODE_EVENT);" h" K% F" @! N- \1 E" r+ b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 O' f5 Q$ Q- Q0 d0 z, W
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
R: u9 O* S: ~9 S2 VMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 S' ~- b8 n; K5 F r) KMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ q+ P! @7 H$ N2 x* nwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */' `" U$ d5 p" T3 M0 k
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 r1 l4 u, x2 l8 K2 HMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);' S, }1 J9 `; a* S7 n5 R( j
} 4 ]. ]6 O# G( p2 K
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. * b" s y, w* ?6 h1 e/ G5 G; x
|