嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,) z$ e6 [3 a/ A
input mcasp_ahclkx,# |$ [! @9 R) K- j4 J+ o
input mcasp_aclkx,
1 M, I; p6 ]5 v' k# G0 o: n# v* ]  Xinput axr0,5 R% m7 T7 n5 |/ `0 u, @! |* }1 `

5 q. f& G. p8 Q0 H9 q6 _# P% s. e+ Toutput mcasp_afsr,
' g1 f* K2 _  b+ K$ |output mcasp_ahclkr,
; K' _3 M$ U0 I7 D% poutput mcasp_aclkr,: x1 s7 l" Z! H# h" G7 K: Q) A1 }6 J
output axr1,
) C5 F2 D# Z" ?
assign mcasp_afsr = mcasp_afsx;: X% e. i! l. X) J8 G+ i  x( M
assign mcasp_aclkr = mcasp_aclkx;
' e% A% v$ E* [0 j8 P* wassign mcasp_ahclkr = mcasp_ahclkx;$ |* \: N7 c1 H+ f+ n
assign axr1 = axr0;
7 U% v/ d$ W5 R; p9 p8 c$ Q

. F" c: e, p2 w$ E, I
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 s. }# Q; c+ i+ |
static void McASPI2SConfigure(void)5 Y* C& A  ?1 T) A9 L
{
4 _- V- P- x! ~McASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 C! Z3 I4 K2 E* ?7 yMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */, R0 O# M+ H5 w/ h0 s' F2 Y4 u
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
. m& z% p1 b& R# |0 \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
$ w! R: C1 @  }2 Q3 E& q. sMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 y3 W; i2 F/ a- U( GMCASP_RX_MODE_DMA);
, J. C3 v. \! o) JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" X* @& b( N- u$ W& a2 jMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 m  h- D$ J% A$ Y7 x
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * p, S2 e8 M) c  L/ c0 z& I
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 G$ x) P: j' h0 I5 F0 X8 V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . w( Q/ }- z; ]5 ]; F0 ?
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
; _. s/ m5 F! L% KMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( H8 i/ z0 o0 j" A
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); : d6 q. ]( M6 b7 r" ]7 e1 y
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 \, A; N. d. k) x0 P0x00, 0xFF);
/* configure the clock for transmitter */0 Y7 T& L2 R! T9 _" }0 w
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);5 R# d4 \1 g: T( ~
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; R  [" a2 ^; r* N6 x" z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
  C; \- ?5 I( C2 u0x00, 0xFF);
7 O5 u9 m/ T! W* D
/ @( d3 [  x0 {/* Enable synchronization of RX and TX sections */
4 _$ j' M) t- h# R( O! Q/ p# E3 RMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */  F, B6 a  y7 U) g
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 s3 I& f& p; ?" \5 Z4 xMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/** |- M$ ^( |) l" q
** Set the serializers, Currently only one serializer is set as
4 ?" \* z, [% J9 p, K. x9 _. @$ m0 V** transmitter and one serializer as receiver.
( g  O7 ~- T) E: Y  u8 \*/
  B7 f5 j8 w4 H; BMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! B8 L6 t& e0 sMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
! p) O0 V+ f% {  e4 c8 _** Configure the McASP pins
3 |; c  c# E0 Z% Z2 Y4 ]** Input - Frame Sync, Clock and Serializer Rx4 W" E3 [. N5 Z" n  Z
** Output - Serializer Tx is connected to the input of the codec
' z* i. G4 s, U0 H*/9 ]5 C; h' ?7 ]' K. B7 a! s
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);8 @# {6 \( V" T0 n2 S5 D9 u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ [0 }" P. C5 r0 H  j
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' J! O( s9 Y; q$ ~% ^2 h  o| MCASP_PIN_ACLKX  E# M! K& n7 @6 }# p3 o
| MCASP_PIN_AHCLKX
! R8 L: E3 Y4 M| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
& r' Q2 s- Z/ DMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) u1 P! _1 v# ]! M' E6 h| MCASP_TX_CLKFAIL
7 V; X* I" B% w! M7 u$ m" U| MCASP_TX_SYNCERROR
$ n$ X% j( ?$ N, Z: S$ ]| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 0 I- w. |0 S6 d% E
| MCASP_RX_CLKFAIL
" |3 X4 }4 e: c1 }; B( I1 L| MCASP_RX_SYNCERROR ' ]3 U/ C6 U8 [5 z. \0 W! v
| MCASP_RX_OVERRUN);+ E+ w* V, l4 z8 H
}
static void I2SDataTxRxActivate(void)8 P3 u& L+ ~. ^
{
  K7 `/ L' r5 B2 A2 a/* Start the clocks */
, o3 x- @( @& U" XMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
: N/ {: g) u7 {  J+ |McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
4 ?  F& r9 M- @2 d1 L3 ]( t" ~" ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 U$ Z9 Y+ W- h& E: mEDMA3_TRIG_MODE_EVENT);
1 D7 E" X& j5 F' W5 u2 xEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 ?+ N) Z( B, {/ t) {5 B5 m
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
+ Z$ y9 J5 J1 V  F+ iMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);/ H: a" j1 A! M; t
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
$ f/ w/ W+ K+ I8 a0 K3 M2 vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */( @6 G2 P3 B/ g
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);3 ~$ x2 S& |0 `5 `6 {+ Q
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! F0 r/ \3 B% X, O}

3 s) ], F$ S% B6 j" I( M
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! g0 F4 M6 |. x8 s8 U





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