|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," ^7 \4 F/ }! e/ n
input mcasp_ahclkx,
' y/ Y9 i9 u- t A9 p0 H/ T& `5 uinput mcasp_aclkx,& W& s$ H* w. U. O
input axr0,
! m6 C+ T# W+ y! N+ Z
3 n1 y9 D, }# ~" C5 {output mcasp_afsr,% Y5 C: j9 A$ e" B" ]! k A* r9 G
output mcasp_ahclkr,
$ M" k. Z v+ X9 Y, q' coutput mcasp_aclkr,
4 h) f: d% [# [output axr1,' a9 }! Q0 E& Y% |" ~
assign mcasp_afsr = mcasp_afsx;& V+ o- n; j# C5 Z9 I
assign mcasp_aclkr = mcasp_aclkx;
) ]7 H8 g9 E# t- l% R w/ J0 f; fassign mcasp_ahclkr = mcasp_ahclkx;+ P8 ^: E+ T9 |! _: |
assign axr1 = axr0;
9 I4 H3 G5 |6 X& e, t1 Y5 S/ R
7 t# d. _. n+ e* q1 d/ m在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
7 D' M+ ^. q% ^, Q9 Ostatic void McASPI2SConfigure(void)$ H7 ?: q; n6 e+ i
{
" B5 B& ?* j+ a7 W# Y# n$ ]5 AMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 Q0 A; C# b3 O$ ]+ }McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */7 r$ `5 ^2 U7 x3 I$ W1 Z
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 B+ G/ ~" r; f5 D, H/ G8 i
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */+ v/ i( `8 N6 K6 ?
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 U) D9 Q6 W& u1 ?" H
MCASP_RX_MODE_DMA);+ E3 N9 b% ?, A, V Z- N: I" j
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! _, ?& E* `) _. r1 A
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */) u& M! `) |+ ]# J
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 r% v i3 H" ~& M% M
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, p. p. b' M3 T4 g
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 b6 J$ F* o8 [9 ~% |1 b5 nMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, m- g* j3 s' f" r2 k
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
5 {5 A/ f: U2 ?McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 y2 a/ O' D3 F8 A UMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 E1 l3 s* e4 K7 v. [* v T f( g1 n
0x00, 0xFF); /* configure the clock for transmitter */
3 t% U3 q, Z N) |3 DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 k4 n6 r0 G/ I* R+ A, q0 E" a6 dMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 k* Z) v0 H' f- ]! D
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 X0 O6 x5 J$ R$ a6 V. u. j
0x00, 0xFF);
0 F/ A' E- i- Y' _$ o4 K' i3 D. @- \/ \& a% U! K5 \1 n& S# h
/* Enable synchronization of RX and TX sections */ 2 v, S& w) n" G }7 M- w
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. y, S* P5 d3 J3 P4 nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);: H9 K- f4 q. z5 K, z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*9 E6 }8 Q& M; o4 L0 Q
** Set the serializers, Currently only one serializer is set as. f4 [; m- Q4 m) ^8 \( }$ U: v
** transmitter and one serializer as receiver.3 y8 v U r* c8 ~ w9 z, k, e- h
*/' }9 q1 {7 _2 V! _0 d
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);2 p& m7 |0 e3 ^# B% d# {
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
! y4 X7 p/ d# C5 X** Configure the McASP pins / V( B4 z+ v) N, l" m" m- Q
** Input - Frame Sync, Clock and Serializer Rx; n, ~6 [- e, ^$ z1 W b' z8 @/ }2 w
** Output - Serializer Tx is connected to the input of the codec
& K1 b7 O) G# c5 k, Q*/% g- o1 J9 ?6 O% H: e; y
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" ]5 n4 p& z$ s/ H& l3 n3 t
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ @- K7 ~+ Q, J$ B! B
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
6 @& i9 b k1 \1 M| MCASP_PIN_ACLKX6 T; c/ W% k' [0 Z- u
| MCASP_PIN_AHCLKX3 w% I3 E* Q& ~: n0 h% V
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% W4 e! w, X, Z7 zMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) d/ n. f) C5 M( Z+ _$ e
| MCASP_TX_CLKFAIL . L7 q$ ~1 L8 B3 S& R
| MCASP_TX_SYNCERROR+ g' Z" A! R. n h% ]2 u/ ~
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : x9 P5 M. X% F! c0 G
| MCASP_RX_CLKFAIL
B/ g( ]$ P |% q4 x) V| MCASP_RX_SYNCERROR
. Y0 u0 J+ e, E8 J3 F$ O0 t- l# _| MCASP_RX_OVERRUN);
' Q, `, j9 r# M' j1 u! S' z: p. T} static void I2SDataTxRxActivate(void)& O* O- o& `2 Y2 ^
{
; |) u/ N; { u E/* Start the clocks */& O8 `2 J) R% |0 O
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 g1 O; y2 B9 E1 ]$ I0 j
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */) r+ u- p2 o) ~/ J" p9 |& x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! k5 |; \, j/ `2 a4 V) ^2 eEDMA3_TRIG_MODE_EVENT);
7 c, C" o4 [/ B! MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 n3 s6 ^3 s, X+ J9 [EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */3 E& D# g" m9 Q. F0 S- ?
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 f/ q' [ d4 B) ]: o0 z3 }
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */7 K. c1 }4 D( ]
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
' H& J. F% A% p- G$ U7 `McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 R! D! @/ v/ VMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' M# J6 S( z) q8 a. g2 v3 ~} % N, Y1 l$ M2 [, [( [2 m: ?* k
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' i' o& a( H& L3 |9 B
|