|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,% |+ J: j' f- P7 K
input mcasp_ahclkx,/ [1 r' y' b1 N3 C t( {/ e4 q! _
input mcasp_aclkx,$ \( ^ e( M' V) x* m5 `
input axr0,
% |" u& Y; D# w5 e1 Z/ p/ X* |7 j. u# g x9 l/ [/ Y4 F V
output mcasp_afsr,4 h, @# A4 I) M# I) b. m& Y+ G8 k
output mcasp_ahclkr,0 A) f, @! a% Y8 N2 v
output mcasp_aclkr,/ h+ q# A) e4 z
output axr1,( F/ T# t& W% Q
assign mcasp_afsr = mcasp_afsx;
3 j2 a6 O9 F$ ], Q% b- q2 @' e( Hassign mcasp_aclkr = mcasp_aclkx;+ x, ]7 I7 r9 N& ]
assign mcasp_ahclkr = mcasp_ahclkx;
- [' R- ^+ z, Y) X) w) Cassign axr1 = axr0; . J) K% c% F0 ^+ Z* o
- [: j- y1 ?4 K. K: C在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
. J: \" k4 z* T/ o( Wstatic void McASPI2SConfigure(void)
D7 E6 H) Y5 w9 h{
5 @# s; r Z v. X+ fMcASPRxReset(SOC_MCASP_0_CTRL_REGS);' {1 X/ K& ]1 Z
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */! ~' r* U/ i0 T3 x$ F# N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ D0 A7 ]" m. V
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
1 _; j- U1 ^( N! `+ ^& ?+ W6 gMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( f8 i6 p5 f4 o: ~MCASP_RX_MODE_DMA);
+ J, M' \5 j# `1 y0 I i' OMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 {/ n! K9 \/ w KMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */( L! L9 O; k, ]0 B. w0 s+ A
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, B4 h0 ?* A0 H$ J1 W0 J' c
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: h" r& a) Z" D' V0 iMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' _5 J5 }- l4 ]$ FMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */! T6 d8 w) } }7 u5 v
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" E9 J9 G: g W+ T; k I
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); h1 z1 n5 C3 D0 Y3 m
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ Q o, e- s* i0x00, 0xFF); /* configure the clock for transmitter */
2 e5 V T o) m) V1 b0 m0 VMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 x+ B! ?3 a4 J! ^/ V
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 [! p# ~- W: R+ D0 |
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,/ p4 N7 J6 S1 `+ d
0x00, 0xFF);
1 |% h- @+ `% G+ d2 \: y
8 t& h1 s8 g! Y$ O; V$ p/* Enable synchronization of RX and TX sections */
3 ^6 a6 f+ s: [McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
: l, O# m+ X- p# j8 bMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
$ U7 y3 q2 K0 h& X6 [, x, H" xMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /** f2 b7 x! }" s: \
** Set the serializers, Currently only one serializer is set as% s+ x4 g7 T$ e% a4 u
** transmitter and one serializer as receiver.
+ A5 L$ G5 A: y2 X, u*/! O, _1 j% o7 I9 I) V
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 c1 n0 E j6 @1 ]5 OMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /* T2 i: c- J" ]7 f+ S) n* N, t
** Configure the McASP pins # O+ [* W: O7 J4 o1 ]
** Input - Frame Sync, Clock and Serializer Rx
+ C$ w2 B4 ?. I5 W) P** Output - Serializer Tx is connected to the input of the codec
7 j% W; t. x9 K' M g8 P# b8 Q*/! c9 g1 C3 h# ~$ \) s& J! i" L- t
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
U; D7 `7 o0 v, P. j* gMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ r, m& @- O: w1 k3 g; @! p
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
L# c& u" ] Y0 Y& g5 M. o| MCASP_PIN_ACLKX
$ _ a5 f1 {7 ^" \9 v5 J| MCASP_PIN_AHCLKX5 _: o# v/ s, x" G: S& Y
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
3 b9 T4 @( u& f, v" c3 B: ^McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( j& ]$ m, ~/ w) w& y4 N| MCASP_TX_CLKFAIL
$ x! J6 u7 [, @. ]/ |' i| MCASP_TX_SYNCERROR0 s/ _3 ]* r! t2 F9 z! ?& ]
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " z' k, d7 M/ r! m- e l0 h
| MCASP_RX_CLKFAIL3 T' [( S9 x5 k: l" U. o+ [+ w: D
| MCASP_RX_SYNCERROR
# h6 E- e S* }; P& [$ o. W$ _4 E8 {| MCASP_RX_OVERRUN);
% |: \0 Y' a6 o0 p4 Y/ [& g} static void I2SDataTxRxActivate(void)4 N2 z3 Y6 }1 \, ^. m# `/ W
{. f6 m8 T! V. D: ?5 [
/* Start the clocks */# B" H' \1 F! R" w' E! ^$ s& K& {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ M6 e9 s( P" @4 s
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
- C4 w) {$ A" Y2 }% DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% w; s; E2 g9 M5 T% bEDMA3_TRIG_MODE_EVENT);. R1 R( D; L$ t( C' Z1 H4 q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - N7 f" L3 h2 [* m& }
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
8 C7 Y$ Y* A/ mMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- s, d: h8 q$ u3 h% ^3 X7 b }; O
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */3 r4 G% P5 i! k$ E& Z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */ y6 L, L# C( J2 Q* R+ P0 A
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 A! r* z. V; L+ B2 DMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);. g3 b- E5 G0 [. M* ^8 ^/ i
} ; C4 F8 w$ h$ S9 z0 X5 O# c+ j' z; U
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 l. I+ I# v4 P0 C" g |