|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
i4 I5 l6 l1 Minput mcasp_ahclkx,/ V* O5 p3 z$ A4 x1 Q
input mcasp_aclkx,
% @2 m8 n' Z/ s% }/ | I8 o4 Kinput axr0,
! P6 A+ }# o3 b" P. s0 z9 J' t9 ?
6 G" K" G; a) v2 A4 _5 t6 Y3 `output mcasp_afsr,0 v0 w* r6 a# N2 @* o3 s
output mcasp_ahclkr,
n, U; K" X l* foutput mcasp_aclkr,
/ ~% m- V: o! v6 E" Ioutput axr1,
4 r. K9 I& P! B# Q assign mcasp_afsr = mcasp_afsx;% }. V9 V; P' e$ i+ O; I
assign mcasp_aclkr = mcasp_aclkx;1 m0 J1 Y4 P$ Y4 `' m$ _1 H* `
assign mcasp_ahclkr = mcasp_ahclkx;
( K0 `4 L' q+ L$ P. Vassign axr1 = axr0; " O% e& j7 e$ w3 H; I$ `! s. \* N
/ G- o1 r( @, h5 [- F Y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
% {& B; v" a/ D* h/ ystatic void McASPI2SConfigure(void)
" o4 @; k& q# J8 J5 q{
, k" j$ L9 V/ Y' p; BMcASPRxReset(SOC_MCASP_0_CTRL_REGS);# [: @" c {' s
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
) j5 _5 P3 M, g# ^McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& I3 W* G8 [, m
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
7 S1 k" \& s) d2 Q* ^4 s* QMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( c$ f$ W/ @8 ^: V$ s7 N, AMCASP_RX_MODE_DMA);( k" t, h" W' a7 k( L
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) i C e! B( u
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
) v' [" X6 B& n- CMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; ^' h' G# X! M2 y0 u
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( }( b7 O: `1 A: ~: H" y% gMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 0 k; k% D6 ]' W& H7 l& ]: G
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
" ~9 m& u8 l8 ]$ nMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& ^8 ^' _( k7 G: u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 b. q% o. Z$ T* w
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) I; m2 ^' }6 B' Q. _; {( `
0x00, 0xFF); /* configure the clock for transmitter *// H1 l, L6 m' e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, ^% u q3 S% O: Z( H# u
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 y4 x+ p- v9 X0 T) k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' g# l, D) \2 ~4 g: T0x00, 0xFF);
) z! X6 n: P& \6 G/ N% {# w) T( N0 {7 f& A/ j
/* Enable synchronization of RX and TX sections */ % W4 K7 ^5 }; T! A( `0 u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */' E9 q3 k$ [% L U' D8 g$ n: c& W/ S
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( c* |8 M2 O& H, [McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
$ N1 r Y% D$ u** Set the serializers, Currently only one serializer is set as
" j) j+ J. i9 w D4 Q4 l1 g** transmitter and one serializer as receiver.
1 ^1 g+ w8 j: ^- g1 W" j*/4 a5 S* ~/ B& w/ a2 y8 y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ Z: {& h$ e+ `* \2 Z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
$ K( _# ]; Z | Q* \7 j0 f** Configure the McASP pins
; q4 G- y4 r4 g7 y' `% s& Q5 I** Input - Frame Sync, Clock and Serializer Rx
* k' m8 P% ?( J# t2 d** Output - Serializer Tx is connected to the input of the codec
& U8 A4 x: a$ r7 w) S1 s5 D*/9 d1 l `5 l7 d$ K# A& n
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! W5 O- j& h+ m% l( W
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));. F7 @9 S, h8 v0 _2 U2 m: \
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- U" t4 {& q& `: o
| MCASP_PIN_ACLKX9 z, e& p% f8 v8 Q! G8 L A
| MCASP_PIN_AHCLKX
2 b" s) e# b! a' s& ]2 h| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
" O$ ]! N) D1 t2 C& s; [McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
1 `7 B' q0 w- w F| MCASP_TX_CLKFAIL
^' K1 E+ l1 q i( N| MCASP_TX_SYNCERROR O, J$ v6 M" A# u% ^" P+ l, r$ B
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & b+ i5 }7 V/ `& I, n2 Z) L7 y
| MCASP_RX_CLKFAIL
o: G" Q @& {! W| MCASP_RX_SYNCERROR
5 V- v7 B' A5 X# I: w! S+ t| MCASP_RX_OVERRUN);
' F+ l; F' X+ f) x9 a% `. K} static void I2SDataTxRxActivate(void)
- }( }8 z, @! ^5 G. H6 h" P6 H{7 ?+ b: Y4 d# t9 f
/* Start the clocks */+ i9 b/ x* S G
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) B% X& B/ \9 K0 A- G2 Y& uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
7 g$ z% R/ ^5 GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX," p% c e7 k* c5 p/ N" ^: ?0 e& U
EDMA3_TRIG_MODE_EVENT);
n$ q0 x) d: V; `. K! J0 Q* aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 5 j& d/ O# d, f- x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
8 g+ k: h4 C+ S* Q# @McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 }1 d, }7 ^- x9 w# uMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */6 F. n% l g1 G' V) x0 ~3 [
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" B, g- q& [% S5 Z5 M) _# F' A
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' J, h/ ]0 I( m. y0 XMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);' x2 s- N5 N2 A D1 \5 P
} 2 G6 ?$ Q! `+ Z( ^4 u' X9 D
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' {" x2 g1 j8 c: P0 x |