|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
4 F0 x9 `0 Z/ R8 Einput mcasp_ahclkx,
3 X2 ] M6 {6 G. U- hinput mcasp_aclkx,
; q& I* ~6 C0 i! [$ n% C) a* Z) pinput axr0,
1 d1 L; U4 J, H+ C8 g$ h6 Q# V7 }1 ?& u& ~- H, q
output mcasp_afsr,# b0 z0 }7 l7 t" J
output mcasp_ahclkr,
( h. _( f. ?& doutput mcasp_aclkr,4 k$ x7 K/ p* A! n/ h
output axr1,3 P1 J; `4 m5 w6 Q4 o* ?
assign mcasp_afsr = mcasp_afsx;
5 H8 d% S9 k$ v: ]3 Bassign mcasp_aclkr = mcasp_aclkx;) A" N* S [! {9 q8 k4 q
assign mcasp_ahclkr = mcasp_ahclkx;
3 S" y3 p) |& iassign axr1 = axr0;
, s& ^0 `3 {7 W" y& g4 A. ?, ^
' w' H* S. ]0 H3 w在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 8 q) l5 S( W- N, m5 z
static void McASPI2SConfigure(void)
0 y4 C. X2 F* h3 ^' i x; N$ [! C{7 C! G" T1 E9 j4 H. ]8 x8 }
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 r+ t. T2 V0 h7 ? K8 ^McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
o; C3 k c$ ]0 u& {% GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);* f6 P: H. z% x5 C& ~
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 m" ~6 ^0 l$ B }' O9 h3 I% r
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 L; f; E, j7 H! h
MCASP_RX_MODE_DMA);
8 x7 Q. G, X& xMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, U5 T9 r* N% Y9 y7 F3 u
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
) E5 A* r# W: k* i' d: d# r( K" SMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ t# o* X' T3 OMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
9 P6 r" N" Y" O' O1 \ i7 yMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; V( ]7 p% D2 K
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- a) t* U; K% `0 Y! I
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! @( ^! D7 r' m0 p5 @6 ]# U
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& V# E: D5 q7 Q1 ]/ fMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
2 j1 r3 d. S0 c! y) i. v0x00, 0xFF); /* configure the clock for transmitter */
9 ?" f/ u/ |7 C: c, oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
6 ]1 |8 {8 }1 b. E# v' WMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
Q- m% }: R; I2 }+ ]1 c4 W6 \; QMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! T* I! F+ ?! H1 H& u8 p5 G0x00, 0xFF);1 R. e4 k1 k) U& r. Q3 Y9 K+ i; s" E
6 m! c( r' v% }
/* Enable synchronization of RX and TX sections */
; s$ i, ^: Y. WMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
6 p; i1 n. f' t" dMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 O0 F% Y5 p9 z9 f8 RMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*5 y; ~2 {2 @% ~, t4 E
** Set the serializers, Currently only one serializer is set as
0 G) ^/ ^8 z7 n2 N, E* {* u o2 V& e** transmitter and one serializer as receiver.
, S( [* h5 g2 s) ^" W7 n, K2 @" a7 ^*/
, U. M; @5 {) |' p5 qMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ ^1 ^6 ^0 Q- {3 U
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
" h- P6 I/ K! x" i( }) |** Configure the McASP pins ; A) K2 Q" Q9 U* a. d1 V- m
** Input - Frame Sync, Clock and Serializer Rx
+ t P% l6 ^. x1 R, ~; @4 `** Output - Serializer Tx is connected to the input of the codec
) Y7 S% w4 B/ T0 T# [% Y% _# L- L*/
9 t W) W6 z8 s' t; i7 Q. {8 f* ^McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) P& ]- Z$ A& p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: Y5 s" N n( ~$ R" fMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' C) P) |% v1 y5 Z2 l$ G| MCASP_PIN_ACLKX
9 N6 f& E+ C7 Z- M# b9 J| MCASP_PIN_AHCLKX
3 s0 w+ N) R) O2 Z) a9 G| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 V' v& f5 }) }7 n) C+ k$ X! w, t
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 v. E' d2 T9 ], J: w| MCASP_TX_CLKFAIL
: f/ S; Y- [# I* a3 t1 ~* ~+ T| MCASP_TX_SYNCERROR
- m( \& A$ Z4 M" w| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& j& K4 S5 C5 x| MCASP_RX_CLKFAIL( Z! |. I- n$ r
| MCASP_RX_SYNCERROR
1 J6 A2 z( s1 D0 M4 {9 U; e| MCASP_RX_OVERRUN);
/ L- z0 f) z% e8 a' ?2 S} static void I2SDataTxRxActivate(void)
S0 s' `3 [9 q, j{
4 D, }* B. n) O! W6 H1 p% C/* Start the clocks */
4 k& j- X" N& p4 f4 D OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);4 z9 F6 `0 S l5 B- \
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
9 N1 ^7 n6 O- r* @" S& hEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,# s6 I( r8 [) Z
EDMA3_TRIG_MODE_EVENT);2 |- I+ x6 E: }1 ~- J0 D: ~
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, x" j2 h, I3 g5 S1 v3 o# u$ i cEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
: [. F0 y% Z+ X2 n' Y) AMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" Y5 v& C( N% o6 I" uMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) d! [" S; _3 T' m' z' c! }! h
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
) f, z$ Q6 z: {# q3 X! e2 SMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
6 t3 X& ]8 ^: Y, z. e! qMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 H! p: g; f) S+ Z) I6 e} 3 p, x5 F( |" ~8 H9 Q1 _. B. z- M
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. * X4 \2 m( u4 X( r. V) f
|