|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,; D e6 t9 K( G
input mcasp_ahclkx,
5 _6 E% u; a6 f( Ginput mcasp_aclkx,7 v2 d* h* v( b
input axr0,
: ]) T, q& G: ~& b- C K" n4 k G: M0 p1 y5 g; [) A* z& I. ?6 j
output mcasp_afsr,
2 W6 M' x0 s' Aoutput mcasp_ahclkr,6 p) C6 w! _ r0 Z* p2 B J0 Z
output mcasp_aclkr,
3 u5 ^, Z5 v( y& k: I- M0 D3 o- F8 R, Voutput axr1,4 V( Z. s, c2 s0 L' O3 y
assign mcasp_afsr = mcasp_afsx;% r) j: l# P! z m
assign mcasp_aclkr = mcasp_aclkx;
6 f1 j, y" n. n$ a) D3 [5 \1 [* _4 |2 tassign mcasp_ahclkr = mcasp_ahclkx;! o: u+ f; L! D% P9 Z
assign axr1 = axr0;
9 s9 @' X& i- y8 h
/ h; T% Z' O% c5 _0 [) y: m在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 $ L7 ]! u/ x6 y
static void McASPI2SConfigure(void)
: c# q' Z! Y/ e" u* R K+ C5 r- s{
3 G' C3 a. u" q$ YMcASPRxReset(SOC_MCASP_0_CTRL_REGS);; \. ~ W }" n
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 Q' f6 f, B6 e! zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
8 N7 \$ `8 T, m3 TMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
/ Q" d3 d3 M" ~5 P! Q! H, o; |McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 ]; c' t1 F8 S# QMCASP_RX_MODE_DMA);) M# P( |. S3 }* ]; C; c6 @7 P; m
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; Z- W8 r9 ]; x8 ?9 M( x8 k* ^: H
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' P# k1 |, m4 c" ]7 U$ }4 \McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 d8 X. u- S( lMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);! K! A5 U5 `& O) D- k7 ?7 M
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, W. q9 X; e3 H1 HMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
4 P# _- _. h+ k: S6 l" n) }) Z% r2 }1 aMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! {$ a" q* j4 c: k3 ~6 lMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 m9 o! B. }' C0 ?6 Z; O, m+ zMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# C5 @7 h' t, |1 G
0x00, 0xFF); /* configure the clock for transmitter */% X1 Y) ~& }4 E3 U. }2 i' O- W$ e
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; ^- v0 Q2 E6 i$ Q* T/ Z3 QMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 ]1 d) q1 M L7 G8 b3 Z A1 k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: l1 f6 B6 Q: @4 f! W2 U0x00, 0xFF);
/ Y. ?4 t' T6 J* l( D; f9 @. L: u& Q: N- H
/* Enable synchronization of RX and TX sections */ 1 {3 |3 m" }: X6 r4 d
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. B# z, ^! |1 o- o- B" B5 eMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* r9 z* {7 s& \' v5 }
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
, F6 Q/ ]) v! h- f** Set the serializers, Currently only one serializer is set as5 z* ~/ p1 F3 `' e3 ~/ U
** transmitter and one serializer as receiver.8 R1 k. v9 L3 D8 }" U2 k6 n, [
*/
- ]+ G$ d& Y8 s) MMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 ]6 D5 X b6 H$ C1 C/ nMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
3 |* P' D+ \+ M** Configure the McASP pins {+ X- n$ R' r$ d6 V
** Input - Frame Sync, Clock and Serializer Rx
& |( `1 l E* ~9 E7 B! W** Output - Serializer Tx is connected to the input of the codec
9 O5 c% }! r/ m*/
' r7 T. _6 X( U9 @: J3 o- uMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# s+ ?: y4 [5 s, I4 C& Z" zMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
( {0 |0 S0 e2 Z) E- oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 |. q& L7 d, } c ?: [
| MCASP_PIN_ACLKX
1 P) H. w8 d3 A5 x7 S0 q| MCASP_PIN_AHCLKX E% `8 g' u( d) r }# u* @) @
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# N6 b3 v0 q5 s N/ q2 RMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR T) Q3 E8 k+ T: r' ?! q! o
| MCASP_TX_CLKFAIL 0 Z% A$ d) J$ W. _7 z
| MCASP_TX_SYNCERROR
* d' v3 L5 E5 d- ]( N" a' b| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) a$ d# A, E$ C# {0 w| MCASP_RX_CLKFAIL+ @) L6 k( d3 V7 J$ a
| MCASP_RX_SYNCERROR ( S% B- v5 q6 K5 _" h/ u& {
| MCASP_RX_OVERRUN);
4 T: Z' N9 N, z& S} static void I2SDataTxRxActivate(void)9 N+ J2 u5 a6 v4 @) |
{
& {4 u6 ^, y9 h" X/ L: l/* Start the clocks */* b2 l+ n" H7 q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
& V# ~- c! r" K3 TMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
4 r$ w5 ]5 J% [9 o4 F( |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 u# ]$ O ~: E7 K, }+ m7 b
EDMA3_TRIG_MODE_EVENT);1 N% _6 W) G& w. t* S g" T. j& Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& U; O& T9 [, u; d& S) |# qEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; l2 r$ Q. ^7 i. d; wMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) K+ B1 Y) Q/ G# b$ I _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
6 T# X) n4 ^- }while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */- Y% |, ~6 J9 `' |; [9 H6 P
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 j9 e( e0 j+ F2 ]McASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 p( H1 C# Q, K% H5 f+ E
}
! u6 |. B* \! h& v6 S请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. : Q/ i' c V4 B& G. l' U' `
|