嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
0 m* W/ g6 `, k  Linput mcasp_ahclkx,: ^# F! o3 m; H5 D1 I
input mcasp_aclkx,
8 O$ v1 R& w  ]& V( g# U' D' Einput axr0,
! H; E( i2 y: {: T8 ?/ b& n8 T" \
, s3 g  P) H  }$ Uoutput mcasp_afsr,
0 S4 b( B# E# r/ R5 `5 \5 m" m. `6 Youtput mcasp_ahclkr,
2 q, m" n6 a9 B' S! xoutput mcasp_aclkr,
  W  }& {4 q4 ~" toutput axr1,# J  x  c' @: W9 H2 B& {
assign mcasp_afsr = mcasp_afsx;
8 I- }$ y% [( ]assign mcasp_aclkr = mcasp_aclkx;
, I& d# s' F. H$ z; p0 h/ Nassign mcasp_ahclkr = mcasp_ahclkx;6 k" c4 W' N2 u( M4 u6 b/ a
assign axr1 = axr0;

3 }4 g& ~6 @0 }7 s# P( [. x
& p1 D+ V4 v6 a+ Y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
% f( {% B! J' i" r
static void McASPI2SConfigure(void)+ |$ y) S  H4 Z  d8 T
{
2 {% g: Q% H9 h) z! rMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
) z+ q; o+ A5 T- J  p! f4 HMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */& R3 E; \# L" l9 P* V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, K) [3 e' b0 ]" S1 H
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
' g1 q* y3 ~& a5 m" cMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* {9 ^/ E# m( y/ d6 g. q& z. U
MCASP_RX_MODE_DMA);- X5 r6 G$ N' h
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 a7 s7 E' u; g* p0 [) s6 H# IMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */' d# ^) y9 t7 X8 V8 t% E
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 _& P( \! H3 f
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 H% o: r8 s( q, u. UMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! e4 v0 k: m' p3 x# ^6 x# P" f( JMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */. I4 M/ W  ^4 |+ l
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 v% D  e: t# P( _: \- ]) Q2 G
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
  Q0 j' {7 w7 h1 {# ?2 [/ U6 \McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,3 n" I+ P  m; i* ^
0x00, 0xFF);
/* configure the clock for transmitter */
/ k/ o. l7 a& G1 vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
" c3 I3 d( ?- @' H: s: JMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # M* v! \/ O6 T
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 B- A8 |4 z* G. Q8 Q0x00, 0xFF);. X' w5 J; }% x  u! q( Q

1 q( E, s1 {. }/* Enable synchronization of RX and TX sections */ ; W$ \% U% m1 R3 n, e& u+ r+ b
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */1 \/ U" b/ C- s+ T4 I
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ g( j, s- K0 p$ N" ^McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
" o% O3 R8 k9 L, k** Set the serializers, Currently only one serializer is set as0 j1 ?( u6 y! |
** transmitter and one serializer as receiver.1 E" ]! _: w4 g: Q) ]% ?
*/, {& p# R7 c7 w4 f/ c2 e! O- Z) g! g& Z
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; m! I8 h  X% j5 B
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/** T' x' F, D- u5 e
** Configure the McASP pins . W1 m# |2 P( @  b
** Input - Frame Sync, Clock and Serializer Rx
6 c7 f: ?, f$ B( O4 g# F** Output - Serializer Tx is connected to the input of the codec
5 }; v( ]7 b. _*/  e$ G+ U5 k4 D( H
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
& i5 ]8 t$ c' {8 l  A- n  R/ O: ZMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 g* F$ d, j$ F0 g6 @; p& D$ s
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% u/ g! |/ l! H5 I- d' r" o. Z. i
| MCASP_PIN_ACLKX
7 R6 t! w. @. R; ?: w| MCASP_PIN_AHCLKX
/ |( y/ E# e9 v" D* [6 W| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
, K# Z* p5 n7 PMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 M: |; G* H: T& H! I% J; p
| MCASP_TX_CLKFAIL ; M3 K8 t3 I* x
| MCASP_TX_SYNCERROR
$ U7 k! H& ?4 P1 R* z. ], J| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
$ r' h2 C% t) ?) C2 u' N. H5 W| MCASP_RX_CLKFAIL* |7 d9 N% h- Z' u* P) c( [+ c
| MCASP_RX_SYNCERROR $ e# c' i# y$ l: a  _- I0 {; E6 @2 B
| MCASP_RX_OVERRUN);* I& w6 @/ ]7 B2 a& F; }) A! g8 y* z
}
static void I2SDataTxRxActivate(void)9 Z  E( N/ o! H
{# e4 y( L- H8 \% l9 @' }
/* Start the clocks */) [+ Y/ ~. _2 y; u0 e
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! n8 y6 N( k; G6 ^! p$ `* c) }McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */) v0 Z' F" O  a/ b- d; R! H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) y+ k# N8 {6 E1 R) v3 X& S1 R
EDMA3_TRIG_MODE_EVENT);: h) D  V# o- Q  {: F% M* a
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 D! e; g+ }6 J" WEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
# U. d+ g+ s; d/ X% `7 N; ~; GMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
# ]' ]$ a, s7 P" PMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
! |( [2 N5 s, A" P) y- P8 Y# twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */) J9 l8 j& a. E7 B8 r9 a
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
" R4 `# x! d' W" L) ?$ \McASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ u+ `2 a0 V, S; v  A. B
}

" k/ q! p* F/ V, P- t) ]
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

( R( z. A! l$ C+ H. f9 F




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