嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,! |/ L, v! g: v1 y! Q( O. @; A# P
input mcasp_ahclkx,
5 V* J( H- m  \input mcasp_aclkx,; U# \2 m( P/ Z% U/ N+ ]& s
input axr0,, c/ ~5 t1 M' z/ X" u, \: }
, e. K: V( ?1 ?! U- Z6 C) }8 |
output mcasp_afsr,( L& h9 a9 |+ g. X. r9 D
output mcasp_ahclkr,
7 L* t7 K1 f5 L7 ~  ^  Toutput mcasp_aclkr,
+ m. N4 ?. R' b4 h8 woutput axr1,
- U( V% Y: y( h8 k/ V7 f
assign mcasp_afsr = mcasp_afsx;7 x/ X9 p- E0 C' V0 t  A
assign mcasp_aclkr = mcasp_aclkx;' p* a4 B: q* W, t
assign mcasp_ahclkr = mcasp_ahclkx;  G+ ~( F" m; k& c# D) D) @! g, q! t
assign axr1 = axr0;
) w7 R* ~) A. a1 s% `4 m9 i

9 l% s$ ^4 h2 L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: w; A+ S' O" y
static void McASPI2SConfigure(void)9 J7 ~; k. X- _1 e: k% C/ d
{4 `- H, [. F2 N8 E: d  C7 s
McASPRxReset(SOC_MCASP_0_CTRL_REGS);5 N2 K: M: K7 O- R5 x1 ~2 Y& E
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
# D: v) O. F+ b' m" V7 G. V% kMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 O7 L9 k& P1 z+ t2 D* F- ~. W* ]! S
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 _, P1 T7 ^/ l' {
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, o! q, e- t6 mMCASP_RX_MODE_DMA);
0 u) c6 ^" E. }1 @- t: mMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# K6 D$ {* X5 D, ]3 k8 p
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
# p; Y2 @: y$ i- g" g0 |McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
0 o' J( Q4 L7 N1 n) s8 kMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" O* O* \3 v: ^$ m! t' u* n
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: W& y  K( w, J; D( O1 i' Z& i6 bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */) c9 P0 O: t  j3 |" i! z- C9 q
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);$ U- M! K1 }6 @& ~! }$ Z$ r9 D7 \
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 q0 M2 D0 q, r+ {( [McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* X' V$ r9 g* |/ u& k) |4 u$ Y. [
0x00, 0xFF);
/* configure the clock for transmitter */* ?3 l' k5 g8 n  y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ c2 f* G: U1 `) u- T( Y- _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
0 Z, G- C0 f. u) l7 ~McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,. D* v7 \* s- Z* Z
0x00, 0xFF);
0 d2 ~! L; v1 @  v% z4 O3 V& {9 R! ]- ^1 v
/* Enable synchronization of RX and TX sections */
& ]( L& v5 p6 U! }! fMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */" m7 @2 P- ]$ h8 ~
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
+ b2 b% U: m" Z% {3 }3 IMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
) L$ a8 k6 @: }) Q& u** Set the serializers, Currently only one serializer is set as  e" q" t9 @' T9 t. \( @
** transmitter and one serializer as receiver.. K; b3 s2 \% o6 P
*/& U3 L" h% w  \* R) o
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 L7 D- I, |7 ~/ q  QMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*6 o. G6 b' x" }% x5 Q
** Configure the McASP pins 6 m& I& B4 o8 @+ T
** Input - Frame Sync, Clock and Serializer Rx( J9 @6 H3 ~& R/ e$ X
** Output - Serializer Tx is connected to the input of the codec
5 R2 m% Q/ l1 F; ^2 P*/
* R% ?3 p& z6 J9 `1 X8 JMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);) V" E0 V5 u  H% Q; \3 R  E
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 Q* A5 W+ [0 Z3 F+ t4 X  e6 mMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX- o( ]- @3 B+ b( o, I7 Z2 g$ _& A
| MCASP_PIN_ACLKX' |: E5 f0 Q4 V# p0 A
| MCASP_PIN_AHCLKX
" }3 X+ A) k5 O9 y# H& U- @" @| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 Y! A2 X0 I7 B1 ^0 n$ e5 @McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 S9 s6 n; F* k3 I, B: M
| MCASP_TX_CLKFAIL * Q/ L' H' Q; k4 Y" T
| MCASP_TX_SYNCERROR
3 F1 c0 r, A- h  g2 Y" E| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" Y( r/ C, h5 m$ A  s| MCASP_RX_CLKFAIL
7 `( H3 ?& |& D$ R! Z3 [) |8 D| MCASP_RX_SYNCERROR * ]4 S3 ^- \# q$ Q# N' S4 K
| MCASP_RX_OVERRUN);# H* q! G+ r0 ~8 p6 |9 v. F
}
static void I2SDataTxRxActivate(void)9 M: w3 @5 O) h9 U! e# `9 O' E6 H
{
/ z/ ~1 @1 A0 e7 O4 Y! u0 C/* Start the clocks */6 Y3 l" h' C8 x: {  r8 B
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* c3 W: W7 p9 O/ z; b* x: F
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */) N7 o" p, A: ^' q' O  \& Y5 S: ?  N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 U: p0 ^) Y; L( x5 l
EDMA3_TRIG_MODE_EVENT);  E) B* y- ?" V6 a
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; {8 ?; L' T) |" Q0 q) y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) ?: R) M# V: x( C& d. w
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
" L: _/ y" ~% B9 e1 u" ^* ^% z6 t& }# IMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */; `" z# O/ _! l  |
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */% g2 ]4 E& T2 `+ e  Y, n! V5 j
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! ^' r) c+ i  I! y& O; s# RMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 Y" [7 n# Z' I/ r! X! d( X* ]* m
}
. h) C* s+ R9 s2 t. l, j
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

: U: {! w9 Z' p+ q( n: e




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