|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
0 A+ b4 Y8 U# u: E2 |* z. P6 n) rinput mcasp_ahclkx,
: I/ O- S; l* F' s) k! d, vinput mcasp_aclkx,! _0 n/ I& q3 q( P/ l+ L
input axr0,% |) A) J5 c0 |6 c5 l; S
8 e, ^, h2 \+ ~. K
output mcasp_afsr,# V7 T3 H" j, G3 @! J T; {" D
output mcasp_ahclkr,
2 | {% [" Q( T% x+ S/ i" h4 }+ ioutput mcasp_aclkr,$ m$ ^4 x4 c( v& Z3 X* Q
output axr1,
; ?; L0 |) V* \0 i' I+ M assign mcasp_afsr = mcasp_afsx;
7 `5 s7 s; N' C3 k' q+ Tassign mcasp_aclkr = mcasp_aclkx;
& ^) Y% T( S) X3 K, c* l+ jassign mcasp_ahclkr = mcasp_ahclkx;
' h2 j# s9 G& U/ [- N. i' J) dassign axr1 = axr0; 9 P! u3 X' v8 ~
) t: T' ]; S' U F$ Y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
4 P5 a/ L' h% M/ y& G+ s+ P6 Lstatic void McASPI2SConfigure(void)
% a! L" {# Y, g5 K{# P1 |- T d. A) N3 d1 X) U' l
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 A& J0 u' e. C1 W fMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */7 [8 B% F3 o7 ?" E) R9 y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 N O: C }# d8 g/ S# ^7 F' j6 hMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
2 X& J' B6 \2 b% O" @McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 Y+ E7 h2 n: [( i3 q! h4 s
MCASP_RX_MODE_DMA);
" o- p! u. {) k5 eMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( b# Q/ }) l7 K) E0 j t6 W1 o
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. v' n1 @ q$ g' u4 l) g$ u; q8 cMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / M2 o3 C% w0 i' D- H
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. V# _/ |+ E7 b3 jMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 l. s% k9 a( g2 oMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */6 o4 b" k4 x( R, C0 N
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 f6 @5 \- k# a6 Q% y0 P
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . `+ l1 }/ [! H( S% G; e1 l
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 B$ @) w, F& }8 T0 b
0x00, 0xFF); /* configure the clock for transmitter */' z3 E; M& D/ M
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 E" V! `7 ?+ d0 A% o2 JMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# `7 D- P& R/ }7 mMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 W/ {4 k3 l* \" f' o0x00, 0xFF);
2 _$ ~% g9 M+ ]; i k
: D* A% k" G, v0 T/* Enable synchronization of RX and TX sections */ " v- i9 Q. b7 s! q+ P1 m
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */0 z" j, E0 C' d
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' T! S; W* L6 O" A! M. M/ {McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 t3 ]% L, w* |- S* @
** Set the serializers, Currently only one serializer is set as) v2 q: z: m7 x" ?
** transmitter and one serializer as receiver.
- G) p! [ _6 d: b! E0 |9 d*/7 L) |* W' \. D# z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: {/ y7 O; q1 t9 _3 S8 I! o
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ |0 a3 k( x! r) }3 \** Configure the McASP pins 9 y' j/ @1 Z+ g0 B9 J% q6 A2 V. e
** Input - Frame Sync, Clock and Serializer Rx
3 {! C8 I9 M+ q8 t9 Q3 e- o** Output - Serializer Tx is connected to the input of the codec ) t, Y# x" ]* x. U& h
*/0 O) i( R5 L9 h: e4 a
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) ^* G. v* N) E2 h1 _3 \" C, zMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 F# _& {/ T) b: \McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. Q; b: G' g- S1 _8 x/ R: E| MCASP_PIN_ACLKX+ j; p9 W1 e W5 Z) C
| MCASP_PIN_AHCLKX
! S& K o5 c- \5 Z. p4 h| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */8 e- j* s: q9 g" i0 N4 S
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 Z3 d. o8 B5 O( t" U, F3 O3 j& || MCASP_TX_CLKFAIL
) |9 Y3 B; A; _: u% H) o| MCASP_TX_SYNCERROR1 x: p$ ^; q# |, X0 }
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % \& t0 c Q# T# h& B
| MCASP_RX_CLKFAIL
" h; V0 z1 r8 ^* q; W, e( [ q| MCASP_RX_SYNCERROR # K3 t3 G l/ ] I2 x
| MCASP_RX_OVERRUN);! s& D m# v V- f3 }3 l5 y q
} static void I2SDataTxRxActivate(void)
. I7 j& q) d$ ^" k0 F{
3 G2 u- d" J: Q# O/* Start the clocks */
% ^9 a, g9 Q5 ~1 x$ s0 L4 fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 F) }4 h' p$ Y: H8 s- i8 t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 E. H: h, m( s* ~
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# r/ U1 P' v1 [/ s8 qEDMA3_TRIG_MODE_EVENT);; r3 A# n1 f. b* T) [
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " D q8 \% ?1 s6 e3 V3 e0 ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 I* p( G% P+ t2 nMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 n' X1 H% q- S+ @" t; B8 {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */6 M& h$ x3 c9 C& c% U" ~% J( M+ [" ^- t
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" [, M9 a0 M8 y3 i: A8 h1 B. ~$ C( O
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 P8 i3 \+ [& A" K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 s0 U7 H- b4 P) V7 n
}
; g. C2 |7 A0 O6 ~9 i8 {请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. t; ]0 K& X( Z |