|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! B0 l D+ W" o! w& m- T0 J
input mcasp_ahclkx,4 r: o7 c# o# j
input mcasp_aclkx,5 a4 h) h% P) L1 x7 c1 ?$ |
input axr0,
v) o* P" G7 P8 f3 u. N
9 X$ L- I' h2 @% c! Q% uoutput mcasp_afsr,$ I" y& f+ R; t% Q/ ?( k, e
output mcasp_ahclkr,
" g' h/ v, Q6 D! v) I; l+ k2 moutput mcasp_aclkr,7 \" k) o0 p" e. W' L4 m" H
output axr1,
3 d) j- s4 y! b. M- g, N* `0 O assign mcasp_afsr = mcasp_afsx; \. f$ A' L( u# y. j- t1 X& u+ B
assign mcasp_aclkr = mcasp_aclkx;
- Q6 b; d" h0 r: p, w! E2 tassign mcasp_ahclkr = mcasp_ahclkx;3 b5 N. c9 T$ U3 Z
assign axr1 = axr0;
5 y) L- N7 M: {7 k% N: N; N9 Z* m- I- r( N2 p0 ^
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
, u5 x9 m+ ^3 `6 dstatic void McASPI2SConfigure(void)
# z6 p8 \2 e: C, ^3 }# J% H R{& B* ?" M3 ^$ q) l8 ?; c, ~" J
McASPRxReset(SOC_MCASP_0_CTRL_REGS);, v/ _1 \! {. X" I% K0 M$ E% u" V
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
. E, M3 u( b% s( ~McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; U" I" F3 [3 z+ u, f: _. M
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */7 D+ P+ \: l3 f4 G! d
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' @( [# r! Z/ @0 `
MCASP_RX_MODE_DMA);2 I1 d" J, p. p: Z1 \8 _: ?
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) \- m$ c3 T# j4 s8 F& f
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 P, ~! S/ { `4 O: V1 Z8 xMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 T% ]$ y% h; H" [MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( I+ G# s6 i, {McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, X6 f& X- |- o# B" ^# tMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
- s$ o! j' R+ L5 M. {; PMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ y! u+ C' B1 \; sMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . `9 F* n" A c/ b7 A- y, z, }) z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
, Q3 S" o) C4 p& b [" R8 |0x00, 0xFF); /* configure the clock for transmitter */, R( d) H. E8 }; v
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ x' O7 ^( @# T; ?# @& i$ }McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
/ m) O& x+ B% ~2 A0 z) B! `) kMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& N3 B) C# L3 e
0x00, 0xFF);
, _" x4 p2 H3 N* c: F# ~
" p0 ^" k6 F* r3 D- ^' ~7 ~/* Enable synchronization of RX and TX sections */ 2 X% k' S2 f) U( m* j
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
; ~# u5 C7 X9 RMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; _* n" b: T, j% K2 [2 { k
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
' b& V$ X! M$ H6 V** Set the serializers, Currently only one serializer is set as6 |' @4 ]( y6 ?: X, x& v- e
** transmitter and one serializer as receiver.4 a( _3 D$ r1 ?7 D1 k0 z5 s
*/5 M% x0 G3 U: a2 O2 c$ j1 Q
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" I. a* K1 j" H# O. n0 a a6 SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
9 g% M& i! ~" l** Configure the McASP pins 0 e( n& v7 l$ V/ p7 V- @+ V7 M
** Input - Frame Sync, Clock and Serializer Rx
9 M+ Z9 h+ t# E9 o6 X; [& O1 T** Output - Serializer Tx is connected to the input of the codec $ u* Q5 u5 J+ M3 j/ R+ \
*// {$ }2 q$ L! F* t9 N9 @0 k. d
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 b/ n. }6 v4 M ] W' C' E: I( k
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' O) R/ W! d0 b# z) f" f; ]
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 |3 `+ W H% ?9 u
| MCASP_PIN_ACLKX9 }8 U& I! |( C0 \) X
| MCASP_PIN_AHCLKX8 d6 V( w( W# Z9 u! q
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
) F( R7 H1 m1 R k$ K- vMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! p/ m0 H+ q1 F7 K| MCASP_TX_CLKFAIL
( U; t9 o8 _. k6 i5 X| MCASP_TX_SYNCERROR
8 _6 M7 {6 t4 k: B4 j7 f1 y| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
; V6 J! m/ B0 @) V8 u$ ^| MCASP_RX_CLKFAIL4 n; ?8 u5 @; }) k3 R
| MCASP_RX_SYNCERROR 2 T; w! S& g1 M8 ?. w; |
| MCASP_RX_OVERRUN);
! J" h$ k- x5 ?5 [} static void I2SDataTxRxActivate(void)
8 B/ H* a3 i! ?; ]& w& j( _$ ]0 i5 i{
1 I* R) E/ h; Z. J( b0 g) [9 ^/* Start the clocks */
5 E# ?5 g* A$ k1 GMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
% q" C7 e% T+ J2 U) y) h, V& m% }+ MMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
' U+ x: I% [; @' PEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ u) }6 E9 i: n0 H
EDMA3_TRIG_MODE_EVENT);
. m4 |2 M, Y2 d1 f. U" q' JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
9 X, m4 N3 R! w8 I8 tEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers *// ?% R& W3 W3 U5 B6 L0 P# {
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* S' P. e6 `: j* i" p1 x
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
( x) t" r7 N2 ?3 U/ f/ t; x+ u* ^while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */* b% |( R! O' F9 E9 e
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: B: \ J& p/ v6 U. ]. n! ]McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% |/ B( V9 W/ J! H1 i, Y: L}
/ ~! |# Y8 `" G* w) |, a请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 9 G$ ]7 O; D; D1 X5 E. x
|