嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
3 j9 p* I0 _) \6 h  ~$ Rinput mcasp_ahclkx,0 s3 t5 T: D' O" o0 W& r
input mcasp_aclkx,
* `  j+ o& Z4 @  V; D1 |9 h  Jinput axr0,
$ {  g' H* ~% @$ o3 S) k  c( y3 @4 `% r+ P8 m
output mcasp_afsr,
1 K, j3 O, U  Poutput mcasp_ahclkr,
" f% k+ T9 N1 |" X6 I+ woutput mcasp_aclkr,
8 @2 x9 o. k) _2 o3 X" F( boutput axr1,
* ^) O- p1 ]- j8 P5 O3 L6 E$ |, y  S
assign mcasp_afsr = mcasp_afsx;
% Y+ }* k% U0 e, s( j3 e* Sassign mcasp_aclkr = mcasp_aclkx;5 z  S# @1 M/ |/ O$ U2 I  C% U
assign mcasp_ahclkr = mcasp_ahclkx;/ K% G# l* G* k' a
assign axr1 = axr0;
) i0 q5 m7 @! E( z8 b
! h" Q. e7 e1 M7 V
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ W9 @% F2 x* A
static void McASPI2SConfigure(void)
5 P) L6 }1 m7 Y2 s+ w{
" s6 M8 G( n4 c* dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
+ V# N* b5 P6 x  Y& t2 V$ FMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// _) y! P- f6 [  ?2 T8 J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) D& q# h5 _7 B  e( E
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
$ ~; n3 T+ n6 h$ O: [, YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# z' x" Z( b: h8 I3 LMCASP_RX_MODE_DMA);  ?- e, Q; X2 h: G! c+ x
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 ~& h: e* g  U' Q9 zMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. v7 c( Q% J+ p& v4 jMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " E! d0 o1 [* U/ q9 p9 j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
. N  i& W" E$ P- }McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 Q$ G: W$ T+ h3 }( O* Y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
1 e0 i" Y# K+ n0 {# aMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& V$ Z+ E; W& ?0 J9 e( CMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 c9 n7 l$ K8 r2 xMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# g& Y) e6 {) D8 M( j0x00, 0xFF);
/* configure the clock for transmitter */) T/ u6 U4 u4 e) I! B# ^$ Q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 f6 s; H/ h8 K
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. p5 W' p2 |8 X9 b1 EMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
& F1 _/ C' ?0 X5 m4 m# C0x00, 0xFF);) f1 O, {8 v/ a5 X- y

4 l$ \+ c! e( `8 e% M8 N/* Enable synchronization of RX and TX sections */ % O& w  b" I* \  U* J5 `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 I7 @4 [" G8 d! p, i( d  MMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);% u+ z5 i, ?; K: V5 y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*  w9 n6 }( {/ N1 U
** Set the serializers, Currently only one serializer is set as$ C& {7 R, e: D, `' a5 Y8 c- I$ Y
** transmitter and one serializer as receiver.& V$ t6 v5 P6 r% |% E6 G
*/! g2 D& N7 g6 K* `5 b6 I8 }
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; U3 x* w. {2 z( B8 p
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
2 |" k, Y% f9 Z" F* L1 x) V** Configure the McASP pins
( I  S# m- K* R$ M9 a** Input - Frame Sync, Clock and Serializer Rx
, B1 h! z: f# h. T/ l** Output - Serializer Tx is connected to the input of the codec 4 B2 N* {  Q8 v* r6 H6 n
*/3 k& N4 }# H0 B' a, P
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# D0 J" l4 v  z* U9 @- ZMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ U( j# j' g, E; y# O8 v1 ~
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) L) J. ~  s$ a! i% l7 Q| MCASP_PIN_ACLKX
$ r$ |5 \  g. e0 v| MCASP_PIN_AHCLKX
( W/ j$ _& N6 H& b/ s0 m: a9 || MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
* l' }. h; J! P4 _' `McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 \. Z1 D' i4 a| MCASP_TX_CLKFAIL
% r+ a2 @& E2 h9 a) g- b| MCASP_TX_SYNCERROR, [3 g! g0 ]  A
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' H# K$ C  e+ ]8 E' G  ], W| MCASP_RX_CLKFAIL
! `# q' G2 d, n: g| MCASP_RX_SYNCERROR
1 U5 }  w  F( [- j. R( [| MCASP_RX_OVERRUN);6 D( z7 |1 K/ D! S9 X
}
static void I2SDataTxRxActivate(void)
5 |# I( w7 A/ c! t9 B; q4 U{0 ]4 N6 b* D! `; h* j
/* Start the clocks */6 q, j4 J9 \% o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
4 K1 x6 E0 g& U, N# s' Y0 j5 |4 YMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */9 G5 r9 u& X3 g: Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' d0 y& {5 w$ p
EDMA3_TRIG_MODE_EVENT);! {0 R% I& x7 O: ~
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) A6 Q$ k  |  s* @7 D; [: y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */! g5 ~$ T5 I' B
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
) |6 [+ g! ]5 _( a( q- U9 TMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */6 p( J( {  J/ R; y0 `5 u; ?$ z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */, X2 r  Z3 d) V6 Y- j5 h1 a& L# U
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. O$ z1 I5 k( j
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- k0 K5 o3 A: Q" f" h}

: _" f3 s  q" T- N" x
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 M* _/ y9 ]( @2 E- s





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