嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
4 i( s: X+ x* |2 n5 \$ k3 S! Zinput mcasp_ahclkx,
' O( L1 \% m! n3 B5 finput mcasp_aclkx,
7 v  M- P* u+ m4 V" A* e- ^input axr0,
- Z  ?/ }4 e- g: d9 F) y2 D
. R9 N+ R# I+ P8 routput mcasp_afsr,
2 i2 T/ ^/ _0 U+ ]; doutput mcasp_ahclkr,7 w- u% O- _8 o! d/ r  ^/ [6 o
output mcasp_aclkr,
! c7 }* s, d, h# S9 Eoutput axr1,
1 D4 `! v: j; o7 v, y
assign mcasp_afsr = mcasp_afsx;
+ U2 ~+ C7 Y" N0 Eassign mcasp_aclkr = mcasp_aclkx;6 @! X! I% R' T2 b7 }
assign mcasp_ahclkr = mcasp_ahclkx;
8 z( C2 y; w$ {* X3 Nassign axr1 = axr0;

/ E  N, f, ]; @) K$ W8 M. ~8 ?5 q2 w9 T; {7 ]6 D( G
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" J; \& L; ]* B  s, p: e
static void McASPI2SConfigure(void)
1 {% K) F2 R( U4 Q% a# Z; H{
+ V1 s  b4 X/ N* D) \McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) n6 H) D( x$ I& [' pMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
$ P& H  z) A" A& C+ U  T. D0 uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ Z) D4 o5 d$ K( t: ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
, E1 |  q" Y# _6 D5 jMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' ~" L: ?1 `& ~9 ?- D: `3 K1 P
MCASP_RX_MODE_DMA);; x, k& _5 C( F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 ^3 m# N& }/ D: X1 @1 \
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; E7 ?( z. ~7 ^) Q5 V) C$ d6 I+ vMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; z; X/ f# q1 Y) e1 L. V! ]. D
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* C6 @/ P# J# o9 J  b" O( f9 RMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" n$ x2 R: R* m8 D+ zMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
2 e3 c3 }! P. ?McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" g0 k% I, ]; z- W' l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& s: @7 E$ F) I0 q! rMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 G8 I0 n0 S- l' B$ E0x00, 0xFF);
/* configure the clock for transmitter */5 J( O& n- Q& T! F' d' v
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; \, G- l* Y/ P# zMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
4 ~7 r$ V, ~( C! iMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 N! E' L+ U$ E7 P) a5 Z4 ^
0x00, 0xFF);8 W8 `. O# x! v% f0 T3 S# K

% X  ~  R: B, C/ c; |% W/* Enable synchronization of RX and TX sections */
( I5 g0 v; M  J; M+ MMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */* P! f2 u9 L. B+ v; M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& v4 c0 u- I( z6 b; k3 @- l
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*0 U! s" W+ s8 v+ G. u) U
** Set the serializers, Currently only one serializer is set as
5 h) |+ m2 F7 I5 {1 c** transmitter and one serializer as receiver.
) z9 P; ]6 H8 i*/
% H4 j2 I* C- k" t1 zMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);5 R! `, N% R3 g5 a- X
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*7 L% H/ g( p) M# r- U1 z9 ?. V3 @
** Configure the McASP pins 6 r# r; R) x0 c, [
** Input - Frame Sync, Clock and Serializer Rx. R1 ~2 P! ~- c8 c9 K6 b
** Output - Serializer Tx is connected to the input of the codec , J' R" d5 a3 ?
*/
( j: e! i7 G/ V& r6 ]4 [McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 Q7 W0 p1 ~& {- q* n
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! x8 D+ `1 x- ^, X, @McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 H. L6 s* X0 z+ {5 n' R  r. L
| MCASP_PIN_ACLKX
- b( x, {: \  E; l- Y: e| MCASP_PIN_AHCLKX
5 i. s* g# \3 @- B4 ~| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
6 x* ?' L! D5 @/ A. e; cMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 ~$ o  y8 Y& l
| MCASP_TX_CLKFAIL
. ?4 u$ f% ?* X$ X# H( I& t+ Z| MCASP_TX_SYNCERROR
5 _( q) \9 C" V* Z  B6 r3 h& J| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " h5 e* x% j* s0 M4 K5 F
| MCASP_RX_CLKFAIL4 o: P0 \4 k" P6 i$ f  D
| MCASP_RX_SYNCERROR
2 C( z& U& T& D| MCASP_RX_OVERRUN);- l2 }1 W( R3 ?) J2 W
}
static void I2SDataTxRxActivate(void)2 z# ?& A- ]) g2 T
{4 ?$ C! o$ K! p, F
/* Start the clocks */- s! c% h7 p7 b' ]- Y1 L6 H
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);/ D0 U( E6 a! U3 Q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */4 f* p+ i) E# M: M5 G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ e6 {, o$ {, u, a1 K
EDMA3_TRIG_MODE_EVENT);' |+ z8 W0 A& \+ H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' L% `3 m. S" r$ ?1 u' `. F8 s4 z
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
: t% s2 ]+ W; m* N# TMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 q+ P! @( v3 l8 W/ e" a2 d) _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
$ f$ q# K" J  F% hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
1 W9 k) y$ E2 p# ^& VMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
  ?1 b- N- n* }McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
/ J: z9 m/ E. j: b}
$ r% `4 V7 T8 I9 y
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! r" Y5 Y, ]3 @0 q/ _





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