|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,: \0 d) S3 q- a: z- @
input mcasp_ahclkx,/ x9 G! j3 n/ L% g; n1 _5 o
input mcasp_aclkx,
/ q6 h9 f% X2 l7 G, h. f0 F) Qinput axr0,: E8 r3 G3 K% u' z ]
+ y+ K; ]4 E9 A- M. I
output mcasp_afsr,
; W$ d2 W8 b" u8 \output mcasp_ahclkr,
- ~- @/ O% t: i% |output mcasp_aclkr,1 }0 n' J. F: U7 J
output axr1,/ y8 {) S% ~) D+ l. B% X
assign mcasp_afsr = mcasp_afsx;
4 J' d1 v G" l0 v0 J" massign mcasp_aclkr = mcasp_aclkx;/ X' z4 a$ r- P. S7 f; F% [5 b
assign mcasp_ahclkr = mcasp_ahclkx;
; Y0 P- U" p. n D1 Q, }assign axr1 = axr0; 3 O& w4 H) m5 X3 s( l8 y
' U, k& [/ O( H6 `. [8 l# `* n在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 0 r. A$ ?+ j9 N; N/ [# F4 E
static void McASPI2SConfigure(void)( k, N/ u8 X) A4 Z* I. v
{2 L: L, b% c, Y
McASPRxReset(SOC_MCASP_0_CTRL_REGS);3 b6 a* h2 G+ F. V" o
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 t1 ^1 f3 z" N+ Y. [1 z( H3 l4 |6 VMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 Q# u. _: S2 T# V! x, r: n
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
9 d% P" p4 w$ R, CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# @0 H* o. }& f8 gMCASP_RX_MODE_DMA);
2 B2 A8 \8 H- c6 \; LMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 ]$ l3 f. d5 A+ p2 ~MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
7 N% U2 l* @( L) B+ q4 V) ]McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 }( E. f. c7 Y, D7 n7 W& i" I/ u j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# N4 c# k1 Q& \0 M9 ^" }- F1 ^McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: y0 l( @$ J! F7 fMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 H/ [- y# z# D t" d/ Q, z4 L- L. S: kMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
+ \2 O: c |* }3 dMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. n- b# w5 @, sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 c$ q; W2 ?+ d
0x00, 0xFF); /* configure the clock for transmitter */' W- X3 G. V$ b6 Z) h
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ i, c0 c/ ?5 R: v8 i8 _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. h, C' r. [2 e. D$ KMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 W/ {6 Z% ?8 D# _4 D
0x00, 0xFF);/ P# Z) f' N. s2 F* C3 D' A
, g3 |5 V- @! O. l: a: Y" v* i/* Enable synchronization of RX and TX sections */
$ F, F; q- i. ^% P* nMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; {% K+ `) ?- G- s! _8 Y r* q4 T
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 v( s8 t( ?+ N0 B4 |+ x0 O$ XMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*% _: L0 W. d+ c8 G! |
** Set the serializers, Currently only one serializer is set as
8 ^3 n* W. J: ^6 W: w7 }, T; G9 D! n5 e** transmitter and one serializer as receiver.
, K o; Z( F/ ]- B*/
+ y- P' h; d/ c! j- R4 [6 bMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: K% o+ p+ O; t! @
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 D. P) K2 s3 }
** Configure the McASP pins
% P( d. I, h0 X" g1 k% b** Input - Frame Sync, Clock and Serializer Rx
" s5 j P0 \( E$ `, F4 W** Output - Serializer Tx is connected to the input of the codec 2 m7 J# m# V% o
*/& ?& n4 t* J6 ~! ~% @8 Q7 h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 J5 X9 D! D, u% HMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- o$ w( @# }* S4 H( g6 a- _$ D
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
3 r2 ]8 r9 m* C& {# ^0 i- g| MCASP_PIN_ACLKX; k1 m4 I" K; l2 c
| MCASP_PIN_AHCLKX1 e* o$ K" e/ Z4 \" C4 |- d, I
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */# O& K# e& \* z+ B; d5 Y& L t
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / p% F* \# {! G
| MCASP_TX_CLKFAIL ; {7 w# N# \2 F2 z
| MCASP_TX_SYNCERROR
1 {: Q! _6 S/ {" b4 p1 d* q| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 E! c" K& s5 C6 Z5 w& N
| MCASP_RX_CLKFAIL; V+ T3 U/ J- w4 Y% k
| MCASP_RX_SYNCERROR & R0 e5 ?* B7 w9 q/ e8 T, F
| MCASP_RX_OVERRUN);2 d. k/ ~' ]# W( A/ E h
} static void I2SDataTxRxActivate(void)
0 w; |' _& X3 e9 k{
" u7 c, Q9 t6 W# _4 L: ~/ ^ e& d/* Start the clocks */
; j$ g0 [7 F& u7 \2 J( sMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" O* e9 r Z" R& AMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) K2 H' `2 x. r6 G mEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 G' `; \% b5 f9 e, `* D7 }EDMA3_TRIG_MODE_EVENT);
1 W9 |5 I8 M. I" u, EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 l! }6 i- f8 U, N$ y4 c
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */) ?9 L* ?' a+ ]; m
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
4 o( d7 l/ L' R8 {& GMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" L, W$ _0 p, A7 hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# S; t7 P$ F% h3 E- h: D, E
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 y' R. W- \- t( v* @' j8 I
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 \/ C, Y# [$ G}
: q) x# a% z! U0 f% A7 X, A请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& |9 W% W. g" @ J! z+ p) T |