|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
1 j: H1 z8 _9 W, yinput mcasp_ahclkx,7 k9 |5 w, o( R# {' W7 f" x
input mcasp_aclkx,- Q( L' D7 e* J5 g1 v ~
input axr0,$ m* g$ W, z% B6 v. M ^" T4 c
2 ]+ U' H: _6 W, C8 e2 Noutput mcasp_afsr,
# w! B( ^6 V* I* N& }- j! K2 u5 Voutput mcasp_ahclkr,
0 v% K9 n! x0 Z4 |4 u2 ]0 goutput mcasp_aclkr, u: X2 W w8 ]: {3 p
output axr1,
1 d' o; h ` D4 d* } assign mcasp_afsr = mcasp_afsx;
" J' n3 e& l, _3 x* Lassign mcasp_aclkr = mcasp_aclkx;
: o2 ?/ _6 Y; Z7 Z( [% _5 Wassign mcasp_ahclkr = mcasp_ahclkx;, N. m) N) ], g: c+ g1 Q1 R
assign axr1 = axr0; 7 T0 X4 n$ ~2 ?( }7 q
. @' S7 G- s' ^7 D, n, C
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
$ r+ l4 V; g9 t, r5 J, Sstatic void McASPI2SConfigure(void)2 ?( C1 }: Y: F( n3 U2 S9 H
{
8 C( N$ A1 S0 J) pMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 F+ _$ C* T! u6 T h) F) i3 lMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
& W; m4 @4 x) h# H' N; T# u" zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
& R* v; s6 ?- x: g" n8 o1 HMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
9 t, y9 e8 M, r! U: E! N# GMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' @- G# F, C" ^
MCASP_RX_MODE_DMA); {5 q$ G! i; f
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ c- R# U7 g% h m: {
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */: w. P: ^! z+ w U9 f
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 o& C6 Y! V( {3 ?
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 T; z, F6 R: t, T. j$ g) GMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
9 V' D( f q C8 L" @3 R$ hMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */& o0 [( ~6 r2 X; L% ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
* W6 P0 a0 u$ @0 F3 dMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * \' r/ X( j, S! C( I1 c `* O
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 M: x: o( V2 G! M' S. r4 _0x00, 0xFF); /* configure the clock for transmitter */
' G# m7 w! E& W, vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* Y5 h# [4 L4 N7 B: I
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 e, O2 K. c# \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
o( M$ B, P* f1 K/ S0x00, 0xFF);
( T( S, }' F1 v. K; I8 @2 ^( w6 f/ M+ o. T& |
/* Enable synchronization of RX and TX sections */ : Q: Q4 K: ?0 Q/ s4 w4 r: Y' ^
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */8 M! z9 c$ {* C- J, {4 P/ J
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ _: C9 s, }9 j& e2 `
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
% t' @5 d8 X6 }9 B. s! E. q0 q** Set the serializers, Currently only one serializer is set as; u0 G! Q D* j1 e. Q
** transmitter and one serializer as receiver.
! J9 E* [# A. @1 \9 W- H2 Q0 ^*/
0 a2 L. k- d6 Q0 p5 nMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! `$ x {/ J. lMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** t4 }# G* P- t! K2 ]3 E
** Configure the McASP pins ) b, k5 Z! B% q# D
** Input - Frame Sync, Clock and Serializer Rx
3 T) Z6 w+ i5 G. C6 A8 W** Output - Serializer Tx is connected to the input of the codec
% F6 r: |. ?' K7 n*/$ b0 q8 E4 O, Z, D$ ]9 L
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; N" X% |1 B) c: K% YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
/ y3 ~2 ~( K- x% z" v" @+ XMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) p: U) C4 A- U+ Q4 L. G| MCASP_PIN_ACLKX
1 w: q! [- k7 j# Q' K6 K7 w$ m| MCASP_PIN_AHCLKX' y$ }) T5 g0 `* X6 e) o% M
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
5 U) u" k) d2 \6 z7 lMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: n( x- Z! [7 i' q8 G: S$ @3 s| MCASP_TX_CLKFAIL
7 }% q& k( J' |/ j0 F- A+ T9 Z: K| MCASP_TX_SYNCERROR
9 H' X f7 J$ M* b| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) m' r& X7 q/ L8 U( |/ `| MCASP_RX_CLKFAIL3 Z' T, g% k: }6 k& _# E5 u: {; T6 r
| MCASP_RX_SYNCERROR ! @, v+ ~) f9 \- l- r
| MCASP_RX_OVERRUN);" c! B$ m( u3 i( |
} static void I2SDataTxRxActivate(void)
$ j/ I2 [4 x" H' G# ]. h8 {{
3 H0 X" Z6 n0 q* K* l/* Start the clocks */2 V" o! t# e1 ]' J6 ^+ o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" _& N$ u0 U9 p4 A; ?+ r
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */$ B/ @& O6 A/ o1 S/ C
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 F& B( d1 w( L& n8 a7 M$ v$ o* `
EDMA3_TRIG_MODE_EVENT);
, D. D0 s5 S9 c1 \% N, GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & A# \2 U; P% J4 |( ~8 v$ N3 E
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
( f3 z- c3 q: GMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& t; B0 o2 w6 x P; u' M+ Q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */* m" D! j+ Z( k; }& z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */9 R7 ]1 {4 `' y6 ?/ s S# @5 W
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);( ]5 J" D5 S% z/ D5 {0 g
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 B8 ?# j8 u7 S! i, Q
} : S* v) d( `3 t, b
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" E/ j$ j: \: [, l7 x6 i ?# C |