|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
$ S# v8 l& }# d. Winput mcasp_ahclkx,5 C& l% M* {8 w0 ^+ o
input mcasp_aclkx,) d' O* o- V: U' v( s
input axr0,; b9 V. b3 S/ w8 j8 o- F7 A
9 G; o. x9 S$ e$ K: B R
output mcasp_afsr,
8 u/ [- ]& Q+ q& ]9 ~. W8 M9 _8 c. `output mcasp_ahclkr,/ @) D. [. Y. s! m6 v
output mcasp_aclkr,
" j/ [( s& d6 e0 a5 F& L; p! g' Moutput axr1,- R5 l; ^* K, N8 M$ _
assign mcasp_afsr = mcasp_afsx;2 I* h# U* U% s5 E
assign mcasp_aclkr = mcasp_aclkx;) P: v o7 Y% j8 Q4 {, O# J/ V
assign mcasp_ahclkr = mcasp_ahclkx;$ V' f9 }+ h/ I" k
assign axr1 = axr0;
3 T, T4 E4 \# z/ N# f
8 V2 z' e8 _, H8 h在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
& J& T! j2 s2 xstatic void McASPI2SConfigure(void)+ W) h5 Q: a0 \8 Q9 B4 \+ i
{
6 X/ O, q) H! {1 rMcASPRxReset(SOC_MCASP_0_CTRL_REGS);5 h, \1 `+ X/ _( M, T/ }
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 v- {4 O! V/ T" ~! E7 ^) ]& bMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
" G9 u9 P* S$ n8 [6 W2 iMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */# S. f( w0 J3 N! K
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! y) i: ~' o$ p* s8 [
MCASP_RX_MODE_DMA);& J% g* I9 \1 n! h# l
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 x( x4 B. t" ~+ u
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 r' ?8 H7 c$ @& g, [& [+ d
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) n0 v$ h5 n! oMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);: B: S0 L6 k; d6 m8 H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, \% ]6 g7 B% r' S9 t
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */* H! z& V; s$ K% Z/ e
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);- F3 C3 A& C# N8 n. m
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( j! l2 ?3 D$ X% F0 R: U
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 A& A, u9 n5 N$ ?; Y. z0x00, 0xFF); /* configure the clock for transmitter */
) l* a9 t" s4 I+ P0 YMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 e6 y% ^0 ~3 o+ ]% P% kMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 d! Q l5 l# `$ y4 {2 x) v
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
7 a# e5 O/ q2 ~/ k8 t0x00, 0xFF);
2 q" ~4 S4 \" p8 ]! G/ P: `: j1 O: f' R2 F
/* Enable synchronization of RX and TX sections */
" l0 o+ \- [9 T: O8 ~: j7 \McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
) e1 P* q6 M0 V* KMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);5 h+ B' E: `: k. Z% M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*/ p B* y( a$ q
** Set the serializers, Currently only one serializer is set as( E; ~( i- S! f0 |) o
** transmitter and one serializer as receiver.
6 R9 ?3 b/ z# F: d( \5 x*/
+ v" B& j+ O" M5 P: H# |' SMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: @& v; z, X% H* WMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*- L; F+ T( ]) d( m4 _# H& g
** Configure the McASP pins 6 e$ t9 Y1 c# X( o* A. M
** Input - Frame Sync, Clock and Serializer Rx' D* r0 q3 Z9 A. U! Q! Q
** Output - Serializer Tx is connected to the input of the codec 9 H& J, u! o- b' o4 `
*/+ z% o7 m9 P9 n' h2 h. w
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 _% K" z: d. U N; l; U3 T0 E
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& g/ t# s _- N2 p
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" m# o) K- |2 _2 ]$ j
| MCASP_PIN_ACLKX
$ M: i! |3 L% l+ c3 y| MCASP_PIN_AHCLKX
* k7 |7 R' J d8 P7 t9 n4 u2 u| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */) X* Z% I# Z: I: e9 n' Y5 J' V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 l8 [7 w; U7 y. y/ j, P
| MCASP_TX_CLKFAIL
4 a7 D1 _ E, k/ v| MCASP_TX_SYNCERROR
* Z# C6 X% w4 {1 M| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 U4 I9 ^! p# L4 ~* V+ B! X| MCASP_RX_CLKFAIL: U9 ~+ v: `% x
| MCASP_RX_SYNCERROR
; q! I6 }# Y* o, j/ U0 Y6 X| MCASP_RX_OVERRUN);0 T4 y$ r. A& M" ^/ v6 [0 e% A
} static void I2SDataTxRxActivate(void)
" _) C' l" }) L0 d' @0 s{
3 O6 e9 @) g; L4 x" o$ \! r/* Start the clocks */* C4 o) \ s' w1 b) n6 d) m' {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);4 T0 s6 ?: W V, X
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
7 w1 O( V/ S/ H3 qEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: G) t0 U% h1 @' M6 A/ d
EDMA3_TRIG_MODE_EVENT);
% N6 k% h3 Y$ S; z* lEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + N% A4 _3 r3 ?0 G
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
U8 C( W; Y' H$ ]& D* ~8 q+ q6 QMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* I: U9 G* G K$ o1 Q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
6 ~/ O' x. Q1 h" U7 jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */; a7 P% P2 t# `
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 ~# J0 A) O2 L9 }" H- m" A' p- ]: C
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 k* [% h: L2 c; h& C/ Q! c, `} ( Z5 d% a' g- W" f* i0 }
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 2 |9 i; [( F' b
|