|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ v5 g9 O1 m# z" Q/ L* n
input mcasp_ahclkx,; W# Y) s+ i3 U* ]9 D1 Y- k
input mcasp_aclkx,9 @# d" e" S, n
input axr0," g; L- H( K; \: j' g g
. B& Z, y7 c9 a* }2 O* D0 toutput mcasp_afsr,5 U1 d1 C. }: u
output mcasp_ahclkr,- d7 F" ~0 z. Y) W1 g* d
output mcasp_aclkr,
" j, a4 s" F# C( Q! }; S. Ioutput axr1,7 i1 |6 s7 |" Z: K0 {6 U7 L
assign mcasp_afsr = mcasp_afsx;0 O0 V; ]: e" Y8 y$ {
assign mcasp_aclkr = mcasp_aclkx;0 f u" F: e' ]5 `
assign mcasp_ahclkr = mcasp_ahclkx;. P F) Z5 S) b- p, D) n6 R% G T
assign axr1 = axr0;
' b# ~: d' `8 C3 i4 d5 M- }' T1 O6 i5 { j% a/ | b% c
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % d0 Z3 V) [# x8 w7 `" C; n' W
static void McASPI2SConfigure(void)
9 s) Z2 T/ A% {. c# [9 U{
! b+ ^6 z& p/ t. `5 K; T, FMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
2 q6 ]% T) J2 u& [' a$ X ~/ t4 a9 z- w1 _McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */+ I4 Y+ b' U0 w" x
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);( h' P3 b: I" _0 J3 f# y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */& R) X; p. d, {2 Y: S+ l* l
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. Z# W ]! r P* ]# ]
MCASP_RX_MODE_DMA);
1 M$ d S! {+ Z- T5 k# F1 IMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: m4 k) f' V8 E/ T) Q) TMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */, t$ Z- o( y4 U- R; e
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
( g$ S2 b/ ?1 e% p* xMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 |! l# F; d( n" }; R
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
% G! ]+ g9 x! v3 G' m5 JMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% I3 r0 ^1 h/ k6 ^- D0 q
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
1 e4 C2 R6 w$ L- S% vMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 o6 n5 _; e; e
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,. p$ `4 q$ g; _: }/ J4 p
0x00, 0xFF); /* configure the clock for transmitter */
8 r7 Y H3 J0 D# M9 oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 [6 f, z- U9 V& L4 n4 B: l
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% x( m- X: j4 g9 r; J+ DMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ N) U1 T( y' \6 i5 r0x00, 0xFF);- s" o4 Y5 @% A
& i3 [# n6 ~" c! m' I: I
/* Enable synchronization of RX and TX sections */
, a% o1 A' X& }* M6 fMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */% G' \. L& P/ F. \; [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) ~2 H( ?) i. t( s0 ?7 T* C9 mMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*7 b, p: r$ P: ]7 [( W- s
** Set the serializers, Currently only one serializer is set as
5 Z1 t% ^5 m8 E9 ^! b$ x" S** transmitter and one serializer as receiver.4 X: I& R9 J9 l5 O) g
*/
# L/ T+ F1 o- Z/ y2 t, V+ x1 \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# h' x- }0 X( X' ?4 k, R$ C3 i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
. u; ^1 z$ c4 m- {, [# `! J$ E9 X** Configure the McASP pins 2 t& m9 M1 U/ c4 Z- j3 z
** Input - Frame Sync, Clock and Serializer Rx9 @3 E' Q" j6 x
** Output - Serializer Tx is connected to the input of the codec
; h W/ z0 ]$ ]. i2 p*/
1 f6 l+ t2 e |1 wMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( X: g8 D4 O+ e8 i& @McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
a! H, j$ P# P- oMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; \ E6 n# t9 }- A. Y
| MCASP_PIN_ACLKX+ j+ e$ d6 {( G9 B
| MCASP_PIN_AHCLKX
* f+ o2 l# v8 [3 T) V& z+ Z4 R. I| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
8 i6 }* G4 M" P% I: sMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 f4 T+ |! q7 b! e) A
| MCASP_TX_CLKFAIL
% x& n' P& p- A @& B| MCASP_TX_SYNCERROR4 J: l# Y' U( ]
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & l4 l# M) g( i: V$ |2 o j
| MCASP_RX_CLKFAIL
! a- T1 @ k2 }2 W| MCASP_RX_SYNCERROR ( Z3 a7 F1 p4 S! Q7 P% W# G
| MCASP_RX_OVERRUN);
" _9 h7 \( l8 M9 F} static void I2SDataTxRxActivate(void)( E+ x) G/ T3 v! t
{
4 Z! H4 ?+ ?9 r/* Start the clocks */; S% y% h0 ~6 k
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. i, Q1 @3 \1 l: F; } |! Q9 c* {- j- lMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */9 w8 ~" T, H$ [
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ y: @3 ]5 p4 Z+ W2 ~9 ]3 VEDMA3_TRIG_MODE_EVENT);; V4 E. L* \: k( e- j% ~" ^& N+ Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- S6 ^% d/ N' f H* v- U0 N3 }EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */4 b+ y" d: e9 R9 G: r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) h) s" X6 _/ E& R
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
5 c$ [% L0 X/ {while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
9 A6 T# t9 I( hMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);! r+ Z% ?0 J g+ n
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
6 Z' }# g/ i" S: o' _}
: s- {) ~7 |1 R; c1 Z+ M/ u请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. % q; L' U7 P" |
|