|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,; g& C- T; h: h' @
input mcasp_ahclkx,- }" W; t/ L# J. `
input mcasp_aclkx,
* [4 ]- Q2 D( ^$ `$ ]) [input axr0,! M" @9 ^& n% u Q! k2 c) q+ N
7 |. ~/ Z3 ~. L1 n
output mcasp_afsr,
6 r4 s) t2 B- r/ C" O0 N4 foutput mcasp_ahclkr,' h/ \2 Y% o) \5 ^. N3 R
output mcasp_aclkr,/ t" v* P8 r0 q l* G& @ l2 a2 J# d
output axr1,
, W# r' s2 X& b r) }7 g assign mcasp_afsr = mcasp_afsx;4 Q- B, h+ A, s' z3 V8 o( E/ K
assign mcasp_aclkr = mcasp_aclkx;9 ? R9 m8 {6 U
assign mcasp_ahclkr = mcasp_ahclkx;
% c+ B0 T2 J; c, y% U% I! B% vassign axr1 = axr0; ; g! A2 J+ x: n& s. k9 O
! K4 M& t& f* C) e& [/ f在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
+ ~' ~0 F. U2 Cstatic void McASPI2SConfigure(void), {( w i8 c. i+ d0 R$ q+ T! g+ \* ]
{6 c, X; L$ I$ s% x/ X" b* v" ]4 A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) L6 R' T5 G& k z6 sMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
* E ^3 e! [8 `6 @$ o+ dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% j4 G. v6 e; |6 ~
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */" Y! n% `/ h" L( ~$ z2 F! Y9 O/ A7 O
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, k1 ]4 I% ^6 E& b
MCASP_RX_MODE_DMA);
: J: W" s7 ?) K* Z* V/ W& kMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# A- O8 Q F; {3 C' ?: c
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ y1 _9 k, k, S/ k! a( d- sMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
& k- i) b$ l( W# j4 S7 lMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, O4 ~% O; b! ^& Q! l9 ~- @McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& N2 C8 C8 q* Q" X8 \MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 y. ^! K0 o/ J& R) ?( L1 E7 x- l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);+ Y \5 r8 i) M1 W
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" w8 p) A4 m1 `McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 F- G* q5 }' [( U0x00, 0xFF); /* configure the clock for transmitter */
$ u5 g p H0 K- s: k7 NMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);9 k7 X% I2 A, z9 V1 X) i; w
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. T' Z6 N/ D: T5 R/ [7 i+ XMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
* p' b! q, L2 T$ t/ {/ l' Z$ H( P0x00, 0xFF);
1 J% ~, ?. x1 _. W4 p( |9 B# g
( m9 e7 C1 Z( a/* Enable synchronization of RX and TX sections */ * X9 p/ S; b. N& J; V. y5 f
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
9 Y; U2 J) L, }- K9 RMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 N2 T" d. b0 [# U4 BMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 s7 }6 E. g0 m
** Set the serializers, Currently only one serializer is set as+ r1 E* x: l) a/ K1 F
** transmitter and one serializer as receiver.
/ W# v J( p8 t% x& L*/# m" S! C* i- y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: z* _1 T* Q7 W$ C( u
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
4 I% |( S( Q, @% u9 e** Configure the McASP pins
& N" R# R$ }7 O7 t3 S7 R** Input - Frame Sync, Clock and Serializer Rx
( p7 N; }" M% f** Output - Serializer Tx is connected to the input of the codec ( y2 W$ ~4 Y2 Y8 G5 i
*/+ o/ D- _" w4 W
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ F" O% W$ H2 P- K yMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
/ ]/ f( P9 q- S2 g6 \McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 a$ k5 b7 f$ N| MCASP_PIN_ACLKX
3 ]2 c$ R1 D- u- l. I, v& r8 g+ Q| MCASP_PIN_AHCLKX
: L: _, I s- |8 ]| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */8 `7 q9 V( a& Y4 V+ J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR X# N, O2 u s) L+ T- c
| MCASP_TX_CLKFAIL
" Z& @4 N% f4 h; n. J2 D( t| MCASP_TX_SYNCERROR
6 c3 c0 d8 K. N3 e( i" g| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR , l' K h( c9 J. Y. @
| MCASP_RX_CLKFAIL1 Z" s+ ~2 N" m. v
| MCASP_RX_SYNCERROR 4 ` N' n5 z3 ] P' ]6 |
| MCASP_RX_OVERRUN);
, _2 |0 _1 e$ a0 |0 | u} static void I2SDataTxRxActivate(void)
% p6 E0 C; b$ e{" M( |4 u& Z4 o0 L
/* Start the clocks */
/ [! w C6 h' ]- I6 qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" }0 r2 I2 j) d2 s
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
5 s! l( U! U0 Q* D7 g( ]" VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 @# A4 m4 r" C: y9 y
EDMA3_TRIG_MODE_EVENT);
2 j; e' H0 {/ {; h2 j' B% Q+ ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' F# ~% c: p& [# O' f
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; N- Y7 D/ m1 q! D3 H# n! l- T: dMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 }! w9 m2 A! }8 b0 V. F5 W9 A
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
! R5 G7 c5 Z+ C. T* B9 T/ P) Zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */2 I+ _9 H5 V% K: n
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: s3 A) w* X( j% E. {McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
8 ]2 Z8 K7 F. w1 ?: W) o3 B! g, @, w} ) Q$ A0 n8 E$ ]. M
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 o9 M% ~! R3 ]+ D# s0 _% C |