|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ I! G H1 F9 d
input mcasp_ahclkx,* h) q j0 R1 w& X# `; y! O6 q
input mcasp_aclkx,
" B7 j! t7 P D+ P0 N- U' p6 vinput axr0," N8 O; b0 q- I, a
A6 O& A5 W6 T1 I) D' L( K% qoutput mcasp_afsr,: S4 I% V1 E( i# z! i
output mcasp_ahclkr,3 h R9 C. r! ~
output mcasp_aclkr,
% P) W0 |( @! R. V( \' X, |% O8 routput axr1,* S" l/ u# S- B. ~
assign mcasp_afsr = mcasp_afsx; K: C) X9 F: W9 j
assign mcasp_aclkr = mcasp_aclkx;
* Y% `! ?5 p( v: j' g0 uassign mcasp_ahclkr = mcasp_ahclkx;
. ^# O& J& A. Y% ?) V" jassign axr1 = axr0;
! ~. a/ X4 ~8 f+ g+ _1 [+ `# R. @7 J( \1 u5 h- l1 q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
( s- c$ i, n' J' f7 Gstatic void McASPI2SConfigure(void)! g- Y# H7 V! _4 M
{
' h0 g% q# T( H, V' ?4 e% g/ yMcASPRxReset(SOC_MCASP_0_CTRL_REGS);* K5 O2 J1 z( e2 ~3 G
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */* u. f4 a( l! [4 S# T6 ~
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ ]+ j1 O; w+ Q) z: z1 y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
6 l0 l# b3 d7 N8 H, O% k* n( t" mMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, K3 [% P" B' M0 c( T9 k" f5 l: GMCASP_RX_MODE_DMA);4 `4 Z; J0 v( s" I' j
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. s4 l1 [, q( n5 Y! PMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
0 ^ W- ]. k; ?: j( \' CMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 U" E# a- e' M9 r% s
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, k( ]6 W% L% W' b5 {2 Y' S2 ]McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" Q- e" \; f. a% @6 @4 ~0 N R# e+ {! aMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */( M/ y* f, l7 q* S' Z1 Q0 T2 Q; |
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 Q" K# ?' [4 \4 Q% [McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! Y" Y, h0 e( O& Q7 A) x5 r% `McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 G! O9 W. K( i& O z0x00, 0xFF); /* configure the clock for transmitter */
$ u; C( ?2 w2 a8 k3 OMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, f% d+ V* J- i9 e* Q7 Z1 d2 U9 gMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
/ x2 x. {3 y. M1 sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ d+ s* p, d$ }5 G4 r6 q8 t/ I0x00, 0xFF);, m3 l. P+ K, h; p9 |( J4 \% k
# l5 N; e R' J. e) E/* Enable synchronization of RX and TX sections */ 9 s {: G" b; p h: }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ t; q6 @0 n ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);) u7 K- k v1 R$ A
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! s: X+ s- v7 P: C; X x** Set the serializers, Currently only one serializer is set as
2 t* N( s# @& Q# [7 S- U2 n% S3 N: O: a** transmitter and one serializer as receiver.8 i6 p! N0 E9 Y: O+ ~
*/
1 e4 M" D, V2 t5 `. M2 W8 KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 X1 v- x5 l6 m0 D6 k' i8 X4 i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
3 _; S, h: ^' d: J0 z** Configure the McASP pins
, d' |% a ?& ]3 L, |& I** Input - Frame Sync, Clock and Serializer Rx" `- L8 u ?- W8 d
** Output - Serializer Tx is connected to the input of the codec 1 w5 W9 t! d# s" B8 n7 ~2 q5 N8 ~
*/
: F) _0 R! c; z& ], W/ ]McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
4 ~, n+ B1 ~& p8 Z# ~McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 n, t, [8 t* i3 ?$ `, n
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& ?8 U& W( [, ^* z% o
| MCASP_PIN_ACLKX
. R. r8 b) @7 o' L+ c8 R| MCASP_PIN_AHCLKX
: F/ H+ a8 j: w! {8 ]' X- v| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */( |6 A) y0 R6 r# o1 q
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 E1 k( v/ l5 j/ M* t' q
| MCASP_TX_CLKFAIL ( T" h! j) U& s7 K& v# V$ n
| MCASP_TX_SYNCERROR
2 \+ B" k+ Y. d4 W# ]. n: h| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) V4 ~# p+ b$ O6 l/ N$ d* z6 v8 e! Y7 z| MCASP_RX_CLKFAIL
5 h. d* \3 ^4 P6 Y; f) V z/ a$ H0 ?| MCASP_RX_SYNCERROR ( [' I; c: m- j! f4 M5 R5 b6 t( l& i: E
| MCASP_RX_OVERRUN);
{, ^* d5 l$ h H( S1 T" V2 W} static void I2SDataTxRxActivate(void)
! D! B, O* H4 [' p6 u9 f# {* }5 K{
4 B* k6 J! [- w9 H0 E/* Start the clocks */" p' ` A7 G* u
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) b. e- x) s% f8 J5 X1 SMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */' h; j! x+ t; B3 t8 |6 a3 K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: X& u; f9 b; T5 [2 Y, sEDMA3_TRIG_MODE_EVENT);
. q0 O( j% l% C2 {- ~EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # R( }6 r6 M6 x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */6 a1 n$ ?+ O( w# }) @4 ?- m
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 s3 o$ B4 |) U( ]5 K
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
) d7 s, V9 P. V9 rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 L) E' j9 G `, LMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ h1 t5 T% K5 o3 I
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; x R2 f2 _1 h0 K( N E9 H" B
} 5 e& C# m8 s, n0 o* r/ R' Y
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# M. G! Q t3 S: x: V4 F |