|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
, G [- G, w8 k# H( g7 tinput mcasp_ahclkx,0 }3 m8 H; G1 M% J
input mcasp_aclkx,
0 V5 ], {0 J8 ^2 [8 Z) Uinput axr0,
2 K& v/ S2 m& q+ ]0 H* ?
" y9 W5 N- h; a3 poutput mcasp_afsr,9 |. m6 H, {/ V$ f8 A5 w
output mcasp_ahclkr,
2 ^: X2 F4 o* t6 Koutput mcasp_aclkr,( i& @: P4 G, y8 W
output axr1,
" u' S" }. Y5 E# D1 V( j8 u assign mcasp_afsr = mcasp_afsx;1 f3 y/ T6 v7 d$ g9 ^
assign mcasp_aclkr = mcasp_aclkx;
* O. G% ^8 s" D6 eassign mcasp_ahclkr = mcasp_ahclkx;
* M7 r( `: o' Yassign axr1 = axr0;
) }; U8 A$ ^3 \: H$ V7 E! I% r6 t2 ^! }8 v' V6 T* X
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
' H( [; q$ T+ _ h$ C) o6 }static void McASPI2SConfigure(void), ^7 q3 |# M y" r
{( y7 e! `' x! o6 U( x
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; W% N2 e- ~5 T7 KMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 b( }$ x" o2 s0 F" x+ _ AMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 d1 @0 }2 t) S! B+ Y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
- W7 E; |) [7 C, v6 \2 zMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% ]( K2 v2 V3 h" v
MCASP_RX_MODE_DMA);. v3 w5 U" v8 I q6 g. C5 f. @( Q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 Q) b# v# d4 G, S+ g% u; a. WMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */, e7 Y r) _: q& B$ p
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" h1 |7 k: i5 D& X# n% ~6 L; UMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) x4 D2 q7 @8 }7 E x! dMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* u, R/ T+ M6 b7 g. U/ vMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
+ S$ V; ]$ b/ a) M/ SMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
1 j9 h1 B* i; T$ vMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; V$ r( F9 t, ~6 j) X4 P% WMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,3 x, R* ^0 g, W8 P
0x00, 0xFF); /* configure the clock for transmitter */5 i6 i; l3 ~% Y% c
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& R6 J. \: w# z! Z- S2 ^& `McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); u+ x/ u" B# k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 V$ S/ h# C# w
0x00, 0xFF);
7 q4 f" \) z1 q% E8 u/ b9 L& v
& U1 X6 d* ?$ U7 i5 G/* Enable synchronization of RX and TX sections */
; n \( ]" H! l4 Z! y# K: l& ?McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */8 q4 b( G+ ]8 M: u* w2 f
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* I( m! V7 t; h2 v! m
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*& A, P; e* l7 ]
** Set the serializers, Currently only one serializer is set as
5 \* d3 h3 V9 E0 Q% z8 n** transmitter and one serializer as receiver.
/ t% h' \# w- P*/
% B; Q ^* O. l9 d5 }- r- [) ~McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( R. O3 D2 i% ^$ iMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /* A' s: L5 I) ]: T
** Configure the McASP pins + z6 I2 o$ W* B7 c* l) I, d+ o
** Input - Frame Sync, Clock and Serializer Rx
& P: T0 Y- y- d; R& \3 x** Output - Serializer Tx is connected to the input of the codec
' j; w& Q8 [; h*/
4 t. B; a% {. }9 J* b: k9 tMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" `3 @# ? p. p- D/ m& w
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); s5 Z( @# G5 H8 Q) h: t# z& g
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 n, w4 N, l! _) s: y
| MCASP_PIN_ACLKX
c5 |7 q1 C0 H| MCASP_PIN_AHCLKX
4 i4 o7 w; G# B4 q| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */6 `% s- X3 V4 s. v- }1 H$ J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' ]2 g1 q4 \4 N7 ^$ z' o
| MCASP_TX_CLKFAIL
2 ?' t' H/ g8 B2 n; g% }6 E0 a- ^| MCASP_TX_SYNCERROR y7 e. k& W. b
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 r) Y z4 N A3 y" _' O. U
| MCASP_RX_CLKFAIL& Q* c5 ~) v9 q7 ~6 t4 c8 {" T" a" ~
| MCASP_RX_SYNCERROR . a9 t$ s' A( ^- ^- |# L
| MCASP_RX_OVERRUN);
2 r& A( V) A1 _7 U! A5 ?& E} static void I2SDataTxRxActivate(void)
C) i5 W' K6 A3 x{# t7 {# j. S, C% ~
/* Start the clocks */
; Z% b( _7 m3 Z# Q( U2 OMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ Z" u1 ? h; v0 h$ C3 @/ kMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
% T( u+ w8 s' g) Y; W5 {- zEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 H' x0 R: Y! _7 ?& g
EDMA3_TRIG_MODE_EVENT);
! b; n. @6 Z' n ?6 N8 dEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
9 C- D% C+ e. W$ x aEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
7 k: R& d/ N% ], e, O1 eMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% U1 y4 u+ c) AMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero *// W1 _5 I( w# I* D- @& L$ O
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
. I2 ^ K3 f% xMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
c* S2 [1 L. k8 \6 d, rMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 o% Q3 ?! b/ Y a0 M
}
% X( o9 `7 c! k请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 2 x0 x" T& R+ z7 ]
|