|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
) Z, b% m+ c5 K4 W# g5 L& |input mcasp_ahclkx,
* B- g: M5 |& uinput mcasp_aclkx,
2 A" \* G" K4 n, O2 Rinput axr0,3 B: i% [, R G0 o3 j
) s; G. ~8 `! @ P- C) b
output mcasp_afsr,: c/ x: F- V! H; a2 |; d
output mcasp_ahclkr,# j; T) K0 g3 m( j' u
output mcasp_aclkr,
* [" T9 q( s+ V" Poutput axr1,
" p6 B h m' B# N9 f2 a' N assign mcasp_afsr = mcasp_afsx;/ ^9 H$ c3 @ J
assign mcasp_aclkr = mcasp_aclkx;9 h: K+ A W7 X2 k
assign mcasp_ahclkr = mcasp_ahclkx;
1 b$ ^2 P/ g/ {: `5 o. Uassign axr1 = axr0; 6 P* {" {$ O. s0 D4 ?$ D
6 ^: X3 u' E& W在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
: Y6 M9 B' v' l' D/ c7 Q3 H3 _8 u( \static void McASPI2SConfigure(void): t$ X' e0 T8 Q7 p
{/ v1 L( F: o0 B. J; c) v
McASPRxReset(SOC_MCASP_0_CTRL_REGS);6 ~6 A( _1 ?( U& v/ y
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
- q# F4 ]: I/ V) y. g. dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 ^! R& m6 G& C w- k& g
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 B2 o M7 D' y$ N0 `
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 N! }5 q$ ?# ?7 F- b O! n @MCASP_RX_MODE_DMA);
! }- [7 @% R7 Q/ u4 F9 qMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( z6 K/ l/ z3 }
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ ^6 l# x) ^3 B# j c; u- M, T
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 q0 b! P& q1 V& u9 C+ o
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
A% ?( Y5 U' D7 I& F8 ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ ^7 y8 N: k2 K* |
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */1 P- r" h) L- @& z4 a, t ^- B" u" f
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 _' D/ t# X5 a1 m8 qMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( f6 M& |7 o; Q9 |: ?2 ?McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 `3 @" ^3 v/ q- G: c N- \6 i0x00, 0xFF); /* configure the clock for transmitter */7 o; e! ]4 n* q1 w
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' K- d f3 h' Z6 S- V6 m6 oMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) x% I7 j5 p) m, a! c4 nMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 p0 X. K/ v$ |5 d0x00, 0xFF);( A$ M2 j! U3 b1 q
# p: p3 i5 v( B+ E% V# C1 b/* Enable synchronization of RX and TX sections */ ( S% c; G* A( Z" o1 L! U
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */3 Q) q8 Y# G- c" I; s* g$ I
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; `' m' ]0 p5 B, T, F2 v6 h' TMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
; ?1 d. _% _: J. S& v** Set the serializers, Currently only one serializer is set as
5 x0 d N- F3 q' d" G: R- K- C** transmitter and one serializer as receiver.
4 ]" Q) |8 U) [/ n# Q+ k*/" [+ a( e- f! S7 M4 @# `% u
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
" v- i; t; P$ SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*, q( i1 _+ T( O' S- v
** Configure the McASP pins
- h+ [2 Z1 G; O- t* U c( B** Input - Frame Sync, Clock and Serializer Rx
9 @5 I& G/ e& D3 V* I- v" L6 u** Output - Serializer Tx is connected to the input of the codec
5 G4 B; K/ V& S$ P- K*/
6 I6 ?) v2 U4 d8 x/ F8 F2 ?6 iMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; Z. @6 x/ \! O7 \( C
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 K7 `: G6 \5 i4 T. t
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 L# `( b/ N+ e9 |: B
| MCASP_PIN_ACLKX; @9 i! R- K# v. d0 R6 P8 q" j
| MCASP_PIN_AHCLKX
1 p: E( T+ D$ x* T6 w/ c| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
2 B1 ]. o `( F. [3 n! }% P: J4 {, u- TMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% `9 B3 N8 v8 ]8 K1 m; B| MCASP_TX_CLKFAIL
4 J& O4 ^8 \ Y" y. h& @$ O| MCASP_TX_SYNCERROR4 d' j1 v; s% \' d: v" D4 s
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ Q5 X% I/ H1 j. x/ _6 q6 k
| MCASP_RX_CLKFAIL
- N5 H2 \! R* T2 k+ M. R& C| MCASP_RX_SYNCERROR
" d. l, X6 `' j/ r* [) p: U. s| MCASP_RX_OVERRUN);
7 @: Z' Q2 P: X+ \) P3 X} static void I2SDataTxRxActivate(void)% Z$ ?; Z6 j j- {. m: x
{" c* }( ~0 w! E% W( X
/* Start the clocks */8 q( o* z7 f& N; w
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
7 o; B, u( J! |5 f' J( N# _+ p. XMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
$ X7 t& i" w/ L5 H7 _: w AEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ [1 G1 g) I* u5 I
EDMA3_TRIG_MODE_EVENT);! S. z0 x% c# r% w# w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( w5 r" v7 U& I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
$ C0 |$ `' p' e; NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: u7 W# `& j, p, Y" S# ^McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
$ h0 E/ d$ [9 s0 I, ?+ s+ cwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
}* D' X ?+ O6 X; nMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 U8 D3 C; w$ v5 OMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) s+ V8 D9 n3 P" H6 Z8 S" X- z
}
$ C% @( B o5 a$ _6 Z, S请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ! H4 ~5 l# O5 w0 w; W' T* Y, q
|