我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ S# R& f& \% q
input mcasp_ahclkx,
* R) {+ a. }" L% Pinput mcasp_aclkx,* c5 Z" ]2 p& ?, u
input axr0,
) W9 \: X) H i) C( B. c9 i7 {' Q" {* _$ T
output mcasp_afsr,
|4 g. A8 u& c6 \+ p5 i0 Xoutput mcasp_ahclkr,8 q% x# `7 ~5 @$ p/ Q# G
output mcasp_aclkr,
, C! V7 r# ?- L' t* R( _' Routput axr1,
9 M0 C8 C9 ?( M. o" x assign mcasp_afsr = mcasp_afsx;' L9 }% g/ G7 F+ i3 X0 [0 M
assign mcasp_aclkr = mcasp_aclkx;$ |; c+ a, E( o- ]. f& }7 @
assign mcasp_ahclkr = mcasp_ahclkx;
% n% W$ |3 W+ L/ A6 Uassign axr1 = axr0; 7 f1 ~; A5 w) u* i6 R
% J. s. g# p' m# ~1 i( K在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : r; |. ~3 C7 L4 K. z
static void McASPI2SConfigure(void). c- X% [3 e1 u" k3 w! Z! |
{" l- A. Y( P. g1 @
McASPRxReset(SOC_MCASP_0_CTRL_REGS);2 o8 o" V/ N3 x. K
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
+ @/ j! o: k$ t1 c( h2 G) P3 I+ gMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% x) M8 G. l; b
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 K4 p8 L" E+ @5 p/ Y5 }& g3 V
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 Z; m2 w) s% F/ f9 @$ tMCASP_RX_MODE_DMA);
, _: k( S P% A7 M) S' M8 sMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 U, v8 \5 z5 s) AMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ i7 E' S# a' [5 c0 C) v9 s4 W3 j) LMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- W' S( N* L( jMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ x+ w2 d/ H# w. M6 \
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 b% l2 w, V i; a$ E$ S/ qMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */; q# w! c, g$ ^4 @: d& `6 w
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 `3 n, I/ s) s0 }+ C+ S/ i
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
0 X: Y4 i3 U0 SMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( \/ L6 L7 G/ ^1 g6 [0x00, 0xFF); /* configure the clock for transmitter */, j4 y5 J+ c3 [. [- x
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
) H p' _( A; T# y. {7 WMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); - @7 ]7 H6 h& o1 C# t5 w' I$ J# V, h! b
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' Z, T* e& b8 \7 n# @; ]0x00, 0xFF);
k7 ^. b, ^/ P5 ~- |* i% X
6 m/ O) D8 ]8 G) y4 T7 K v/* Enable synchronization of RX and TX sections */ : O/ x% V6 F- b0 Z! I
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. G8 M C' Y( E) q6 ]McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);- D2 C8 {0 A5 X+ @8 |
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*! n; h' x9 U0 l; @" G$ B' v
** Set the serializers, Currently only one serializer is set as9 r( ~0 r# ~, S- C' r( M- \8 o
** transmitter and one serializer as receiver./ C, f: |- d& a1 U
*/
% ^$ B7 m7 h) A1 YMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); d. k- S- w5 s% ~2 i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
% {" ^! m$ R1 }4 _) q" e& V& I** Configure the McASP pins / g; U8 C% u2 J5 l
** Input - Frame Sync, Clock and Serializer Rx" a5 N6 l; R# h) V: {& E
** Output - Serializer Tx is connected to the input of the codec
+ J+ l4 u& F: Y1 B" a/ w! [) \( i9 b*/( }! o' I2 I. ?7 A( M* ~
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);2 g; t( v+ T! `- G6 W
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 d9 n. z) }$ a, E3 l0 ?McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% i3 q. z( ~: r( E
| MCASP_PIN_ACLKX
# a8 W7 h* x3 t X: ]/ Z8 ?| MCASP_PIN_AHCLKX
J! x* u" J9 s. f& W* V9 D$ j* b( ]| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */ X# |9 _( N+ W) t. V/ `- v
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 V2 b9 o. l1 [% a1 j* q3 s; S
| MCASP_TX_CLKFAIL
( u; g, L S" Q; t6 I) E( ^. K* o! `| MCASP_TX_SYNCERROR
' U0 s6 _0 i- v. f- p9 }| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ v N5 L3 T) v| MCASP_RX_CLKFAIL& i+ E) P# r! t9 T! M3 W
| MCASP_RX_SYNCERROR ! s$ S) q" R" u
| MCASP_RX_OVERRUN);* n T/ U, Q7 U7 @8 s$ e
} static void I2SDataTxRxActivate(void)
, ]( ]7 l E: r{
3 }0 h9 V4 x$ q) @! k7 }/* Start the clocks */
( T3 f! e+ @ t# C% O5 zMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 n/ A$ w. P! h6 H( F/ ^6 v2 X- N
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 _2 y& N& Y3 G# y% y& E+ {
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# V' S; Q5 U! `9 ?1 ~EDMA3_TRIG_MODE_EVENT);1 J) C$ O0 M5 o ], P: d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " M7 q T1 L7 t1 N
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */! |) X E1 r# @# S0 v
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
1 H: ^+ F$ d9 F8 o. j ]4 W. mMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
7 C) i4 x" h) T D7 hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */0 Q- L s' q3 k0 F N- W9 I+ [
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);3 c( i2 L5 z( ^! @8 H6 O6 K. }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- |5 l5 b6 F4 R* K3 D h W' {( A} 2 \( i0 |# ?* _
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 c9 U }* _$ r4 N. v: t |