|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, a! m* p6 Z$ i
input mcasp_ahclkx,
3 _4 p; Q6 x2 L( V3 ~input mcasp_aclkx,
+ ^) p3 b: P9 S8 iinput axr0,
& s0 t o2 w8 o$ v
2 X3 P n1 e, v5 n9 H( toutput mcasp_afsr,+ I3 N0 U H7 h' K5 g( U- B9 K
output mcasp_ahclkr,5 a+ x. d0 D+ j, _9 g+ w/ a
output mcasp_aclkr,1 F; c2 O3 D. F4 P. ]
output axr1,
) k: i8 N) \9 y6 F assign mcasp_afsr = mcasp_afsx;
" q) i/ d. h2 j; ?2 ~1 eassign mcasp_aclkr = mcasp_aclkx;9 s& I; ?( B& y1 S7 i
assign mcasp_ahclkr = mcasp_ahclkx;
2 D, k" r! z& [' f2 J( D, d9 x9 g2 hassign axr1 = axr0;
, a* D. U( x+ g0 V: Y9 b' K; G/ U& v0 x# _9 o5 D2 X7 s$ f
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 H" Y1 ]6 j, h- O1 \
static void McASPI2SConfigure(void)
# O9 {, L! n2 D- i# s5 i# M" L8 X{
- K1 a' |, `5 H; tMcASPRxReset(SOC_MCASP_0_CTRL_REGS);9 W; {3 z7 G* k$ M8 Z8 Y
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
- t& h1 y- E0 k0 KMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
. I# W* {+ t* f! e8 UMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 @% ^- n8 u9 k
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- }. t. N2 b8 p L& g; G" I
MCASP_RX_MODE_DMA);
: ?! x4 x5 W8 @& zMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 M2 n- P. H9 _# `MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */7 i. c: b; g6 j8 C- ?
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. Z0 H! m- H7 _ I) M& vMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. `- v" T" O; q; e- }! @8 n
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: \: _8 C }: WMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 f5 n; h2 e n: @: Y: V) x/ U& g
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' g8 T4 b$ o5 B- a/ ZMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 N2 o* E/ t! n& ^7 ~9 O! gMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ o" _( b* H0 _# V" X
0x00, 0xFF); /* configure the clock for transmitter */7 O3 O# U" [. k& ~ \& C
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
) \2 m; M. O) f4 h8 H+ VMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 K$ J$ p( x' c7 a* r) W
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. c' u$ l2 I9 j; T$ |3 ^0x00, 0xFF);
7 c- d5 k% E# O4 x+ l9 z% V2 [ V u$ B j8 v
/* Enable synchronization of RX and TX sections */ 5 A: ?' Y$ s& _' U: n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) j+ x9 L7 \% gMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% R% e5 m4 m$ J
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
5 `9 K- W3 i8 A- O) [3 Q** Set the serializers, Currently only one serializer is set as- R% y! T! f% }5 ~
** transmitter and one serializer as receiver.
q$ t5 r' X6 A+ m, ]0 s+ s*/' @" ^. k: v' A; T1 H+ X' O1 o, I
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 ~4 D M7 g! R+ hMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 F* P7 J# w- w0 B, n** Configure the McASP pins 3 y8 H2 |; ^; d4 }
** Input - Frame Sync, Clock and Serializer Rx
, E' a2 w* r( {% Y$ {9 T5 m** Output - Serializer Tx is connected to the input of the codec
: \) h, f4 x' N*/: {9 {$ Z( S& v0 y- b8 p
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- b- @2 O; b* _2 D; f' N+ T
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ k- w- _$ @7 K4 H/ I" v" p, n4 J3 nMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# W* }/ U! |1 J" O E$ C
| MCASP_PIN_ACLKX
' G' R9 a0 _* r' O& @( @; q| MCASP_PIN_AHCLKX8 l! S+ t$ f- J$ ]* v3 o2 ^
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ [1 K& h" N- t% j
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / }: F; A( \4 K) f$ i& t; r' s( K
| MCASP_TX_CLKFAIL
3 \' y3 l' ~. B0 o# _( ?5 x| MCASP_TX_SYNCERROR
: j+ E8 r0 ?+ L! d( f2 f| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR + H$ P" E0 V8 t" C6 E9 S
| MCASP_RX_CLKFAIL
# C6 Z b. f z/ |& r. E; j$ c2 `" q9 M X| MCASP_RX_SYNCERROR
/ B! U4 H# R3 r L, X || MCASP_RX_OVERRUN);) q3 _, j, H1 _. C4 f$ K s
} static void I2SDataTxRxActivate(void), K3 p5 d. F7 V3 y
{
2 }' c7 v+ }8 H x/ X7 b/* Start the clocks */
5 }: ]" w4 }, T e* fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# Q1 J& p' t7 s: E3 X- o
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */+ O: w' j/ K) Z$ U. o! ]( o9 Y: A4 L
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* h ~: w! M3 E! Z( sEDMA3_TRIG_MODE_EVENT);3 p4 t0 z+ \) q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 l e T2 z0 {5 _1 \5 I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */, d5 u: e8 N1 m W9 t: u% G
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ `. P Q2 g6 H6 O
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero *// ]$ l+ S" C4 D* @/ N2 x
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */* V7 e( u4 h; e) d) J0 S
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
" G5 g( N& |; G& c! xMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% s* F8 k4 W6 i6 H0 X% i) {1 h9 n
}
) ^7 e# `! C( `# A1 e4 Y请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. - `3 N# w8 m e$ d9 h4 e5 z
|