嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
+ O% l" d) N3 _& Winput mcasp_ahclkx,
9 R( i/ X: F1 l3 C. @input mcasp_aclkx,' x+ n$ U5 y2 v2 `3 E( Z: ^
input axr0,: ]5 p% \; C2 [

6 N, Q( H  Z) s% ?& H1 {output mcasp_afsr,% R8 ^/ f7 M/ J6 `' q
output mcasp_ahclkr,: E; ^( [& a1 M" q: c/ l  T% ?% W
output mcasp_aclkr,
) R& ~( z, j, ^( s* I# |0 X  {: K5 H$ R3 Coutput axr1,$ u2 Z: i# j+ `5 J" @1 Y( f
assign mcasp_afsr = mcasp_afsx;, U8 J, s* }% Q- j
assign mcasp_aclkr = mcasp_aclkx;* m. E% _3 r  p, K- d; D
assign mcasp_ahclkr = mcasp_ahclkx;
' \! z- }( U% d$ G; b$ |! p, {: I% Passign axr1 = axr0;

9 L6 _3 L% |, }1 ]. `- G% f+ ~" w  ]0 F' g, U
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

5 x  X/ p: f2 M; T7 R3 L
static void McASPI2SConfigure(void)
3 M8 \0 x) m6 C" k4 m  j# x{
4 I1 G8 m! a5 U6 wMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
) Q2 f. k: _4 T! ]7 d$ ~McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */3 V  h+ y4 I" K8 l  n2 \/ ?
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 F6 S$ X& k& X2 E/ n' O
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
  D# {" c0 v" j6 L; L4 q" t$ _6 O, vMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. f2 w3 e" @5 }9 e
MCASP_RX_MODE_DMA);+ P7 B9 \3 l" Z$ L- h% Y/ ^
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,  o" l* I6 |- {# [" u
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 g) y' w: q4 v4 r
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 E& e2 Q! A' m1 e" B, x
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 N* u) O8 t; j* ?+ g8 d$ S; f: e) E
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * ]; g# ~' z. b2 x% l
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */4 k6 h; }' J. I
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# ^7 a5 D8 o4 [# O7 u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 r+ Z5 }, s6 mMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! n7 f% Z$ r3 b. D$ L
0x00, 0xFF);
/* configure the clock for transmitter */2 S- m3 O8 ~) b) j5 q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& \! F+ d) ?& ^- UMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" o0 m& J3 t$ s; B& Y/ B* xMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( M$ ~6 b& J$ F3 r* j0x00, 0xFF);2 H, N" y% A% u9 I

) h' H' c# d* u/* Enable synchronization of RX and TX sections */
) _( B* k5 m# Y+ [McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
! m: B- _+ ^* E+ |9 L( }) K* j6 MMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
# D( E' }9 b+ B+ x" K5 n+ bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*+ t' Z6 I) _; Y! ^
** Set the serializers, Currently only one serializer is set as
0 R  [, e( r: p$ t7 O7 u** transmitter and one serializer as receiver.
. [1 ^  m! O3 ]( _  }*/
0 y6 K, F: q* ^0 t4 xMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 Y3 b3 {- y3 F) SMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
, Y' I: b: z7 P** Configure the McASP pins 2 w5 Z" V+ ~9 Z4 M
** Input - Frame Sync, Clock and Serializer Rx
  H+ `! c( _+ w8 m** Output - Serializer Tx is connected to the input of the codec
" I( N% `* @3 V2 O$ a4 k2 q*/# x8 Y4 N5 e( o2 |, M
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% j# A9 i7 w9 x! V- BMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! a6 |4 ?) n9 T- u$ ]! N
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 a! b* ^" U6 Q
| MCASP_PIN_ACLKX
4 v! ~7 s9 n2 a4 u, e| MCASP_PIN_AHCLKX
1 o* Y: z0 s# A0 D6 y2 m| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
0 P5 S' H( W+ fMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 h6 {" X0 Q: I$ l1 R. N; C
| MCASP_TX_CLKFAIL ) ^3 Z$ i# K, M  ^
| MCASP_TX_SYNCERROR
, `6 L0 @% H" }- A2 W| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
# W( r5 N2 s" o& O7 V! [: g7 l; m| MCASP_RX_CLKFAIL
/ t4 j' w6 j5 F" J) m/ ^* ]! o| MCASP_RX_SYNCERROR
& A, Y& r6 e  m$ n+ e| MCASP_RX_OVERRUN);
: ]* o, O! _/ G6 K}
static void I2SDataTxRxActivate(void)* |' }: c2 Z5 G
{3 ]1 P. \8 M/ M$ W/ a
/* Start the clocks */
/ I3 j. B0 E2 ]" H5 iMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. u. A3 }! V* zMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
5 F. a; r2 j$ R6 @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 l0 P. D* k2 p
EDMA3_TRIG_MODE_EVENT);
2 j0 p9 h6 C* g& f9 X# j3 ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 Q" x' o; O/ ?! vEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */" i% m, N$ m  v7 Y: m' ?+ g1 X
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% p. j$ n6 R, ]" U  g
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */8 Q/ e+ j3 K9 }5 ]
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */2 y" o7 k+ _2 l# f
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 c+ K$ w% ^* f6 d- R* j
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);+ }, H; ]- H7 x' u! c  Q
}

" @. U  ^! f" n& h) L7 D
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# N/ h" c1 ?5 P





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4