|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 f) \3 q) I, w% U) Iinput mcasp_ahclkx,
+ ?7 N. z! c' |" ]0 Z+ X' \input mcasp_aclkx,
5 R% |/ w7 u$ Ninput axr0,* n( G6 c; {) H) N+ X0 ^- f! O! ]
- S( ]" |; L" W- w& l: n- M0 voutput mcasp_afsr,# q- S& q: t/ ~: g! J) N
output mcasp_ahclkr,
/ n+ U6 E5 {& Z4 a7 }2 r2 v/ |" |output mcasp_aclkr,- H8 G0 u- R. Y% @. M
output axr1,0 ?3 R; F0 A" z9 ^+ Z
assign mcasp_afsr = mcasp_afsx;
& k( h; m+ y; u3 Vassign mcasp_aclkr = mcasp_aclkx;% L, _0 ~8 @2 Q4 r6 _) E
assign mcasp_ahclkr = mcasp_ahclkx;! K! E* R0 w+ g b6 X8 t
assign axr1 = axr0; % x- [4 f( ]4 |5 Q$ N' J- f: {
; d7 `/ @" F8 }# z
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
4 z" c1 _# [/ Ustatic void McASPI2SConfigure(void)& m0 W, ^) K# N( x+ k+ ^+ }
{
* @9 K# T, } q8 u' sMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
& G' e$ O v/ C' }9 l$ kMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 j8 \8 ~, V. k. u0 X9 SMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- d' S! B6 ^ Z2 ^4 c" h t
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */, i; ?* G) |5 u, l4 M
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! x" q# l. y# ~, n' ^( l( rMCASP_RX_MODE_DMA);6 c. @8 t) r" ~+ U+ \+ V
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, H9 t, j8 \" o. `9 }
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ ]" Y$ G, i5 Z; Z6 L1 g
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
1 c% C# j! h9 \# z, ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 c# R, \" M) b1 X# I
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / A5 Y6 g8 m8 ~, H! V
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */, `5 n* H$ t$ i7 l+ W. L
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" E9 L" s- x1 e" B. a4 jMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' {; p6 r. e% b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% N$ s5 c$ c; U! v" C5 \0x00, 0xFF); /* configure the clock for transmitter */
3 u( v4 u4 f, _) Y" kMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 l0 S, k3 s. d6 W4 J. pMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " V1 X4 |- T$ b9 i9 Y( t
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) @/ U5 J* C/ C( I& d6 c7 U0x00, 0xFF);3 _7 w0 e1 v* L
% n* l% m. `; y9 G O/* Enable synchronization of RX and TX sections */
9 j; c! E, _- o2 H gMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 @/ s4 h6 W% N/ Z( F1 kMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
S2 u0 q" p0 JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*0 ?: e! W0 I+ s K6 r. }! q
** Set the serializers, Currently only one serializer is set as0 [0 C& B4 F7 n5 D+ O
** transmitter and one serializer as receiver.
5 F4 J6 d" F# B, ?% N4 u4 L0 r; b*/
4 o- C1 r% n2 w' AMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 u G v- `- z2 K+ a9 v6 d bMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*" S) O) F9 g+ q
** Configure the McASP pins
' ?* S: ]( K, m** Input - Frame Sync, Clock and Serializer Rx0 e* G5 k: I6 \# Z+ q# X) @( I
** Output - Serializer Tx is connected to the input of the codec
& p% u3 e1 K- P+ z. ~*/
+ m' M. p( c) l# t( R, [% r9 CMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" B* S) U+ R! B! J0 ]$ u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 n8 p8 J7 K- U! h. i
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* V" @ D W9 ]* ~1 Q7 W, S
| MCASP_PIN_ACLKX
& z! {7 M7 E7 Z1 k2 || MCASP_PIN_AHCLKX% b" t" P; ^% F. g+ m3 z& D) D
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */" D+ V" P0 t# d$ f# I
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR - y0 y/ J* D. ~; T( y: y" x" z
| MCASP_TX_CLKFAIL + F; ^. T/ ?5 u H. z
| MCASP_TX_SYNCERROR3 H4 G( `8 @. n/ t
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& c2 @0 C. X4 g) X, r4 C| MCASP_RX_CLKFAIL) I; g7 T( s2 Q: [/ f- H
| MCASP_RX_SYNCERROR
) X C8 C6 r( [, U! a7 [) S| MCASP_RX_OVERRUN);
- B/ K6 i7 I2 a: ^} static void I2SDataTxRxActivate(void)
8 E/ b O2 ~( G3 G; Y/ T3 w5 C, n1 F{0 y# x% |$ `0 [4 ~( U ~
/* Start the clocks */
% v6 g7 J' S) dMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 m$ B" n0 u3 d6 U( ^
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */$ Z6 Z. z7 c/ g" H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& g/ V+ m( c( G# Q! r- g/ z# yEDMA3_TRIG_MODE_EVENT);, c# h8 t' a5 z8 Y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# P$ o) Q; e; j0 I5 p( ]4 i" `; M& Y0 c, GEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 W' l; \: e* s6 L. b; dMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 w4 d+ t1 L& a: W* U$ J) jMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
?0 r' \5 M0 N5 Ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
! Y4 f7 j _$ lMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ W5 L) ~# }, L) q- rMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ R8 B% S7 B) `) b; \& R1 s
} ' d$ O* @& F2 a- N" a' G& g. t
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
7 x. O4 |6 R2 ]8 `& H7 p |