|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( K7 l, {. Q, j* U5 g' A: w
input mcasp_ahclkx,4 C# |% D& o6 a4 D
input mcasp_aclkx,& b, V( x, b3 A$ x y. R' ~/ `
input axr0,1 i1 ~6 h) N6 I0 e3 S4 G7 `! x
$ b' E6 C$ g5 f
output mcasp_afsr,
) D( ]* l- V. toutput mcasp_ahclkr,
9 o' F$ W6 z: A' Ooutput mcasp_aclkr,
g% D; d( q ]output axr1,# Z# I8 r3 _$ [8 Q
assign mcasp_afsr = mcasp_afsx;
# \4 ~! u' O4 h& c: o% s# v2 n' Zassign mcasp_aclkr = mcasp_aclkx;7 d5 m( C; J7 l: y
assign mcasp_ahclkr = mcasp_ahclkx;; e1 ^$ g+ u# z% z+ o
assign axr1 = axr0; % c. _ y1 @. ~" L
/ y) b" O1 M4 G J2 D5 _) A
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : O% _- @1 b3 w
static void McASPI2SConfigure(void)+ N7 H! B% e6 p# h
{
6 m$ B9 D, y5 p9 H& yMcASPRxReset(SOC_MCASP_0_CTRL_REGS);% P" {5 |" o; d% q% { h2 c( {
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */6 g( Z0 R7 [/ y: O
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. E6 b1 l# v0 u( {& e
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */' `8 q* N) ]6 Y, ~( e
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 Q, v6 ^4 Q5 V: yMCASP_RX_MODE_DMA);* T% O# X/ v9 A8 p9 {
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% |* \0 ?3 Q: D+ E5 kMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; K5 D2 T, y1 c; q) B* ?McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 y0 B. m8 w4 U/ N& A6 o# ]
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 v$ B. H. ~. i; e( h8 r
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' n6 f6 `, w3 u4 w2 S% aMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
4 m3 G; x5 V2 HMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0); X0 V0 L7 ~' i6 H% r }
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % F! R8 ^" r( \. } e
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 g4 C2 P5 _( i0x00, 0xFF); /* configure the clock for transmitter */8 l; e* K% s6 [* F/ U
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( P$ k. j; l. e) aMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 ^( B' H9 r3 i) j& Q/ C
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 a! m# k* L+ R0 r" x( r
0x00, 0xFF);/ W8 o4 g& R$ _6 W6 r
3 ?$ f: e' h1 h+ ]+ M. `/* Enable synchronization of RX and TX sections */
. @, ]" T, U8 s: zMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */) F/ a2 O& e. u# `7 i/ p
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);. C" o- Z/ K3 m3 S* h% W
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*: _# ~% ~! c$ N3 Q4 u3 f
** Set the serializers, Currently only one serializer is set as
. d' J2 ~+ T' ^8 |$ u3 \, r: Y** transmitter and one serializer as receiver.
$ Y2 [; }8 k k7 A& q*/ v2 M3 ~; A( l$ s# a, i
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. ], o' p& I% n% g0 j, SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*2 n8 _1 x. V7 e9 y- {7 M3 b5 I
** Configure the McASP pins 3 t; W% H- @' x0 @& t' }
** Input - Frame Sync, Clock and Serializer Rx
' i" i1 @" z& q4 T, f& G" @6 ~ B** Output - Serializer Tx is connected to the input of the codec
+ n) c8 ^, j; L*/
! V4 x( Z! w- V7 yMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 k. e, r" s6 C& V# q1 QMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' J! W: P7 Y5 O4 K
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( s1 W! N7 f4 Z4 V! ^
| MCASP_PIN_ACLKX
: y2 B' j. q9 E# Q M4 W| MCASP_PIN_AHCLKX. ]9 j( \% N3 ^4 f# c% X4 @# t
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */* w8 B( U& u/ z; l: H
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) K4 \* J/ F, T( Y( ^& ~4 C| MCASP_TX_CLKFAIL 9 j! g- R( |2 I; @; M r
| MCASP_TX_SYNCERROR$ L) t; F8 H0 c' G3 ^0 O9 Q
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; S5 q0 A* }$ S O& q1 R
| MCASP_RX_CLKFAIL7 X$ K0 i! B" \/ H6 }2 d
| MCASP_RX_SYNCERROR
+ u% C* q; I2 S| MCASP_RX_OVERRUN);
; S, C2 D; W2 d" J9 g8 q& E4 t* }} static void I2SDataTxRxActivate(void)" ] @4 \, c- y- K: m
{
2 S( c- {' q/ M3 R7 p# Z/* Start the clocks */; Y/ Y" f( o) P
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 w/ G+ Y3 \3 Z% B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
* r! r: O" x# Y7 h* _9 V$ AEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 k" \9 O+ _1 e6 Z1 F
EDMA3_TRIG_MODE_EVENT);' {4 B2 c; y$ Z- I6 B0 B+ H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
`9 c$ L- n$ W- P0 x( W6 N6 jEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
5 L# a/ N' G/ ?3 uMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& c) Z8 j7 F( f) x$ S5 a0 M) _) a
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
" Z2 N! h: r2 A' Swhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */% Q9 N: ~" H7 y: b0 p* q3 s* k
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);# N$ Q6 ~1 f( N5 h7 |
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 b5 [- g( R; k0 S# b* m
}
! o, C2 v1 Y. m( ?4 q1 i2 J请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ; m6 [/ N; G% ]2 r- Y/ G
|