|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,1 z+ I2 l) x: s: a. i
input mcasp_ahclkx,
" P4 W' y& ]3 S2 k9 E5 Linput mcasp_aclkx,
: R9 e' Q1 A6 M* ?3 n- y: ]input axr0,2 e5 A# c& m `- B' K5 W
# z X) J$ \0 Y0 h5 G6 ]0 ^
output mcasp_afsr,, X3 \, C" z# i
output mcasp_ahclkr,- E' e% K, `( e3 K
output mcasp_aclkr,
$ E9 U) D. W8 Z h! Doutput axr1,8 D- j3 ]- {* `! T" y# q4 n
assign mcasp_afsr = mcasp_afsx;! N8 g* O" |6 i* ]
assign mcasp_aclkr = mcasp_aclkx;
7 [9 r: R& ~2 d* U9 L: x' vassign mcasp_ahclkr = mcasp_ahclkx;" [# O( M/ N @: c1 h5 J
assign axr1 = axr0;
- f: A9 X8 n. F1 s
) |. m$ c" R8 U+ B7 a在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 p# J3 P& ?/ l& V1 x J- j t
static void McASPI2SConfigure(void)( U3 R0 o ?& O9 [' G
{2 A, d' a* H u
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) D: k# v, V3 L- hMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( _& V6 t; [9 j8 rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 X9 G, p) s, [+ o; q! m: cMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 ?! Y$ U9 p L3 D
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) e& g3 ?5 l6 t% HMCASP_RX_MODE_DMA);7 O; M s+ r: @2 ]! G: x, X( z+ g8 o# H
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, J: I( H: T( g6 N9 u% |5 f
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 l1 Q0 d& n) J7 F7 y3 ^* x; O- U/ \
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. Q1 E, Z7 F; r: X C2 M! i3 YMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 O) ?. U K) A0 q) v4 `
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 9 W( A( }: ~6 Q. J* s8 O
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; N+ M+ \7 d# I* FMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 F& d& _- X% q6 z5 e8 oMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + f3 } V# u8 q1 _- _3 f9 \% x
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& x& Y+ Q# B2 k0 d/ Y7 D$ K- o0x00, 0xFF); /* configure the clock for transmitter */+ {" u, j. m$ I) R4 H! L! L D5 h3 R
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 J6 u' j# R& o' u3 IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ c7 W V5 M& l; @7 [
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 B! A3 S% Y& x, d. I/ D" r
0x00, 0xFF);
7 R( A4 q4 F9 }$ Q
- I9 V, X0 y; n6 X5 n3 M/* Enable synchronization of RX and TX sections */ - c! C4 I* v& e
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" \0 `# O) w9 v; C4 l* }
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& D& o0 W9 r7 @! T! f5 DMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
( P+ [+ ^( O+ t9 F2 u9 [$ }** Set the serializers, Currently only one serializer is set as
* t6 {" }' T: @8 C1 m3 Z** transmitter and one serializer as receiver.# K0 `+ K0 P: P1 [; l6 h3 J
*/
) W9 F) y9 f+ y' E7 K' ]) W3 @! \& WMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);2 U3 d8 Y0 x7 ~4 Y: Y
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
) ^3 Q5 j. o% _3 R% ^8 _** Configure the McASP pins 9 P0 R4 v, ?; ~- k
** Input - Frame Sync, Clock and Serializer Rx
' V; t. g( `3 P& P0 i** Output - Serializer Tx is connected to the input of the codec
; G* w: S" ]* n Y0 d*/
7 E+ O i: y$ l% [: C+ fMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' {5 Z Q& z* V( K& k
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% Y+ M2 A& j1 P. hMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
5 W3 A" _ _9 K| MCASP_PIN_ACLKX
9 O, D# l. c3 W) E8 _- c& B| MCASP_PIN_AHCLKX
9 j: V2 h: q4 z& G! ?! L| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# t$ m2 @6 c0 j2 r( HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % @! ~5 e6 {, p* [4 J" P: d( q
| MCASP_TX_CLKFAIL 4 W6 o, Y# T8 X; z/ `+ a( X8 A
| MCASP_TX_SYNCERROR( v/ W! m; e7 A6 `
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 F# l+ q3 n9 || MCASP_RX_CLKFAIL
9 n5 x+ M6 U3 ]" G+ S/ ~: M) w| MCASP_RX_SYNCERROR t& [6 Q+ E- z* B; C: N
| MCASP_RX_OVERRUN);
$ x3 g t* I1 n7 x7 Y Y: S. L} static void I2SDataTxRxActivate(void)$ k7 m5 I) d, I5 F) {: o
{: y6 @% ^% Y- C
/* Start the clocks */
; j$ o5 Z, v( \, x/ ^; YMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) ^& V# j) J3 d( tMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
/ f0 W3 U$ c7 b2 `& P# h* MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,, |: z5 i& q' a S
EDMA3_TRIG_MODE_EVENT);
; X8 R3 U( a0 r6 ^ LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
5 U( p8 T' {; G: s: I0 YEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
, b- g- G% w1 a OMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 \- o4 W! x( t+ I7 z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
1 @, X2 ~* u+ N: ^6 S: Y& kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
L. S, P5 G+ x# i# `2 L5 a7 gMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
w0 }( d: k- C) A( Y+ {7 [9 \McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
+ T3 e3 X7 R/ O& D7 H7 X; l}
* n: H% K6 Y, F1 {3 ?6 c: G请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
8 S, X' S8 Q P1 x |