|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 e0 M7 v% X" Z. {% ~; L0 `/ `
input mcasp_ahclkx,& n+ g6 a: f5 S- ` |2 p5 k
input mcasp_aclkx,6 q( G/ r N, @' [% Y1 Q
input axr0,& p# V3 J" _/ c
0 F* z, G/ o) z7 koutput mcasp_afsr,
) i/ B6 T$ o; K% ?5 Y1 S8 q' Koutput mcasp_ahclkr,/ g0 p/ H q: X! G' w
output mcasp_aclkr,
8 Z( g$ c1 }" m- Boutput axr1,
+ s6 \7 a2 o& X3 s0 m7 } assign mcasp_afsr = mcasp_afsx;
) e2 Y: j" J5 E: W, g" massign mcasp_aclkr = mcasp_aclkx;: h1 C5 n/ A* ~7 T5 _% j) d
assign mcasp_ahclkr = mcasp_ahclkx;; V. ^2 Z4 `' M# ]0 l
assign axr1 = axr0;
/ Z, u$ s+ U4 V; Y" _- ]8 x" p+ y& W: |) _. i+ E9 i
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
, s/ R: t1 Q) N& g- e$ Astatic void McASPI2SConfigure(void)
3 K) D7 K" T" D{: ?$ r8 f( R! M" y( I1 p" b3 v7 e
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
' q4 U& r* _. GMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
6 o4 {8 p2 }$ ^* S: y; E CMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; Z" ]: r C6 i( Z+ c
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */3 u) i5 [$ v$ w0 r2 Y1 K& R/ Y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( y: g. M' g2 r/ t9 d
MCASP_RX_MODE_DMA);
" _0 `1 v% V; x7 d: O KMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' x8 h3 I1 z9 @# HMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
0 |( c. G$ z- [1 iMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 H) F) Z; A% M9 v& v( G
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 Q( y2 i9 \6 f' Q6 `& p
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ f! q$ J: X9 g5 K6 ?( I* kMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
5 G4 M! o7 g3 a2 M3 o6 o; `McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, G8 C, u7 L9 L# A* G4 a
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 I" l4 m8 }! R- p
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( B" x4 m5 d) c1 q" p! Q+ L
0x00, 0xFF); /* configure the clock for transmitter */4 _5 ^1 V" ?8 b" O2 C& i
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( f; K4 X+ o$ K& w6 z6 yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# ^% G3 K9 w! b: X+ k* G; I% KMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,; c# I! U2 V% \+ E
0x00, 0xFF);
! I5 ^* l0 a' Z$ X% M+ w" s5 ]( n
/* Enable synchronization of RX and TX sections */ ! Y4 e$ ^9 f1 k! H9 j) l
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
( }0 ~4 y; C8 F; k- PMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);8 a) N: E' i8 p4 M4 m
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*& ]7 q* c5 o4 W3 \
** Set the serializers, Currently only one serializer is set as
( X2 v5 a- ~( ]+ b1 O** transmitter and one serializer as receiver.; d% ~! X, f3 I- W9 ]- \. `
*// G9 @) w7 B4 _1 e v- B
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ J% i2 b8 P8 {4 j" Q" F D" j
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*$ B8 h8 o- Y$ }. a, I; p1 a
** Configure the McASP pins 5 d* y2 {. H, U: H |# l, X6 I
** Input - Frame Sync, Clock and Serializer Rx6 ]3 G8 f- m% F/ A/ E; ]% A
** Output - Serializer Tx is connected to the input of the codec
" P0 E8 U8 }2 g% o! d# j*/
+ L8 t8 l0 h* `0 E) p& NMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* O1 ?' b: g1 ?4 r0 }$ `
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- n5 t8 u" W1 l# F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ p- @6 C# i' p9 s9 K| MCASP_PIN_ACLKX( {6 _% [( ]( T. T7 a
| MCASP_PIN_AHCLKX# R- K4 o8 H8 B8 J
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */. D* Y( v: N6 b! S9 q
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # a# r! U7 O' G/ S6 Q% D& g
| MCASP_TX_CLKFAIL ( N b; {5 V5 r" k! `! X; c
| MCASP_TX_SYNCERROR& `; b/ s Z* ^2 K: u. t6 G
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& }8 M6 m+ \$ E: N| MCASP_RX_CLKFAIL5 q1 b$ Z- v0 p7 z/ ?
| MCASP_RX_SYNCERROR
6 a. A% B# A/ Z/ [& Q B| MCASP_RX_OVERRUN);- Z7 D) q8 D, i% o& W* k C
} static void I2SDataTxRxActivate(void)
; I4 x2 l# v P( ^, P4 ?- a{/ B/ @; [3 J g! s
/* Start the clocks */! c! R( H: r5 @0 h# l- l! ~
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);! b6 S! `6 s# g0 Q1 t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( o9 c9 L, L$ h3 J! J) `5 ~. o/ G! I
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
C+ h/ p/ C2 _: I. |EDMA3_TRIG_MODE_EVENT);
" U3 {- n+ K ?) P* t: {) }EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 T/ [5 r0 ^- i5 T5 ?' }: Q3 LEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 {! C5 o. a6 O# H- L3 }$ A6 }McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
Q, K8 D" a! k/ V+ j0 S" `! d% lMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
; m+ Y$ C2 h8 S; H! a3 wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
& V) @# ~/ j# `. m7 f% N; Y6 IMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);% v/ x3 F% A" I( s! I0 L
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& f' H1 t3 M. k- _0 B}
F& ` d# e4 A! _请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 r' q9 I8 ]3 n& T# W
|