|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, ~5 X9 t3 q' v5 z$ f
input mcasp_ahclkx,
, s* V, G& x D( j. _input mcasp_aclkx,
$ F0 Z3 A" L$ _* rinput axr0,
) U4 ~8 W4 g5 |! x) M* L6 {6 o% h/ X% c, p Z2 V z D
output mcasp_afsr,9 c, c% [/ h* |/ P2 Z
output mcasp_ahclkr,
/ p2 P. `- _; Xoutput mcasp_aclkr,+ O; \2 o8 F$ k/ O) b# {2 _) G; x
output axr1,
4 Y& h% ^8 v& L8 v assign mcasp_afsr = mcasp_afsx;" v4 d0 \* M+ s" v8 m
assign mcasp_aclkr = mcasp_aclkx;
/ Z) j+ s) Q$ g2 Hassign mcasp_ahclkr = mcasp_ahclkx;
^/ Q4 v- W7 \1 dassign axr1 = axr0;
1 z* ]' m" M* N3 k7 a p, H* n
( Q, }, e& j: z4 v在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
7 {2 c- V( t# c7 m% V! r: T7 a2 F5 Rstatic void McASPI2SConfigure(void)0 Q" u9 h0 u& l6 i2 J! R
{
! P3 ]$ x( N2 FMcASPRxReset(SOC_MCASP_0_CTRL_REGS);- W* _: K/ i- ^1 e& `/ d
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
2 {* j, z; o, x# v. A. }$ K/ z$ P; jMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; X6 E0 V8 f& W1 u( g! O# O
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */6 G; W% ?0 j5 e% M6 I) }# q. y. n
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ s$ Y1 E+ q6 A( ?2 Y8 _- N
MCASP_RX_MODE_DMA);% `& a5 F% o5 X+ v6 b
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: V. D7 ?9 n) a$ ]. t: AMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */& Y/ n' o3 r* b$ ~# T( K7 b
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( E. Q+ M: J! j7 z5 `7 G
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);% _5 m6 ]% X. ?- j. E) Q* F
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / n' M. P g* Q* M5 P: `
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */. H" n. i3 O) U" f0 l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, b5 p4 K0 b8 a4 a7 o
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : w* o5 i! W( @! L: E1 }3 w
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,% k* m4 C* R. t* ~ Z- a
0x00, 0xFF); /* configure the clock for transmitter */
6 }7 u/ Z' @: \3 b* uMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 q. }9 i h$ bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ V0 Y! Z* X+ v" |McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- C* H) l4 ~$ ^$ Q0 ]0x00, 0xFF);
! [+ Z$ P/ T1 ^7 }$ Z( W; ^
& L8 @9 K5 V- q4 H* }$ G/* Enable synchronization of RX and TX sections */ ) Y; X8 K2 Z* ^8 I0 q) D
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
! k: i* Y8 R' f; h, L9 R$ ^McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);7 C# W. \5 d' B- e4 V2 Z! K
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 M+ M4 `7 C' g
** Set the serializers, Currently only one serializer is set as
& B7 }. m, p5 e' [5 E K** transmitter and one serializer as receiver.$ l" g5 k* @( C) ?2 n
*/
% X7 c; L& z! x6 S5 C$ e1 Q+ ]McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 S& X7 l. z' W e( R) H8 n% SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /* a) A, g) P8 @* g. B
** Configure the McASP pins
% p& S- B& @6 r5 k2 \** Input - Frame Sync, Clock and Serializer Rx) Z& Y) q- F0 P: e* b# Z/ R
** Output - Serializer Tx is connected to the input of the codec 6 X/ ]( w. c8 `+ X3 o! C/ }( u9 H$ }! V
*/
8 J2 r- z X% A1 W/ ~McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); y4 f3 S+ h- E0 @/ c Y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 N; ~. M+ g+ U9 i
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
. c8 f) X$ o- u: k& i1 ~% d" t* A| MCASP_PIN_ACLKX
) w0 ?! Y4 B+ a# I| MCASP_PIN_AHCLKX- t) I- \3 e! A
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
5 E7 Q# g% J9 F* ?- ^$ g% k( I8 _McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ( u/ g1 G! J8 B; G2 R
| MCASP_TX_CLKFAIL
- k* F2 P4 \1 l+ F| MCASP_TX_SYNCERROR
4 V2 B# i2 Q3 D6 Q( H0 T. ~| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: o, x8 o4 Z- V" _| MCASP_RX_CLKFAIL
" w/ ^* Q* f! Q1 U| MCASP_RX_SYNCERROR
/ n X$ d! _+ K% a7 A! F| MCASP_RX_OVERRUN);4 @: e" D- g2 R* b. U
} static void I2SDataTxRxActivate(void): m% V) x* J( M
{/ x/ G1 S! q7 |( X- m. g
/* Start the clocks */ a* I( Y& r% o+ m- [" _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; v0 z5 w/ G3 f, s0 P8 P7 KMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */2 _# t7 C/ c. N8 {/ r" z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,/ P3 B9 t0 V6 t) Q& Q" O
EDMA3_TRIG_MODE_EVENT);9 r# Q: z+ q9 V' M+ D
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( E, [% f( T: z* _EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers *// }) P! q* f8 h5 L. w1 o
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); D. t7 J8 v. D# e# j1 I
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */; u- y# k7 ?. p% y! z' b/ p
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
) e; G& m! @; P; Y3 TMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
6 _$ O. x. u" S, y1 eMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) \4 O/ d6 \, M
} + t1 @- s, V/ e& N7 A
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. + ^+ S5 c# _' u8 [
|