|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
t) D- r% j2 c: ?input mcasp_ahclkx,
& k0 v; }3 m( Q) ninput mcasp_aclkx,/ f* W9 o, l2 d& u3 Y+ K: H4 [
input axr0,: N% [3 }4 t) B+ v4 `3 T
% E$ T. ]1 x7 M( N$ w2 A
output mcasp_afsr,8 s5 {+ t+ Q, g+ J9 V
output mcasp_ahclkr,
$ R# P- ~2 k; H6 o% koutput mcasp_aclkr,$ M1 W3 o7 Q/ t% Z2 Z
output axr1,# r: d3 o+ m$ @5 ]9 ?+ N: F
assign mcasp_afsr = mcasp_afsx;& [0 l7 } D2 C# n1 h3 R G
assign mcasp_aclkr = mcasp_aclkx;$ \ _/ Z9 t* e+ B* K) V' T
assign mcasp_ahclkr = mcasp_ahclkx;
% a( i- Q8 c. e" @% Nassign axr1 = axr0;
2 V& z& z2 r: }+ V. W
7 v& L& W& {3 C在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 0 L! x8 Y8 |- V2 F1 [
static void McASPI2SConfigure(void)8 ]% @7 o2 a W5 r& C9 Q2 \, S3 p( w
{
+ A( a0 ~& ~0 E" C7 mMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 H) a7 ^/ S- |McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
' u6 Y5 e; y' X8 T4 FMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 z m' f9 b1 V, I% Y2 R/ [" P0 C$ h8 IMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
: I3 I9 N; @. G( I6 c$ N" x; |* BMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 y3 u: D) F H5 M0 ^, y+ ?
MCASP_RX_MODE_DMA);3 p! P- i/ L7 @3 m
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ q! u2 z$ W$ \0 X2 l0 Q
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots *// t/ ~( r0 L9 U
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 F& @' Q# i, }4 u3 E! Q5 }+ k; UMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* G( q, |+ }4 n, ^) o
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ _8 ~6 M1 E S
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
: x, _; G1 V, l6 K7 UMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" I$ }; U! `0 y( x. L6 D5 e
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * Y6 Z- ] E/ P# t8 |) L
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
- K6 B6 p; E" C8 i7 O0x00, 0xFF); /* configure the clock for transmitter */
2 s7 \5 `8 w( [McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);& E4 t5 g. k# Z& c9 C H
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 U3 P$ x7 I: l a6 r! b8 Q' e4 V! EMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,' W3 s6 [3 b% U) G$ H
0x00, 0xFF);. R/ M: z( r- c3 x- D7 I( R, }% C
# y9 [3 E0 W' K
/* Enable synchronization of RX and TX sections */ ( ]0 A5 D+ x) N$ P& r6 w
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
, I3 B* X& j. [; p- G8 RMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);: z+ G0 t( w; c0 g2 D/ `) B" M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
) b; q# [: k& k/ N** Set the serializers, Currently only one serializer is set as
% I+ J, {# E' ~7 U% z** transmitter and one serializer as receiver.( I- C" H6 @ B9 q2 _
*/* L% [* `7 b9 H% a
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) T) s" K0 {% s; Y; p7 T
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** i) R% J) r! t# R# R; ^
** Configure the McASP pins
- ?4 [, Q" V# m; v** Input - Frame Sync, Clock and Serializer Rx+ E' b6 l; q$ p- W. k" q$ C
** Output - Serializer Tx is connected to the input of the codec
4 E8 G/ P9 f9 Y: I2 Y5 h*/5 J+ s D/ Z! m" I
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
' g0 j; f; M6 _6 g3 O4 C+ wMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- F% n7 q: B: B; |: M
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* y( a( V. A+ V3 Z% `7 d4 g
| MCASP_PIN_ACLKX
! p5 ~# P e7 o5 H| MCASP_PIN_AHCLKX
: u8 j/ J$ x! @| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */, K: s( y# o+ \0 |; Q
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
8 P: E7 m8 {5 ]5 G5 I0 }! j8 ^: P7 z; k| MCASP_TX_CLKFAIL * m' h4 o# ^9 l/ _
| MCASP_TX_SYNCERROR ^8 D4 M) O: ?
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! x% a$ I4 S) @7 F| MCASP_RX_CLKFAIL
7 g- S$ O& A% p$ ]| MCASP_RX_SYNCERROR
( l L' h6 Z7 j+ a) K5 X( K. c| MCASP_RX_OVERRUN);
+ G. V4 r3 s! z* m} static void I2SDataTxRxActivate(void)" N0 U7 T1 S( s2 X1 F* @& i
{
0 P6 B% D; \! p ^/* Start the clocks */0 b1 y. R4 t4 q" S
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- e$ f) x: J$ l2 b( _9 Y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
, z! {" ]$ h! }+ c$ j6 mEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; Z1 R+ U: K2 h ?# V- D5 {8 C7 Q$ z2 JEDMA3_TRIG_MODE_EVENT);
! T, U1 }0 `4 o& ?' s( `EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 L1 g. ]3 j) i3 l
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */; Z! n4 M9 ?: G4 }2 _! {. R6 _' p, M% l
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
. z; I9 M3 m( c; T P- t/ e' BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
9 Z+ A5 t4 r# f! a5 y! K a [while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */3 O9 [6 j9 [- G$ B2 f- s
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);/ ]3 c' Y- f M: Q! F# v
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 W1 x" Q3 ?- ~7 I8 \9 V9 B
}
8 }2 l7 a7 [2 S5 m8 t请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ R$ f5 J6 f1 T3 X1 w' a5 m7 w, ] |