嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,3 a* e5 f& @. Y8 q
input mcasp_ahclkx,$ I% m. ]" k3 E% Z( f; w8 R/ O
input mcasp_aclkx,
& {) L! u  |8 z9 Y0 ^: R+ M+ a! _input axr0,
- A5 l- i: H& V8 P6 {& B; p  c: _; ~- v) o
output mcasp_afsr,2 C( h3 j2 j, U+ N' `3 A$ h! j
output mcasp_ahclkr,4 W" F( z1 T  v( B
output mcasp_aclkr,
/ Y- P5 w$ L6 ]+ Foutput axr1,. p0 c! g8 V* Z1 O7 n
assign mcasp_afsr = mcasp_afsx;
, Z% {. J3 \& M9 d7 B+ D; fassign mcasp_aclkr = mcasp_aclkx;( s/ B/ P' `$ D' a  @" ~0 o  _0 }
assign mcasp_ahclkr = mcasp_ahclkx;- Q' f, \8 l7 L: u* M# m
assign axr1 = axr0;

8 a9 w+ D& U- m( W& u" R# }
+ C! q1 D' e. w
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

, p* j8 H4 v, B9 H' g7 q
static void McASPI2SConfigure(void)& J. i* |' E3 i3 J; w2 g8 D8 @
{
  R% J& Q! H4 v0 KMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 o$ F8 N  O. T7 uMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */  W3 C) n" R2 x7 b0 t3 J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);7 ?& ?) {/ q" {4 o9 x" p
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */8 M4 Y( b( A. D7 g
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. F2 r; Q8 z( C8 R6 S
MCASP_RX_MODE_DMA);# w/ P: t' {' R* r0 q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! [: N0 e7 P, V/ K7 {6 G7 x# J7 xMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 {9 {6 g5 B8 [: u/ HMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & A$ h0 e; C2 v$ p# V
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 L: j) ~; y( e9 ?! {McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
( ]# x9 e# I( a" y, g4 [. ]1 `; jMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
- |" r7 b" l0 J" GMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! s! w* q1 z/ H8 ]( oMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . Y- f0 s( _9 `: n; G& A/ f2 b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 Q" T% y! S, y0 H0x00, 0xFF);
/* configure the clock for transmitter */
: b9 o& z3 V4 B- E2 eMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 m! p$ z7 ]/ P4 d5 @. \* M5 WMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);   K$ B6 P2 F! K
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,7 V- S7 t) {. q; a6 e
0x00, 0xFF);5 V4 I9 `9 |" A7 k- f$ |
) r- C* K& s( t9 ~
/* Enable synchronization of RX and TX sections */ ! G; m5 h8 V, Y) Y3 L
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ E( ]6 I0 X6 M! o- CMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 A5 f1 \0 P4 D2 t% \5 JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*4 I! h9 S/ X8 X5 q' v
** Set the serializers, Currently only one serializer is set as: W# W: w% T5 ]% c5 x
** transmitter and one serializer as receiver.
$ W, D/ k4 Q) S- h$ k, ^*/& T+ S. O# \. Q" j, q8 \0 I
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ y7 ]- S/ m% cMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*  [" I  J3 @5 f- R7 t& o  G+ K
** Configure the McASP pins ' [- U9 b. }; g! R
** Input - Frame Sync, Clock and Serializer Rx
. q% o, L/ M1 M/ ^) c1 s# F** Output - Serializer Tx is connected to the input of the codec
' k, W5 j1 u, L7 W, I*/
7 _% ^1 M( E2 ?" V0 OMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ `/ I8 f, C$ d. DMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
7 {8 q3 T) K& f4 ~9 DMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ A4 M( u. U6 ]| MCASP_PIN_ACLKX; Z: d% w( m) Y! Q
| MCASP_PIN_AHCLKX
8 `) O0 c( Q5 F0 a9 p# Q) s$ I. {| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */6 i, Y8 g/ }- a& w9 x1 i
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # ~; U+ [$ l! m: M
| MCASP_TX_CLKFAIL
9 D5 h4 d( d, m0 U3 _8 || MCASP_TX_SYNCERROR- T4 t7 N' x$ H+ {
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 B+ Y5 n% J5 a% M- ]. X' T| MCASP_RX_CLKFAIL
& O& D7 I* u6 x& N4 J6 |* q  }5 q| MCASP_RX_SYNCERROR
2 J; a, N5 f8 o+ K' a, A, I| MCASP_RX_OVERRUN);
3 t7 ?1 S5 P4 e; d/ j+ M# J}
static void I2SDataTxRxActivate(void)
  V1 R+ R) `% V7 K6 x* ^1 u{
7 z+ o* k7 @7 h  p4 ^- d& V/* Start the clocks */
1 w2 P6 n2 ~9 Z( k" f+ w8 K% ~McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 S& \1 N, Y* b# [McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
  f1 u8 I' V0 r/ OEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! G1 w( h7 y9 O5 f# I
EDMA3_TRIG_MODE_EVENT);
6 L) W+ i, x) {( J1 EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % }' n9 S" q  p) J3 o4 j4 s
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */# t# P- o# Q$ J1 j5 J9 Z
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' O% K$ [' K" M7 W  j6 bMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */, C% f, ^8 X( Q' y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */  C1 y# r, U9 `
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( L* I, x2 [- tMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' t- ?( ~! w5 I& s7 a* h}

- f; a7 K! V! h$ i3 R) T6 p
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

+ n6 J' o6 Y4 G) W- c4 _6 ~, a




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