|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,/ l5 H6 N/ b- s: [, i5 c1 R
input mcasp_ahclkx,
+ @1 J/ t/ C/ l, Z: e! Finput mcasp_aclkx,. }* g" g7 `- k. j3 G: k }
input axr0,2 y6 C ~. r" ]6 x! } H; j- ^
% u6 k1 \0 V/ Voutput mcasp_afsr,7 q: M; r" C& w1 q/ c1 e `& C
output mcasp_ahclkr,
( J9 J& N; ]2 P9 \% D( aoutput mcasp_aclkr,7 t7 o( y! B5 j1 Z" N( J% K' L
output axr1,- X/ ~% P( V; \5 W4 u( J( M0 C
assign mcasp_afsr = mcasp_afsx;
; b. D9 N% K, o* s! k0 B+ tassign mcasp_aclkr = mcasp_aclkx;
8 a. v$ \; L& A' Fassign mcasp_ahclkr = mcasp_ahclkx;
! E) S1 }# M) B2 p4 Iassign axr1 = axr0;
/ L) k/ k2 _1 ^& M4 v% ^( |3 Y; I! E$ g. Y4 X1 ~ r5 ] {, f$ y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 " C" x% g. g1 M4 C3 E6 p
static void McASPI2SConfigure(void); ~( g @4 q* }/ D# f5 |0 `, i
{" h- [, K* f$ I8 C# z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 H9 c1 r8 G: ?. R3 `McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
+ W8 W" N* S5 S4 ~; CMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 E8 g7 \& ~- `/ e4 a9 u( M
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */ p, D. h; }. ^% s
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! [5 l1 Y. J9 j! s2 NMCASP_RX_MODE_DMA);/ \* c1 Z/ N. |
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, m0 L# v% p; K( T2 r
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 B/ u7 R, `2 W2 n9 t5 r
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 U5 S( V5 m U% O
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);# u1 X9 Y q' |$ K0 D% P6 c
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 U/ F) S$ x2 RMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
7 ~) G! |" [/ s# ], Y2 d$ J3 G! ~McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
% g& \ d8 J* F& Z2 QMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); - ^- N2 C$ E# S8 b, @+ ~% ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' W- F0 F+ { Z" G0x00, 0xFF); /* configure the clock for transmitter *// i- i6 f4 D: P6 [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
}6 v( \( i, ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ y2 b" b$ Z, ?
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. S ]4 H3 P' v1 L5 x# c0x00, 0xFF);
% A# _& ^) q& F7 y% Z$ ]: R3 L8 d( C! N
/* Enable synchronization of RX and TX sections */ * [* n0 g, W. W
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */# q( w2 u6 ^' P- z% l( O
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 R0 p+ B; R3 X8 j
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
9 z$ A. |+ w [4 X** Set the serializers, Currently only one serializer is set as# a: A7 C! ~3 s
** transmitter and one serializer as receiver.
$ Q( Z' B2 T' m! }" N3 ^/ ?: |- R*/
. i( X7 A& W+ O ^, KMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 G* J7 O: n: G" v& s
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*) S( G( w- L7 F; {) U3 a5 ?9 W
** Configure the McASP pins 1 x5 Z1 `" m9 @5 V0 n
** Input - Frame Sync, Clock and Serializer Rx
# M9 }9 Y7 U% V) d/ D( g3 E3 ^) K** Output - Serializer Tx is connected to the input of the codec
3 x! O6 {$ f' T3 u$ ?1 l5 ~*/
5 v$ h! U% k, }- E2 b$ BMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 n( V: l; c& U' l# p0 MMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
}5 Z3 M9 V8 ~1 D& S. [0 @McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
/ |6 r4 o0 _6 K| MCASP_PIN_ACLKX2 [2 E( }6 ? a
| MCASP_PIN_AHCLKX
/ ]% a# l) X- ]( L5 r- w% }| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% U& r$ O' z j) a( u, [4 XMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 k+ Y1 S' z2 V8 M/ B- ^
| MCASP_TX_CLKFAIL
8 h" Z! p& E) ~: ]- b# I| MCASP_TX_SYNCERROR+ r; |: V+ x* L7 L6 F
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 7 t5 _4 O) t8 A% I$ `
| MCASP_RX_CLKFAIL
) k* f: C1 c5 m; o4 A| MCASP_RX_SYNCERROR ( d. a6 `1 W6 w, `" l1 z
| MCASP_RX_OVERRUN);$ L% q5 p- C9 o6 ~0 s* W1 C" B
} static void I2SDataTxRxActivate(void)( U9 h! B" Q$ Y$ F, B
{' Y* \ C9 T1 x+ `
/* Start the clocks */
6 E& ?1 m* n7 Y( _$ M/ i9 WMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 J9 l8 x x! [( V5 O8 |- Z
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */$ I$ h2 G% a r/ w9 M6 m1 ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% K$ t4 |$ L2 o0 p& oEDMA3_TRIG_MODE_EVENT);# N) o4 j+ z* A) y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # S# o! G u, b% k
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */! Y, x; ]6 x; }, N* o
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ I9 ~. m1 ~0 o2 jMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
, M3 d1 o+ W( S) g8 z+ kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */* s+ Q. \. ~9 t8 h9 O
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);) ^6 O# r6 W) A* a+ f
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 J" T/ \5 z; a! J) z
}
) U& d; l2 ~# P请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) O( q2 F; e5 [ |