嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,% |" W: q/ z2 a
input mcasp_ahclkx,1 J: Z! Q3 N+ z/ K: S+ {& n! O+ O
input mcasp_aclkx,/ @1 B. f! K" y
input axr0,! ~) R3 ]1 q3 Z
" [; |2 M  y0 i6 M% r  q, y
output mcasp_afsr,' _% T. @: F. x; k9 [
output mcasp_ahclkr,
5 m! I+ P: O& \" B% j: q' woutput mcasp_aclkr,
" Y5 f8 l) W# ^output axr1,# O& S9 D. B; {+ G: x  v
assign mcasp_afsr = mcasp_afsx;
* N0 m0 e( `( z# passign mcasp_aclkr = mcasp_aclkx;
. A+ R3 n1 S$ P0 P" `assign mcasp_ahclkr = mcasp_ahclkx;# c" q5 Q% A1 o8 A  Z/ N5 P
assign axr1 = axr0;

; H9 ]3 P* i! `% M5 b2 k0 h+ B& s8 s( X' U: ^0 Q- K1 w
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

* C0 P! f% t2 p. W7 R
static void McASPI2SConfigure(void)
& D, q& @6 s; ]% a! V{
  K* n  d) d7 f+ }McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( w$ ^% L. z! L4 Z8 D+ [" `( kMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */# A/ a% U" A4 U2 }  V1 |
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! q: Y/ L" D1 i9 C
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
7 h* v/ H: C) d/ g& q2 FMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: L/ v+ Q4 W# o" P: G: R/ y0 T5 b, u* _
MCASP_RX_MODE_DMA);
0 e+ {" v% P8 S4 MMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) r& p* s& U" s; D1 Q6 AMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ [: q$ {# _' L( Y. I3 |
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 A; f" \) A) i! k9 n
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) S9 ]' f" m2 }, z( c7 pMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, X; M. n( b! H* \% K9 K# XMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
. Z) R/ d) g- H  w  XMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) p6 f7 c7 ^9 g6 }5 U7 DMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); / Y9 s9 i* p7 e$ P2 J
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% X+ O; [( c6 ~  B3 ]1 T& b6 Z9 ^0x00, 0xFF);
/* configure the clock for transmitter */& x7 ]( s, L8 M2 l* J' \2 l
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
# O+ \% o3 l) N' ~6 Y* ^* J) {McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); " N2 N: M- k# [" l- M& T
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) U1 g" @2 a/ I& L0 C$ O
0x00, 0xFF);
$ f1 C( w: J6 G+ S; I) c8 v+ r0 x0 z" u7 \6 v/ M! \
/* Enable synchronization of RX and TX sections */ & w. z  J; t* g1 Y7 g/ a! d4 c
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 s3 Y9 `$ f* n; h( JMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 a6 n  I1 e7 |( D7 q1 J) }$ ZMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*- o& v9 W, b2 z" _8 P
** Set the serializers, Currently only one serializer is set as1 _  m) P' v2 P0 j
** transmitter and one serializer as receiver.+ w5 u6 i% @4 v( @# `) ?' S
*/+ w& U3 Y, |+ i  D5 t6 T4 r/ \: {- p
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
: i: M2 D6 ]8 S: e0 sMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*) c/ F% u) [$ _9 k% S8 [, f
** Configure the McASP pins 7 d0 Q9 |7 i8 G0 `# z+ F7 M) \
** Input - Frame Sync, Clock and Serializer Rx
6 `/ d/ g1 P( y+ N8 D** Output - Serializer Tx is connected to the input of the codec 6 P( y: U$ ^& i- |/ w
*/! c* H) o$ ^, b4 R5 Q  Q# r$ p
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 [0 S8 b, y3 G) a. q8 x! Z( C# H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ \6 _# k2 h; B" F/ R& O- {
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 s/ c- a4 E3 p! b+ C: H
| MCASP_PIN_ACLKX
. A- w" q7 e& ]| MCASP_PIN_AHCLKX" U8 M- U+ U2 G/ Z
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
6 m* q( }' H! v3 m5 N0 BMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 U% ^. T8 B: ^8 ?
| MCASP_TX_CLKFAIL
- s  B- d$ M2 d0 ?| MCASP_TX_SYNCERROR
) _5 {6 m+ j( l5 `8 X) }. ^- V| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
8 A1 _3 r+ e2 T" I' L3 n' {7 M6 s7 d| MCASP_RX_CLKFAIL: V" d8 F( X* H. V6 A
| MCASP_RX_SYNCERROR
7 f3 B9 m# j) c$ @  j& k3 _& F2 L  n- b| MCASP_RX_OVERRUN);
' k5 W, i$ v' k. L" l}
static void I2SDataTxRxActivate(void)  i. d/ q! q5 }6 E7 W* S& D
{" W) y" U9 M" `- @( f* P& R/ G
/* Start the clocks */
: X4 J- M6 `" M9 @McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" i: D4 Y; B8 ~* _$ s0 F; T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 d: J! F: Z) }' @. M2 h. u9 d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 Q% ]! H' f$ p( WEDMA3_TRIG_MODE_EVENT);
! R- ]/ h1 L  m9 W2 @+ p' w' ?- hEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,   ^) y6 R8 S4 W9 v2 X5 C
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */# I6 x3 U: u9 U" s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' w9 H5 I" w$ b  W, q7 Q6 |3 n/ N" _1 I
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
& E3 j  m" O- A6 Z/ [$ pwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
! _$ o: a& s, \, S6 qMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
6 o. n% T8 Y/ V2 O5 iMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
0 s( u; i0 G% W6 `) m! n}

; A& y# H( r. i, y0 p5 e* O& K
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" C; \5 ]5 [2 L& m( y





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