嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
( S/ v7 q+ A# q; i/ y5 uinput mcasp_ahclkx,
' _& y- J7 b0 u8 {& Tinput mcasp_aclkx,6 p: s! L+ ^* M9 o" g9 b
input axr0,
( }& }5 V2 }! g) y% G! R
7 g5 ]$ C2 j3 ?5 l0 ~6 C7 w2 l" ?: Xoutput mcasp_afsr,' K  C7 P5 D4 G# K( X1 ?
output mcasp_ahclkr,
$ z( _/ I) q0 X% W; {output mcasp_aclkr,
+ M& t# }" a; z- ?output axr1,
. I$ T% J2 x  Z% o5 y- p
assign mcasp_afsr = mcasp_afsx;
" o& o1 c8 N9 f0 v( s3 Cassign mcasp_aclkr = mcasp_aclkx;/ ]0 Z: B9 p$ L0 y
assign mcasp_ahclkr = mcasp_ahclkx;9 ^' l# H/ q0 ^. {1 P5 R* }4 {9 U
assign axr1 = axr0;
6 k1 o  t  _5 y" H  L) N' b; _

* h2 Q3 ]' l+ h2 p1 V9 \
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

+ \& ]0 p% d% H- t
static void McASPI2SConfigure(void)3 \2 B+ n9 H9 j
{
# ~' U( G9 t3 w2 s: NMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ l% P/ s5 w2 e+ a: L" CMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */- k  `; P3 {& `
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ q7 p; \2 m! l; z& V# K+ }
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */% j  ~8 @! Z, f& Q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 u' ~  |5 B1 gMCASP_RX_MODE_DMA);- d1 n" b0 n! ]! M/ D
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 V+ C, ]) @; [) c& P
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 G: L# R6 F, d+ ^$ U6 v% E( M1 VMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( T2 q: D% m# j" a- K9 {  W
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 ?2 P% F, K0 |$ ]+ WMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 i  \9 d- i+ t( Z$ P+ ^MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
: v- Y( w1 c5 y( mMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);/ a+ b4 y5 `5 a4 u+ U4 ^
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); " L) i4 v; N# Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,1 F1 _7 g& z. L1 `, @
0x00, 0xFF);
/* configure the clock for transmitter */% A5 i! v6 Q+ C* {
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; g0 O5 C" g( G2 V- z; d
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& A+ f( }8 \7 z7 w& }& ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
( k3 Y# }8 j6 x2 }4 ^0x00, 0xFF);/ ]2 r  F3 g2 \  C( W& I  j
* B3 B' A& W( f
/* Enable synchronization of RX and TX sections */ " B6 \* n$ x2 f7 e& O  @( K- u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */# n  @' ~: `6 I+ z' ?
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ Z  D2 _8 W2 Z$ @. JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
0 G- M# o4 }' y# }" L4 F$ r** Set the serializers, Currently only one serializer is set as9 a' K# ~4 w$ x. S! Q
** transmitter and one serializer as receiver.% Y5 ?( r1 [( R7 U
*/
7 w& i8 u- @+ g" lMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' n3 x2 }: G( Q; N( i; lMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 n6 `, m& _- b
** Configure the McASP pins
; [8 z4 n% M, t# E* y( r** Input - Frame Sync, Clock and Serializer Rx
8 c% p+ W/ o  F. h** Output - Serializer Tx is connected to the input of the codec
7 S2 d4 b: j+ A( o. q1 V*/
$ ], q4 G9 p; n- P+ r- i9 mMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. f; a0 S/ P9 p1 C/ a4 M, j5 xMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 J7 W( X/ ~( \$ S4 P, f- R: G7 ?
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
! o2 E/ S) y( \0 v$ A% q| MCASP_PIN_ACLKX
) P: g6 u' i" W8 k8 u- ~+ z9 v| MCASP_PIN_AHCLKX
2 }- Q  Q* I* {6 c7 z& ?0 f| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */! P9 f* b1 a8 N$ }; J  A
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) D% ]9 g  w; z$ p/ \
| MCASP_TX_CLKFAIL
, D/ |9 }4 O0 k2 X& K+ F# l| MCASP_TX_SYNCERROR, E0 j+ ]4 P1 H% z
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
7 {% T. E" p- ?0 s/ W% m| MCASP_RX_CLKFAIL3 |: I' A* D' B
| MCASP_RX_SYNCERROR ; t3 J6 Y" V$ C- z9 N
| MCASP_RX_OVERRUN);4 y6 @$ G0 @1 ~
}
static void I2SDataTxRxActivate(void)' Y$ f! R6 X: n& E+ c
{: T& z; \- H- f& \( W  Q
/* Start the clocks */* W$ c+ Y+ x6 @5 r7 F( {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);5 ~1 t5 }6 T; `3 T( u% R: R
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */( e. V' u/ I% g0 ?  H$ ]' c
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: N4 j6 K$ O2 K
EDMA3_TRIG_MODE_EVENT);
2 w9 g1 @( k% U0 D: fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 Q; t1 h4 L  L3 E9 J8 ?
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
  F4 ]- |$ n! V, i( p8 H+ {McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- |& V) U) l5 b: G, y% SMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
7 L8 E  I- C9 V+ Hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */2 V9 G( m. R* O
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 Z$ J% p$ ?* l& e% d7 ^. V8 B( h) PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
4 d; t( X4 T7 E1 X}

( ?! o0 V2 z+ Z+ Y" I& A
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

0 R- b" q, T# N6 V. B. D2 q




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