|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
, ]2 u' I. D+ v# Y* Binput mcasp_ahclkx,
! O& |3 U) l( H7 V0 Einput mcasp_aclkx,
0 X; e& y. B) N0 I" hinput axr0,
9 m; @' F h. ]7 |; k
! t5 n- I L, t5 M0 h0 }& O: u! s2 F, routput mcasp_afsr,% v Q5 l$ s. d J$ \) ~
output mcasp_ahclkr,
. _' X! x. N7 g/ N* k" }) doutput mcasp_aclkr,
2 i4 U9 g" F4 C, s" D V/ b) y. \output axr1, y4 e( V2 k+ k* Q3 }
assign mcasp_afsr = mcasp_afsx;; `0 |9 v: c, n4 Z
assign mcasp_aclkr = mcasp_aclkx;% X7 }; R0 N. G+ e
assign mcasp_ahclkr = mcasp_ahclkx;) m; [; U3 d7 D; J8 g" F
assign axr1 = axr0; . x) ~' A4 O& D5 C1 v. V. w
$ D) ^: H- ?2 p* v& b1 g9 r8 y, r在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : e: b+ h8 W( p3 e0 ^) G
static void McASPI2SConfigure(void)
a; F6 R7 M) h( R{
, i5 m6 F8 I L. _) W9 E' L) G7 [' _McASPRxReset(SOC_MCASP_0_CTRL_REGS);! [7 v x0 n% ^6 ]- T
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 F: j1 T, c/ E; \6 Z5 xMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- n6 C) d" {+ B! R+ l8 r
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
7 B- _8 h5 G9 |- u( }McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, Y, J3 a5 `# t& ~" T1 q
MCASP_RX_MODE_DMA);) c: g) P) E7 |' F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 [* e* a' [) |7 X, y0 B6 L
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ x8 ?3 x- y$ s8 A, x
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ T9 x6 B( D0 J; x2 P
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ v' f3 V7 E6 p, ^+ z4 `' d, z: P7 E
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ P' O/ t$ u$ K2 g6 N* ?% GMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# u. b7 Q" y' l" RMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
$ y9 R* N1 H/ J( x" \" Y+ m+ _1 aMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " l" g# a6 Z3 F6 |
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,. Y* a+ G, D4 }# z
0x00, 0xFF); /* configure the clock for transmitter */
# E+ ^8 t9 c+ q* J% pMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ R$ v2 y, e1 ^9 UMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); + Z! i, o* d1 d& D7 _1 i5 m
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ d1 e" ?2 @2 e g$ { z0x00, 0xFF);
. n$ ` M, g) f8 m
! V0 W8 V1 {" A6 \0 e8 X9 F/* Enable synchronization of RX and TX sections */ " u, N! o3 f7 e0 T
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" u. {; [- T* u j. F4 ^* c. Q+ P
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, C' ~ p9 t( E$ G5 QMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
$ `2 W9 @/ k" K7 V) C0 a. I** Set the serializers, Currently only one serializer is set as" X% z+ ?8 y1 t; ?# u j
** transmitter and one serializer as receiver.' x" s" K+ F! g6 l( b( W
*/- k! ^; [" B( D
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* x; m5 J) _1 D; ^
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*" e" R, Y& Q5 p+ V H" Y, K
** Configure the McASP pins
1 N: x( V5 X- x$ y$ o** Input - Frame Sync, Clock and Serializer Rx% F/ r- B* s& X) w- _
** Output - Serializer Tx is connected to the input of the codec . f5 l( y) N$ {5 x$ j: e
*/
* y8 B$ I- x9 ? p7 P3 XMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% p$ A' O" W: g7 n7 X
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ d) L" \ o( J3 }' `3 ]8 WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX9 |5 ~; p( {- f
| MCASP_PIN_ACLKX+ s: Y0 Z. d( I, c
| MCASP_PIN_AHCLKX' c6 T7 U( t9 f& Q0 _
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */, [$ p; U# F6 t$ E. F- ^
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 |( a& x/ |) f! V& X' u| MCASP_TX_CLKFAIL * U* D+ U5 z d6 v- h; K) H
| MCASP_TX_SYNCERROR
/ [+ G1 p2 s! \) z/ C8 o4 _| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 n U' `: U6 `4 P| MCASP_RX_CLKFAIL
8 ]) \$ G' J6 ?. X% N| MCASP_RX_SYNCERROR . @* J" i& k- q- e
| MCASP_RX_OVERRUN);2 o( \: g) s! g( E. z6 P2 [
} static void I2SDataTxRxActivate(void)
6 a: f8 w1 ]0 b4 ]( |{! k* `) x$ G3 K1 x
/* Start the clocks */
. R8 E0 G8 ~$ j z6 M \McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ x& N$ O# d+ s
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
& V' }. v h8 I5 v# n& d4 AEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 E' M+ x2 E5 R. @# G+ E; ?* ?3 _EDMA3_TRIG_MODE_EVENT);
2 J; k0 @# c# E {, \EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# [9 B* c' J5 x. [' F2 W" _- ZEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
( d2 B, W/ V- o G& |1 v5 n" zMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);: q( m* x% o( S' g) y6 X" N
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */3 D. V* K6 b5 B2 Q, X3 M2 R. O/ I
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */2 c* T5 P3 m1 v8 I2 ^; P9 K
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 {5 R- M v' r
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
/ B _" n ~! i} 2 d" t' L: G; a. ]5 i$ e9 e, U
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( K; }- }9 d) u3 {# r! Z |