|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," B4 L) W$ a) b p- u$ F2 Z8 N, p
input mcasp_ahclkx,
+ s- R0 s7 ^' n7 winput mcasp_aclkx,
. v/ b+ J0 r B8 k3 ?input axr0,
3 t+ _: b5 \8 Z* H8 _, ]6 T9 F1 _$ s& c% O& o+ U D6 z0 d
output mcasp_afsr,
8 H& \7 q9 X/ P' ^output mcasp_ahclkr,
; d: a) Q* Z2 u# O5 w: c; Y# \output mcasp_aclkr,
+ [! |; \! `6 z7 c; [! i4 x9 u3 j' ^output axr1,3 k/ C" O( @. ?0 p" c+ F4 q
assign mcasp_afsr = mcasp_afsx;& q4 F& v0 T! g: r) c$ Y
assign mcasp_aclkr = mcasp_aclkx;
% t7 B1 i) A7 y0 T. k" u' v+ a. yassign mcasp_ahclkr = mcasp_ahclkx;2 m" H! {4 R+ g: A; r' d; f* R
assign axr1 = axr0;
, T) n0 @6 b% N$ |# C
: }+ p7 E4 J) ?4 R4 P9 V$ P在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
2 s" S( F; K7 P' Q2 o Ustatic void McASPI2SConfigure(void)
" X; P3 u, T' I3 C; {! @{
' @, T( ^2 U7 @McASPRxReset(SOC_MCASP_0_CTRL_REGS);* K; {/ R# G$ N7 V, }& e
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 `+ h1 D" p4 G* n4 y; S3 o! ]McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 g2 n9 a! g) R
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
9 a7 x9 b7 K5 f1 O% V$ i/ F: I, P0 v. GMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," K X3 _, ?. _
MCASP_RX_MODE_DMA);7 l8 X. b* h! r, Z W4 { K2 ^) u
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 v3 L) [) z7 F8 RMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 k/ z/ D) Q0 i+ K, h8 i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
4 _& X# N [% Z: G6 CMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ T0 G7 Y* i3 `& F K' H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 i% U; `7 p" [, S
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
, O9 F$ s3 r' \8 uMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
4 W" m) D( \* L+ F* |0 X, h% z3 PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 G% \8 k0 V& F' y
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,. v; @, w' H2 d6 K/ w& I
0x00, 0xFF); /* configure the clock for transmitter */9 u- t% x- ?; m; t: K/ |
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' \- m# O" `; \$ l! i+ ]3 e6 w
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / m, J. F! b$ |5 H# ?) ^
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, Y4 Z- U6 k6 r/ O
0x00, 0xFF);
: |) W' B E# r, }! Y- j) @! B( s5 |2 {3 h/ s9 O* f
/* Enable synchronization of RX and TX sections */ . r" y" [, k/ e# _' I: |# s
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */! T6 V( P4 I" S
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
\8 u0 s) [; l% R$ d8 \. p9 oMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
% S! g& f" C) Q** Set the serializers, Currently only one serializer is set as
# A! \" a) E2 h+ @** transmitter and one serializer as receiver.$ P3 J8 N6 | T' t- z
*/
* \1 a# r& M- x8 ^( `: aMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. B% B8 ?' X0 E5 [2 a3 W+ ] S; r( sMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*9 [. H1 m- X2 h/ W: }( C
** Configure the McASP pins
% m2 e0 w) [, C% S& [7 R** Input - Frame Sync, Clock and Serializer Rx2 t! z; D( H5 g. p0 ]
** Output - Serializer Tx is connected to the input of the codec 0 s8 a5 ^+ k4 l4 v9 y' Y5 O3 m: R
*/' C7 ?. ~+ V+ Z7 f
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
+ M5 M- M2 d) \McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ S9 `. m$ ^, t* y- U3 J
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% e) u9 D. X, H
| MCASP_PIN_ACLKX& _6 D/ I! D, n' C
| MCASP_PIN_AHCLKX
4 ` z8 c" e" a+ h| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- ?+ M( b5 W, K8 Z
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ R- H* f( z% M3 M0 u, L. u| MCASP_TX_CLKFAIL
7 o0 B: w. N" t v$ Q) L| MCASP_TX_SYNCERROR$ {% ~# r& M: g3 U# E
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 A! |* l8 `0 M* J. l( n: M9 K5 d
| MCASP_RX_CLKFAIL3 y' V3 m1 y4 b; h0 B0 y/ g/ b9 A' ^
| MCASP_RX_SYNCERROR
& ^, _ V' m1 E: `% c| MCASP_RX_OVERRUN);; W# P: _7 H9 R, Q3 }( q
} static void I2SDataTxRxActivate(void) `) p. L, O8 ]' ~& S
{
# @. Y* b: m& L, ], s; j/ L/* Start the clocks */
3 r4 s+ }( }1 }4 ? @1 V" VMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 H3 H% v O( M* g/ b q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */5 h* B; C, K) W% r: x
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
, w3 d- E+ X4 r/ u! j$ n$ wEDMA3_TRIG_MODE_EVENT);3 r4 n4 `. k; o1 v+ N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ q- A }9 T5 j5 A- f& XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
% X7 r( m) J- W* H" s- h5 a2 RMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 p0 T3 Z# l+ _8 H! ?% R" G4 l
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */3 D* T7 O& j" M4 ^' ^2 s
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
* ^( c z% c/ w7 t: y) tMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);; r) ^" n5 h. L; |5 B* d: }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. A2 X+ q" \0 a$ H9 Z) B
}
4 ~/ a' j8 i. Q1 |2 x* v请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! @) Y1 m/ n$ [, k# l& t7 y |