|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,; v, r6 _; F$ q. M$ p; _- w; }, C7 ^7 P3 g
input mcasp_ahclkx,- m! K7 _* n+ {( h. J' i7 \
input mcasp_aclkx,
& E1 Z) K2 i" K: D7 b rinput axr0,8 }, S' Y3 m# I: j. C3 n" W+ F
" u2 u& [0 u$ W# f2 w9 y9 g0 `- n1 ]: ~
output mcasp_afsr,7 n8 V B! j5 {: Y/ C; D/ L, e/ u8 A& X
output mcasp_ahclkr,
6 C4 O4 j+ X( G# l5 K' z6 ioutput mcasp_aclkr,, _; g3 y2 p( C) {
output axr1,
- _' E3 c. j, D- R+ c assign mcasp_afsr = mcasp_afsx;$ W' G* a6 I5 i1 d& t
assign mcasp_aclkr = mcasp_aclkx;9 h1 g* w0 w; k" I# ^
assign mcasp_ahclkr = mcasp_ahclkx;
2 L; _% E) L( lassign axr1 = axr0;
, J5 k7 y& v( R1 x {
/ n j9 \' \* \ U! a" ?( N- C9 P在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 & y j' ~5 ^% W
static void McASPI2SConfigure(void)
( P' g% [! ]7 y& }, b: ~; D: H9 u$ b{
4 ^5 f: h0 Q6 ]4 jMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
! {0 v: p2 s8 R# W$ {; r! UMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ H2 O9 _( _3 H5 S' i: y7 S) M, \* T) S/ S
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( z& M& G& q# w# d3 [" C' rMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
- {" O8 D% h. S& H. h3 O3 Z+ rMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," u. O' l0 Z+ ] T! `2 n
MCASP_RX_MODE_DMA);5 N. }9 Q! ~" ?( X$ ^
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: w2 G7 G( n; O3 y' [/ V/ t" f
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots *// n+ t8 d- `' A) U
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
7 a" V( ^! f5 cMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) k: H3 J9 y% S, u0 Z; N
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
z; H& K. r3 ~! T& cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */" C4 k9 G5 I9 L) V7 ?
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 S9 _3 ~8 L8 ?" g+ a5 l/ M- pMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
7 s$ R8 g, {3 FMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
7 H4 d. k+ t5 o1 h6 ^4 N0x00, 0xFF); /* configure the clock for transmitter */
4 } N! b+ D; S5 FMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);1 O2 T8 [( a% K+ M. Y0 }. o6 L" s
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& q; s E: H2 z c5 ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,9 }4 i u; r( d
0x00, 0xFF);
+ y& o! j9 p h; a( U3 r
* X5 V0 C/ w+ h/ [/* Enable synchronization of RX and TX sections */ 6 \5 K5 {! `0 I2 `$ e
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 P& N4 W$ P/ s: P, xMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ A. t1 b5 j' [McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
# a) f$ L- Y* c; ~, U/ O** Set the serializers, Currently only one serializer is set as5 z! r9 K- `% ^; C4 I- G8 H
** transmitter and one serializer as receiver.
4 a! f7 ]: h# J) M: x*/: W G4 K/ n) Q7 ?# ?
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);" X" x+ C8 V( o! N0 X; X3 q
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*# X% }$ X/ F# g1 `- x
** Configure the McASP pins ; e1 K, n0 F2 X# I- P" Y' d3 ?
** Input - Frame Sync, Clock and Serializer Rx
8 l9 m6 @$ Q/ q) N5 O* ]** Output - Serializer Tx is connected to the input of the codec $ a, f& W' d. k, ?2 `) q
*/; j: O0 q2 Z" {- N- Y( q! x* O
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 N) w0 \& K/ O/ `+ ^McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" h: U( k, j- u2 V2 g) F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! n) `6 Y' Y- d. G. x| MCASP_PIN_ACLKX" Z* M( N7 c9 Y4 {! ^! N; V$ K
| MCASP_PIN_AHCLKX
! T$ [% w6 S) E' Y2 C| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' D1 ~) v) Y/ K! O0 D4 }/ L
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 v& L: z+ a* a. o9 W| MCASP_TX_CLKFAIL
9 J" \, G5 t m' ^$ m' I0 H: r- }| MCASP_TX_SYNCERROR* c# Q6 H) Z( ?! W
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- z, n( K# p1 f6 p: Y) g| MCASP_RX_CLKFAIL5 k- s( Q5 K" K) z9 {) D! Q7 B3 X
| MCASP_RX_SYNCERROR
2 i) k3 k* `# w2 V| MCASP_RX_OVERRUN);
! l& ]$ P* O- y1 z) g8 x0 ?4 ~} static void I2SDataTxRxActivate(void)
m5 b4 O7 g1 I( Y) a+ \{
1 F' r& f8 Y2 c' ?/* Start the clocks */
/ G7 q' M% L f* ?$ K9 @, W1 _McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* V( n4 i3 Y# [. B/ `6 T0 S$ W- i
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
* p$ A0 e$ S# O6 ^: Z1 r# L% iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 Q, }' V/ @8 B0 o1 I8 \1 W) FEDMA3_TRIG_MODE_EVENT);9 a- R' D: m9 l4 \+ {# J
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 D. ^& T6 u7 t, y* f/ o
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
( Y2 d( Y, S7 ` lMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ c8 U9 s9 ]+ X! H5 P! m
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
; N4 b2 d$ e# H: W' Bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
( M {: `+ N( @" uMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 C6 m+ u9 Z& b3 d* J6 {
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 B) w" [2 y' p/ w} 4 ^5 c8 `$ Z; S8 E; f( Q1 H# ^
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: m/ R" m9 {; g. L( ~ |