嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
' \4 _1 p. _- _' _7 i7 ?/ Y' Xinput mcasp_ahclkx,1 d* `( _5 Y3 h* c: t
input mcasp_aclkx,* A$ t5 R: A/ e8 m- s
input axr0,
& ^, |2 I4 i( q8 k
) T! C6 w2 w5 y, @output mcasp_afsr,* l3 m" s8 B, G$ N" g1 y
output mcasp_ahclkr,9 j- B. I) a* n' i' u4 m; A
output mcasp_aclkr,
# [% p. k  a+ _; _. {( doutput axr1,1 u5 a& ^( e" l8 O# d4 @8 Q
assign mcasp_afsr = mcasp_afsx;
! w' E7 r. Y; R2 ]5 m8 ?  Nassign mcasp_aclkr = mcasp_aclkx;
+ h$ C6 ?0 u% B/ A2 aassign mcasp_ahclkr = mcasp_ahclkx;
! `, ]# W# K, ]assign axr1 = axr0;
# }, T3 t$ G! o6 {* y' K
& \( U) {! J+ N. d
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 ?0 \5 ?4 W7 e' H, i: A
static void McASPI2SConfigure(void)- `% Z1 R6 k) ?
{: J! n) F7 G  H$ q( j  j: U
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, E! Y9 _7 R" `$ m# N" V8 T% pMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
- n5 K: {3 Q+ TMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ l$ S2 `* D. b) J& m+ y% B
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
+ w% H! _9 l2 A2 C5 W! wMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 d4 a3 x( F, YMCASP_RX_MODE_DMA);8 u1 E% @9 Z) V6 {: U
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ N$ L* t6 `! D. |; N0 Q& bMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 O7 w( z/ [5 r. d' v4 }+ |' m6 k
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ! L) v: b# `! X% a
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# K+ v% [' ?  C# U5 a+ UMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: U$ {: X! V& S% m+ K& |MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
% [/ ?7 x1 J' j3 AMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 y% i. ^; J- g) q3 ZMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! g  F0 z4 R+ W0 @+ T( A7 n: s: xMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ s3 h/ B' U" ^
0x00, 0xFF);
/* configure the clock for transmitter */
, s5 A. s; w  UMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( G1 t5 |. O% W- q4 x9 _; t. P8 eMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' H5 O; D+ C7 G; B! z# m1 t9 d3 JMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,$ X& B# K+ E- j8 `: N
0x00, 0xFF);9 x8 q9 y, t  N+ B8 z9 I9 b

0 ?2 F% ~& }: o5 Q/* Enable synchronization of RX and TX sections */
4 G- ~8 m) s8 h9 x4 @/ |McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
: s6 x; h& u; rMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 ^- e! d7 x4 L
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
. Q  W+ }& A) ^/ r9 d! R+ p) N- o) A** Set the serializers, Currently only one serializer is set as
% F& S% O7 J5 V2 d' p* D** transmitter and one serializer as receiver.0 U0 ~, P' i( M. Q; o
*/! }/ S. n2 ^0 s) g! ~9 ]$ p
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! S2 I) x' D; v# @0 X. [McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*3 f7 `+ C8 b$ r0 K' y
** Configure the McASP pins
4 ~6 z1 p* x' U7 b% a( a** Input - Frame Sync, Clock and Serializer Rx
% Q% D9 o$ S0 D; N, z** Output - Serializer Tx is connected to the input of the codec
- \; R5 ]9 W" t) h  V+ h*/
- p5 ?$ f0 r- @2 M( L' lMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% h4 g/ k( o6 L/ J. J
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" m6 H, M4 X, q* C
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 {. Y# o8 N1 I5 V. o$ z; F- n
| MCASP_PIN_ACLKX* I* L+ H7 a" t& {, }/ Q9 y3 u6 j
| MCASP_PIN_AHCLKX
, h& G$ p1 x# S| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
5 s% }% C  O3 S+ fMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
4 o0 o7 H4 w" x| MCASP_TX_CLKFAIL
) m( n0 B6 U' B" v% p6 s+ B- U| MCASP_TX_SYNCERROR
6 n* d  n" l! X4 W| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 8 Z9 p- \- x: a$ a
| MCASP_RX_CLKFAIL
/ y- g- z7 E2 G5 i# x3 w  r| MCASP_RX_SYNCERROR # V5 V  Z9 [5 j  F& Q
| MCASP_RX_OVERRUN);
0 P. [! o, a/ H/ d}
static void I2SDataTxRxActivate(void)6 z; g# Y  m) }
{
9 r4 f- L* Z# |( x( {/* Start the clocks */" l* `+ J# T( e" R
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 f4 B4 Y. L) i, c* n" [
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
' Q2 x# [" q+ N; nEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) t1 A( W; Q2 _, Y0 R, \
EDMA3_TRIG_MODE_EVENT);6 c( u' k( a/ ?3 R
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 S' J  `0 {; ]3 B- VEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */! @1 D. P3 Q( ?1 _  `. S* {" O4 L
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' e! j3 V  z' A2 C( W2 H4 R# S# U
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */; [  Q2 p, V/ y1 ]2 [
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
1 P! u& N$ J* ]% n4 C2 W! }McASPRxEnable(SOC_MCASP_0_CTRL_REGS);: P8 Z* e# l% Y2 S
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ d. C' D0 ^0 ?}

% ]. i. G4 k1 I. c8 p$ v
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

! n$ @0 ?: Y) B- v5 N




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