嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
0 B' k. F& \0 D& M/ |2 }9 T6 `$ A! Ginput mcasp_ahclkx,7 E( E5 G8 y8 r7 ^& a: [
input mcasp_aclkx,/ B% X' O; E/ |* v+ V1 t
input axr0,
- {) Q* [' v* O- G# R/ d1 }: ~! P5 u2 u. c7 a
output mcasp_afsr,8 ~( n! b5 j* t1 B7 v' C
output mcasp_ahclkr,
' n( n# V  B9 V( e9 houtput mcasp_aclkr,
( `) ?" x# n, {% g% Youtput axr1,5 j0 R) e# j& ]4 t, [$ q0 e, X
assign mcasp_afsr = mcasp_afsx;
# K8 }$ j' C" X6 H) rassign mcasp_aclkr = mcasp_aclkx;
7 f, P4 K6 N3 zassign mcasp_ahclkr = mcasp_ahclkx;
, c# I  @1 Z* R3 H# x/ S1 Qassign axr1 = axr0;

8 K8 I  I5 E% i3 }, p- Z+ q- X" ^# J$ w
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: e% ?5 ?% V: T' p! @/ l9 E) n4 g
static void McASPI2SConfigure(void)
# x# t2 F4 ~" L{
' ^2 z' ?( G7 B7 r, k' WMcASPRxReset(SOC_MCASP_0_CTRL_REGS);6 k, p4 ?6 S- {% q
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
; V) v7 N1 s2 xMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);  ?' c; F  O9 U
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
  j( F" x: t! x: t9 F8 i7 j' P5 gMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& {2 B' j& L4 l% m0 KMCASP_RX_MODE_DMA);" t9 \! r, Z  {* f6 V" P/ W
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& k/ R& _5 w2 o) M$ dMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 C; ^+ T2 K9 J% ^
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 O- [/ ]5 V1 P" r/ i6 `
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' c. v2 P& N3 @' M. xMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 U) D+ b' k0 P
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
+ X2 O' F$ Z' a  q. q, hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" e# `7 e! N7 B
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
5 Y* y, A3 n& F+ ^/ [McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 [5 h: h9 [& f& D+ j$ x
0x00, 0xFF);
/* configure the clock for transmitter */' o% Y9 O  C8 _7 J$ g
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: j: x' y6 ^( ]/ U8 W
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, G% i+ p: g3 ?, t" t4 VMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 Y7 k, R) ^. [# d/ Q0x00, 0xFF);6 h2 T0 C) x; g/ J
. `* d0 w; j+ s! S* n3 U$ S
/* Enable synchronization of RX and TX sections */
, x5 M4 A* x/ m9 F9 y& ~! `McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
* S3 K: S0 a& R2 t5 Q3 {; aMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 R5 I" j  J2 o4 t  z% vMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*9 f( X% G, {" P) Q' \# P4 b
** Set the serializers, Currently only one serializer is set as  C& E1 g5 ]9 |/ G6 a
** transmitter and one serializer as receiver.6 w( i& \- z3 t, O
*/
: W3 i2 o) I) n5 z: O$ ]# D; iMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 u$ w) o) K1 K' E1 K: h8 D' d
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
$ T  @' S  O0 ^. g** Configure the McASP pins $ d' F1 b, k$ s0 j9 N
** Input - Frame Sync, Clock and Serializer Rx! X2 O/ O) s- L" n  z4 P/ ?
** Output - Serializer Tx is connected to the input of the codec ' t  O" a0 y% F' t+ r- ?
*/8 b* e3 f# q$ V; ~  l4 R8 R7 R
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 {) r: N: O' ]8 z" Y4 N
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 _: r. |+ Z$ A1 WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 R# m" h( ^* I: u( w| MCASP_PIN_ACLKX, ~0 X' ~# Z" C1 A) ~& w0 x1 Q9 y
| MCASP_PIN_AHCLKX
+ i9 m% h$ Q5 A3 ]| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */4 \! f7 g0 n7 ]  \) ~" |4 S* X
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & a  c4 j; g8 ~4 d9 Y
| MCASP_TX_CLKFAIL 8 u, M* ^- @1 k4 U! ^9 v. ^
| MCASP_TX_SYNCERROR- w1 X+ A8 q5 [
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR + A8 X7 M" W* u' P  o0 T+ m, G5 p
| MCASP_RX_CLKFAIL* }- m4 P$ j# P5 y
| MCASP_RX_SYNCERROR 4 y- G" L5 E: I+ \8 t
| MCASP_RX_OVERRUN);
6 v  i$ t) s% \) p}
static void I2SDataTxRxActivate(void)1 C7 n+ H( l& a: G" j, B
{2 ~/ W8 x. i  S" p  K5 ^
/* Start the clocks */
& W( y/ b% S9 ]8 ~6 v& ]McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
  A& {7 K7 y8 J( N2 ^McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */( W1 S. ?9 h: y& N' D# E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 x. U8 e! Y, S( w) W; M0 lEDMA3_TRIG_MODE_EVENT);  q" E; c6 r: W" Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, + X" }9 l8 ?( [
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */* `" x" a( V5 P" p1 J) C
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 R: Q* ~$ T7 g1 X( _6 G; }- XMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
2 r  Y2 A5 a* X/ h* t( M: B1 Iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */* d% }3 H+ A' ~8 e/ c" m) q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 T* a$ X7 {/ v' Q, X" |  V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& s2 m, v  B1 s, c$ ?}
/ {1 o& R2 U% B7 o
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

4 n8 ^1 W* }& k' D: p. T, P




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