|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx," i; A2 `: u: K' j
input mcasp_ahclkx,
; }$ ?' |6 k6 |* I" k+ B+ Rinput mcasp_aclkx,: i$ Q# i6 `8 {4 w& o! J
input axr0,
9 v! B; x$ t! { d, H: V, O" z* Q& h
output mcasp_afsr,8 l1 A& I# ]+ A/ v" l
output mcasp_ahclkr,
# V" g( B3 l& z& v0 A& toutput mcasp_aclkr,2 v/ T2 H, M5 U4 Y
output axr1,
4 W' F6 }: Z* s7 ^ assign mcasp_afsr = mcasp_afsx;! F" v* w/ ]0 [
assign mcasp_aclkr = mcasp_aclkx;$ |! c7 w/ Y( y
assign mcasp_ahclkr = mcasp_ahclkx;/ g" M8 q8 Y3 o8 T8 N6 w/ _/ T
assign axr1 = axr0; * u! o4 _1 q$ h# B
3 Y2 V: R0 \) Q/ u
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : U" E4 L& C0 f- s
static void McASPI2SConfigure(void)
! ]! N! g% [& V0 M3 P{
7 g7 Z) J ~6 D* ^ |' m( zMcASPRxReset(SOC_MCASP_0_CTRL_REGS);2 D+ s1 m/ Q7 E& F7 s+ J$ B
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer *// S @ x7 g' o4 O- Y
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ x' U2 f/ X6 y4 [: k/ U3 e) h
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */! a# R0 r2 i0 `( k
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 \% s: Q$ u, p5 x# V
MCASP_RX_MODE_DMA);
; f" y. s5 O* ]1 O L; }McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- u' S" z3 l# k! |# G# SMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
( x" |" r) w- O4 g( NMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ q6 h, x" n) m9 l' S! y7 bMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 L2 M. o6 N: W1 jMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 z0 k5 C3 T7 b2 W
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
7 }* E. F/ _; t9 z' i jMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; \0 W/ \% a3 f8 B# J( X2 H
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) C+ [3 c: T5 X0 _) D7 ?0 K2 T
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. ^" T' U9 V9 m% N* O0x00, 0xFF); /* configure the clock for transmitter */
+ {$ k* ?/ ?& B& N4 d. kMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& a5 O: i. r w) A& z* ~) TMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # Y6 V! }" Q! C0 k& @3 t; H
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 ^( r& F% N9 x; |2 U
0x00, 0xFF);
. G) K3 g2 d. [+ m3 y% e( F! }+ C K- ^& u5 a- G
/* Enable synchronization of RX and TX sections */ ' B. c# x! n) t2 x7 X
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* J* L% R+ ~ m9 y8 D: K
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% k) L) Z. ^+ Z6 D& xMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 ^" S- b* `( N3 o% `8 {** Set the serializers, Currently only one serializer is set as
( o$ O- j7 t9 x** transmitter and one serializer as receiver.
" r0 S. r1 ?! S! a9 n7 u/ [*/
+ ]4 J* N/ r& D+ s; hMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 N8 a/ k; W9 ~3 @3 ~McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*" \& y3 q) _" y0 p5 |! c
** Configure the McASP pins
; t. F3 {* f# M5 Q# e9 J1 t1 j** Input - Frame Sync, Clock and Serializer Rx
1 \8 }8 ~- E# o9 ]7 C" c7 c x+ z** Output - Serializer Tx is connected to the input of the codec 6 Z1 g, c3 _) p4 _5 ]
*/! c; j; `6 }9 k5 s% A! h) Y5 C9 I, T
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% r, k! ^3 Q f% {McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: n! x, o& I0 k0 h$ w2 R# n# }5 L
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% L' [1 P; Z" A' |* }- F0 b
| MCASP_PIN_ACLKX
& w* m+ e; ]5 q) o3 a| MCASP_PIN_AHCLKX8 ]" O9 }3 ~$ r1 j, G n& I
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */; O6 A1 ]0 z, @2 [* V' o
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + G E+ O5 N2 _6 r! I
| MCASP_TX_CLKFAIL . ]9 \" z# d3 |! B( f( W2 a; l
| MCASP_TX_SYNCERROR7 _. H5 w. o( C6 b
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - o* @- _: b0 S# U0 c) i
| MCASP_RX_CLKFAIL
' i1 w3 ?& e- Z& ?* p- W9 Z| MCASP_RX_SYNCERROR & g% j5 i/ a3 z
| MCASP_RX_OVERRUN);) V4 Z9 l' ^( L3 K2 S
} static void I2SDataTxRxActivate(void)
" y( j. }, J0 \- Y6 n) r{2 L" g) [6 R) h9 ]
/* Start the clocks */9 B B5 ?# M6 E/ p: g: E8 K' v. V
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 o! \4 a# y, P, @7 t* SMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
1 p- \4 o( z* }5 _' ?" C$ K9 OEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' @: W# w/ R/ P3 m9 p$ }( w8 S6 }8 UEDMA3_TRIG_MODE_EVENT);
+ k3 e" N! e+ {# k6 aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
p4 [' H ?- ]EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */! G, Y7 }9 B$ P, E( h
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' q% [2 N9 G, t" O3 {. g) v/ OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */5 G, _& ~0 }8 h
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */9 @8 D3 f9 ~: i0 @
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! g, F# G7 }) n$ a; ]; w8 BMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);# ]1 G Q% o X3 i3 H1 n
}
& C9 S; P3 S& x请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, ?3 K6 R/ m8 ~$ w* D$ S |