|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
t' `) E. b) T5 B2 [* C6 ~input mcasp_ahclkx,
. P: ]* t* C/ f: o$ xinput mcasp_aclkx,/ U* p, ~5 B( h& j. h
input axr0,
0 Z+ l2 h# I9 n( y X
7 l# {5 d, ~1 x I: z% ]output mcasp_afsr,
) p( r T: z% [. H& H ?, woutput mcasp_ahclkr,
: l# b x1 Q5 A2 {0 ^output mcasp_aclkr,
/ x! r3 f3 B% T" y& voutput axr1,3 v! K( p9 M$ x" ^! `0 U1 X
assign mcasp_afsr = mcasp_afsx;% |$ n7 _4 [) r# _8 P
assign mcasp_aclkr = mcasp_aclkx;
/ }. u: B) Q/ ~- aassign mcasp_ahclkr = mcasp_ahclkx;5 _ h/ w5 p C' N" H6 X- j
assign axr1 = axr0; 4 E6 ?, G$ x- {: B" [3 B
3 m/ m l6 V4 u- j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
/ J& d9 B+ r; f2 J8 ]. t* ?* qstatic void McASPI2SConfigure(void)! T' S, V4 c$ u3 u7 \3 B; Q/ K
{
) ]% ?- Y- b& c; k, T' _McASPRxReset(SOC_MCASP_0_CTRL_REGS);, [: t ^' S4 B# `6 s8 h% p u! q `+ g
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( Q7 D; L/ {: V- a. TMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
. Q, T9 @0 R+ C4 ~' x, t% qMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
4 P6 h9 S" r( c% L6 h* |1 t2 y8 D ~: YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. O. y$ t9 E: n. \' A/ s
MCASP_RX_MODE_DMA);3 W* S7 |4 s& @, U/ e& L
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 G) w: v4 C6 T5 n8 h4 o3 y UMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */, p7 u; ?& u8 ^3 K( {2 p
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- }5 D y' u# e4 j/ n2 tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 W$ Y8 Y9 S3 c A: ZMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' ]5 F$ ^/ H2 g* |0 o! |% T7 pMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
3 f4 H- E3 \- c$ z! M3 J- qMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; H7 r, e, f% Q) I) e' v+ cMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' }% }3 F3 Q9 s* R# j _9 R$ U0 }
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; y! `: L# b" N! G& @# u
0x00, 0xFF); /* configure the clock for transmitter */& x5 |9 A: t. O" W
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 v" U9 B. k' q4 H, l9 G
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
i: L8 H |: \, a" P5 IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 o, n1 M3 l6 g# Y8 j
0x00, 0xFF);
( ~1 G/ [4 B8 I8 u' H
. ]& N* i" E( u9 ?, d l" c+ z/* Enable synchronization of RX and TX sections */ 7 W% _, B3 r" k# e
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 d, m' ^; ]% S" f- d$ TMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ r& X I. `2 Q9 e2 ?- `
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*& J( k: Z. d0 \
** Set the serializers, Currently only one serializer is set as5 o" |( m5 ]2 u& K
** transmitter and one serializer as receiver.
1 Q( a$ {4 L/ q*/$ @+ c/ r/ I% T) T+ |5 @* y( A
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& U" S& E3 t0 c1 y9 }McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*; t. F- z$ D0 a R6 B
** Configure the McASP pins 4 o, J- O- q( H+ P# Q
** Input - Frame Sync, Clock and Serializer Rx; g: W; `. r: g3 ?0 U7 F
** Output - Serializer Tx is connected to the input of the codec
) u, \/ A$ h3 K/ T$ O7 q8 l*/
+ b5 w* J6 ]7 U' @2 ^' x/ Z9 F8 w& PMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 A C/ F" i$ ~& wMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! f& x, m2 ^$ T% G6 g+ D
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 [$ A) @6 ?* e
| MCASP_PIN_ACLKX& r" C. C# T$ }6 j
| MCASP_PIN_AHCLKX
( X5 O V2 i- y) ]# i# @% i( l| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' C9 x# W8 H# K' b7 U
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
9 _3 J2 o# @: {! m- v| MCASP_TX_CLKFAIL
9 H% |' ^3 U7 q/ ~" z4 z| MCASP_TX_SYNCERROR G: v. s8 [% s; g2 F9 t9 X. e/ n
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 t& F* S* E# N) A| MCASP_RX_CLKFAIL7 E' p. n. ^) j0 U8 [7 d
| MCASP_RX_SYNCERROR
' i+ K( h Y! \' K- E( t| MCASP_RX_OVERRUN);
b0 }- S* Y8 u R} static void I2SDataTxRxActivate(void). z9 \. ]- _% k# F! @
{! r4 u0 l/ @& U4 D! N6 ?
/* Start the clocks */, `5 J. q! T Y0 }
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 z$ d. k5 r( k# u! a J/ s& G @% uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 y. Z# v+ W" K: l+ J* j, f' X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
. B1 |' x9 d k REDMA3_TRIG_MODE_EVENT);$ g; x6 f" w: V$ x0 V9 e' ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 L9 }# {/ q" S; s
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */8 v' L7 N' G4 a. H5 S- c3 V; `
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! c" x9 X) A' V8 P- v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */% z7 P7 \5 N( d* |4 N$ c0 }, q6 n
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */! n0 j# Y3 U9 c/ x0 X
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);) E1 Z) ~! x0 o) R6 }! s
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 H5 d. o! D& K! o9 l
}
, H( h3 M) f6 t0 C! ?请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. " E8 B I! @- E" f8 ]8 t
|