|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,% c% Z7 p3 E# H6 y0 m: Z
input mcasp_ahclkx,1 s# C) s% Y- L; U: W# m
input mcasp_aclkx,
+ ^' Y/ N( f+ }6 U6 [( zinput axr0,
- o+ _5 H% r. P4 }
3 A. o3 Q( f+ t3 Routput mcasp_afsr,
- V! i" R# U0 \' P7 k! J8 u2 Youtput mcasp_ahclkr,! Q& Q8 C6 F6 w) E1 @+ d
output mcasp_aclkr,9 X. e1 w* _, s
output axr1,& R( o& T. V) d# P
assign mcasp_afsr = mcasp_afsx;
$ A/ i0 ^/ K, W0 ]assign mcasp_aclkr = mcasp_aclkx;) U4 x& Q) p$ n0 j- O; j
assign mcasp_ahclkr = mcasp_ahclkx;) [5 g1 E" l4 h
assign axr1 = axr0; 8 H" o) O3 \3 W2 Y
# u) ~; S% Y2 ?! U! i+ k$ O( R
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + h9 F# N# J( [. c
static void McASPI2SConfigure(void)
& o% @' J p# E{7 V" C' W4 U4 q+ D: P
McASPRxReset(SOC_MCASP_0_CTRL_REGS);) s! a, H. L! N- \/ q& P7 n
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */* j5 Q* Y' k8 v p
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 p/ ]9 D w* G' EMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */. N0 w2 y- A) Y. |+ p" _
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& I/ v' k6 [5 I# O. D- W$ c( U
MCASP_RX_MODE_DMA);1 w$ W8 J( ~9 e! w' ~7 F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* {5 }- x9 a$ Z% i2 a
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* A* D# i3 O0 @5 U9 [! C
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% S: a) j$ W1 D0 ?# w* ]% rMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 Z' X! q: a1 D6 Y( h
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
8 H6 Q z8 V+ J& i8 }MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
6 b. d; r# y Z, k4 b, T% GMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);* \: r7 J, m1 v7 k4 Z
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& [9 T1 `, n3 a/ ~. ]McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ P" }9 N. }+ v0x00, 0xFF); /* configure the clock for transmitter */5 f: ]' L, T4 q0 e+ ?# M
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- p {; G0 R0 R5 D xMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
Y2 T; }) v! `5 p' d- L, ^2 kMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) Y: l) Z/ V4 J$ t5 v O* J
0x00, 0xFF);# G* C/ D- ]* g
% [+ H( e7 ~7 W: F5 @$ y2 R+ `/* Enable synchronization of RX and TX sections */ 7 K( w u5 M. V% E( Z
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */4 i: w! U/ }5 l
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% h: j- X' ?' @% JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*, Z* }' X% R5 e5 W. S
** Set the serializers, Currently only one serializer is set as
1 o% g+ N( {9 V' K# C4 L** transmitter and one serializer as receiver.
h# i2 n& \7 j# L*/
H I" O2 F; ^& m" LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 c/ l! w/ P8 K- HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
0 b6 ]" d Y- ^: d* H** Configure the McASP pins
* Y7 Z6 F1 |. U** Input - Frame Sync, Clock and Serializer Rx
( S3 i0 W0 l: a# w& `+ {** Output - Serializer Tx is connected to the input of the codec 2 ~+ ~! W. a# r/ g" ~
*/
" r# ~. f7 b V/ _; K3 hMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' { ?# k! E: @ }( r& n
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
e' d( o5 ^; R$ F% K. A4 ]McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, P& Q( N9 a! h% r, H, s1 W4 O4 t
| MCASP_PIN_ACLKX
3 N5 P- ^& q/ {| MCASP_PIN_AHCLKX
1 S0 e3 ~5 T4 M% Z& d- U3 l; X| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */# t# L: Y; n1 F
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 P$ i2 W+ o! z4 L| MCASP_TX_CLKFAIL
7 F0 \7 m4 w1 ^4 x1 O8 ?- I| MCASP_TX_SYNCERROR
/ y# C5 a' O' [. I7 ~6 F. `1 M& L| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& j$ N/ @4 X: @ F ?0 G* ]| MCASP_RX_CLKFAIL
" G/ E; U# R& M( }) N. J0 r| MCASP_RX_SYNCERROR * |- z4 X5 o" i. l9 m! H2 W$ l
| MCASP_RX_OVERRUN);# d0 Z, K# m' x; [
} static void I2SDataTxRxActivate(void)
% L4 b& P+ {, B( M3 u5 n{
5 A" w6 g% K1 n" p P/* Start the clocks */
: H4 v- K; I% j5 }4 QMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 L+ g' k* K! ?' z; m8 B+ {
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 a: _; f! G* W1 f7 q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 o/ m: t3 g. D
EDMA3_TRIG_MODE_EVENT);
* d% m8 v* B. O2 T3 eEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
. H- ~6 g- i5 q fEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */9 `- y2 |4 a; k6 M9 X
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 y! ^3 f( V" Z1 Q7 c
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ W1 h% A' z6 U+ k/ @8 m6 ^while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */% f& u/ ^7 M8 `9 Y& h
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ Q" ^/ ?7 f) ~0 s% y3 B& N3 g9 h
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- V/ p( c! l# O+ }9 f& Z. ~+ c% }} 2 Y% X+ k |; g4 x6 V
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ z& |- ~. d" t* L0 F' c3 B, h8 r9 ^
|