|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,: `: r" L+ x- p, a
input mcasp_ahclkx,
Q2 q' \) G. m8 A1 minput mcasp_aclkx,& A$ t2 o E. c7 m) B" \3 V
input axr0,& U- Z! J: |0 X! S+ ^
y/ P; O3 G1 C7 t1 m- r6 c; k% R& D" k
output mcasp_afsr,# X0 S7 x7 y! K7 \/ u! j& l
output mcasp_ahclkr, W6 X0 H6 V! a6 ^# I! {' m* T
output mcasp_aclkr,. W5 z) Y; b& l+ O! D. R0 [ W
output axr1,$ ~5 ~7 d# b" L' G3 \4 f
assign mcasp_afsr = mcasp_afsx;3 X) M1 r, m4 _- V, I
assign mcasp_aclkr = mcasp_aclkx;7 ^$ t3 H& N; @# u2 l: v
assign mcasp_ahclkr = mcasp_ahclkx;4 b# d! h" |7 n7 k" k" i/ B, T) K
assign axr1 = axr0; 4 r0 w- U# ~1 ?* d
8 v0 x8 E9 V/ L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ U+ [6 N# s1 ostatic void McASPI2SConfigure(void)) ~+ F: ]3 {% _/ J% [
{ ?- ^0 R, w# w4 V
McASPRxReset(SOC_MCASP_0_CTRL_REGS);: X* W; F# H, c* x* G9 L& O
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */# X+ s, s, u/ G: c$ y" |* g% b
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; v8 a0 T7 y8 X3 B) |McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */1 G2 X4 \) ?, `5 K) H9 P8 k/ \
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ P3 c8 w' |4 A: _- }
MCASP_RX_MODE_DMA);) A3 V6 ~- @1 z; @- v
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 b. P0 U$ Z0 \" H
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 ]6 a8 t w6 f3 ?McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! K' r! x4 T* r6 i0 R: h; j0 g/ CMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 [: Q0 j" U. u& e& R0 r9 x2 ]/ z. X
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & {- w- h# [$ o, H9 y, O4 E/ h( B
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
9 Z6 _) _, f9 QMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);' I; ]7 W1 h1 {1 N1 f+ ^' J
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! X. _$ J1 m6 K) ~* |McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 K) v$ z2 [9 c. K( J# k/ g4 Z' `8 `0x00, 0xFF); /* configure the clock for transmitter */
/ p" s# i* \$ U% E9 S$ s+ G/ B7 l" EMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, ~7 w+ h0 R' t7 g& u" \
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); & I# r3 S/ y. Z% G5 X2 i$ Z7 |- k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- G5 v8 V$ t- n. E0x00, 0xFF);$ |! v- w0 ?5 I5 d% O
* c+ J+ b$ v" P' O
/* Enable synchronization of RX and TX sections */ 6 t, T. w# h5 q( v$ ]4 a: O2 n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ ^) h# R( k4 y1 ?) u1 l8 rMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 y0 w2 u5 Q- I' T$ D5 l" {: E; ~
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
& Q% `: _, i, ^** Set the serializers, Currently only one serializer is set as
: C& _; _7 W' [% x4 x8 ]: V8 l3 x** transmitter and one serializer as receiver.: _6 d) ~ p4 ?( u3 h' L9 B2 A5 A
*/3 k& _4 Q* Q+ _* W5 {! I( Q
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! ^, L; Y- t; A/ H7 p/ K, aMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
2 K: b- l+ Z9 m6 |' i" Q** Configure the McASP pins
# ]0 Z# c# r" j& z) _6 X** Input - Frame Sync, Clock and Serializer Rx
& J6 q9 t3 [7 G' E** Output - Serializer Tx is connected to the input of the codec $ |! r) g, u# H. e0 B6 x
*/( r$ Z' n0 {0 R" j/ d8 `% c$ I
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 ~/ J0 k$ Q B. P& M. M
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ F; Z$ U. \- J$ g$ W
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; }( \1 N3 H7 V3 l6 `* K$ E' V
| MCASP_PIN_ACLKX
6 {0 k/ _: d) d; f8 U| MCASP_PIN_AHCLKX5 }/ R9 |+ i1 _; G
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
1 t' `( H4 z0 g) w5 t& HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! p1 |1 H& a# u/ \| MCASP_TX_CLKFAIL
' P* e6 P/ t3 S4 R| MCASP_TX_SYNCERROR# \3 n1 ~7 K" I
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% n. l% T' N. H2 j8 p" `% j| MCASP_RX_CLKFAIL
& ~; [: u5 m" k2 P8 }| MCASP_RX_SYNCERROR ; q9 I7 H0 j3 U% C+ l2 Q# ~
| MCASP_RX_OVERRUN);! Y/ F) c/ Q# j0 v; L. F5 f3 [
} static void I2SDataTxRxActivate(void)
4 e, }* ?$ S) ? j* \$ _{8 }! Q" ^1 L9 t7 A
/* Start the clocks */+ N: k, M+ \0 Y8 V" f0 ?
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);4 W0 v3 C" N; x2 G& n" N4 c$ B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// K( M6 N. U/ L7 V7 [* x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# F7 R; g- f" S' P9 f8 u3 qEDMA3_TRIG_MODE_EVENT); f7 X! C! L; a
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, - E) ]& {! T2 |$ Q5 m7 C" c$ ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
8 P6 I" W- Y3 I6 r3 p5 M1 W5 VMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);, n1 X5 o" v, X5 P4 i1 v& G J$ K
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
6 Z1 s/ B# X5 {% a: owhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
. j8 U' w W# EMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 E; A9 c# f. R, N" Y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);) x) C3 [: Y+ W% S @
} # G% i5 K+ {2 A _) b
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. + T+ l% u* q0 B+ m A
|