|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
+ ^+ ~0 A; N; F9 n% a/ sinput mcasp_ahclkx,2 r1 I% N9 {, S3 B3 Q9 R+ m$ P
input mcasp_aclkx,# b# j8 j3 d8 j" T2 {: u1 T" _* l
input axr0,
4 b3 X* D" n* B
) E' y) P' R9 y# P7 Z9 d2 w1 Zoutput mcasp_afsr,
0 [9 {+ M. h# A- G4 x' loutput mcasp_ahclkr,
; R4 \ V2 Y$ t1 a" p3 B% boutput mcasp_aclkr,; O* @& C5 ?. t* j8 Q6 d% Y$ k: }* E; u
output axr1,. y2 `1 j; [! r" b; s0 {3 w2 v. N
assign mcasp_afsr = mcasp_afsx;2 N* W W% ]- J+ u( x! E8 F: e
assign mcasp_aclkr = mcasp_aclkx;: N. s# a$ C" u+ a! M8 l
assign mcasp_ahclkr = mcasp_ahclkx;
& Z& l; ]9 }) |# @5 R0 T4 n" W: xassign axr1 = axr0; ) I0 h) L# {$ z1 j
0 U: t# x) l0 A$ i! @; [在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 h, S, b3 n& h1 x" s
static void McASPI2SConfigure(void); q3 x& D. F1 e- H3 P; _7 R
{) V& j- h5 B9 v. ^
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ M9 c% u; T0 y) o( ^McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
6 N' M7 m; N3 E& b& GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ R. w: \% R4 H. ^$ J8 G6 I, e
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
& g& X- d# T4 T& eMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ p% r X/ s; w( f1 r9 v7 {; g
MCASP_RX_MODE_DMA);
( j0 _6 @- I" U$ n8 O1 D/ m+ u8 AMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! _0 U6 T# D# cMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ F1 h6 p/ P2 G; z0 q: wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ Q% M. z1 Y( T
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 \% z& x5 G" W; t G7 n
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & T# ~. E/ @" ~* U- ]7 R4 x
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
% |' z. Y: u$ E O) ?/ H4 V- l9 dMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);; c/ H9 T3 u Z9 a5 c
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. R" S! L* o1 Y' ~0 H4 J U kMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ b- E$ y# \) z/ P( A; E* ^0 r0x00, 0xFF); /* configure the clock for transmitter */
) J, D. |. S( hMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% r3 x! F- }+ K( QMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 P/ f) L4 `+ t% g/ x& ]( x0 tMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# R# T d) K3 Q8 ?% J
0x00, 0xFF);. D1 [/ b3 D: `. l
9 C0 v6 {, o5 h2 ^% x' T8 _' G% p
/* Enable synchronization of RX and TX sections */
/ X/ a/ j/ S1 I; Z! M& BMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 e4 `% L; [, o6 E% ^# V- TMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 p+ _* v! g* K1 `6 P& _McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*! ^/ m3 T8 F) k9 z" n
** Set the serializers, Currently only one serializer is set as7 F( M, I, B1 L/ }/ n, V
** transmitter and one serializer as receiver.8 B( I& O5 d2 Q1 j
*/! I3 d. q# Z+ C0 _
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; I, p/ V- g' y5 rMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
. O3 a, v3 J. w- L! @' n& \** Configure the McASP pins , Z; U4 c0 r& t% p' C+ A
** Input - Frame Sync, Clock and Serializer Rx! W% z y; i0 N8 |
** Output - Serializer Tx is connected to the input of the codec
1 l2 A/ i9 ~9 ~2 p0 @) P! P*/6 n, K3 ~- j, N7 ^+ _2 D
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! X; W3 R( Y" Q9 F7 Z+ k7 dMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 l. l4 K, N7 n- [" V) lMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& {' y- R6 T5 ? F9 q
| MCASP_PIN_ACLKX
6 R: E: `7 I- I0 Y| MCASP_PIN_AHCLKX2 }1 W& N, Y" p* ~. o8 c# r A: ^
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */8 i4 ~8 P/ d+ Q: ?
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: C" e- D2 n' ^) U/ ]| MCASP_TX_CLKFAIL
1 g+ q- p2 I; |9 B. V| MCASP_TX_SYNCERROR
. X5 v! b6 V, }9 J9 l| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ y2 ^! F, M4 @/ x6 b8 N( ^| MCASP_RX_CLKFAIL
/ ~6 ^4 T) _5 D7 _' l| MCASP_RX_SYNCERROR ^/ Y% N. |1 q" i x
| MCASP_RX_OVERRUN);
" h4 J; ]! P: Q1 {} static void I2SDataTxRxActivate(void)
4 [" h6 ^/ O6 t8 w$ r; {: ?$ L{
: G4 O) n! y2 h1 }- ]9 n$ W/* Start the clocks */
4 O/ r6 ?7 ^6 r4 w6 ~McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" M* [; [2 v q; P* C; N; B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; q' ^& W: g- u; Z) T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,* O1 t) i3 ^; i! ^; d, K2 s: e
EDMA3_TRIG_MODE_EVENT);
$ s- \& t& ^4 f/ _; DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 P' q* ~* n! o8 j; i+ KEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
" }( x# `& p$ a. DMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ Q7 J8 }3 ?6 `McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */. n/ z& H' i: y; k E5 M
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
5 K' d6 \" Z, i1 ?- ]McASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 j5 ]' U2 U. ?
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" L* b2 a0 Z# f% c, C} 2 R) _" Z8 a1 H
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. " H" a- n5 C, D
|