嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,1 A- W0 \5 V: \. D
input mcasp_ahclkx,$ ?7 C  o& b0 G2 I" O
input mcasp_aclkx,
  h* p" B  X7 i- ginput axr0,$ ]/ b, q  a; u
0 m2 @0 ~4 E% p$ v& N
output mcasp_afsr,9 t. N9 J) \" Z
output mcasp_ahclkr,
) \' e0 d& v2 Q" G6 C; f# qoutput mcasp_aclkr,  K: ?8 Y+ R- w- l
output axr1,  H( M" D- X/ Z! K2 e3 a, Z
assign mcasp_afsr = mcasp_afsx;! c! E9 ?- C0 q, g3 e9 o' p
assign mcasp_aclkr = mcasp_aclkx;8 m  A! @/ w% X
assign mcasp_ahclkr = mcasp_ahclkx;, f0 t, X$ ~, \
assign axr1 = axr0;

3 }5 `8 E/ p7 }8 e' P' S8 S
8 Q' X; @" Z& o+ ~3 x& L; ]: l
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
; @' F5 L$ W* ~6 i+ E. r+ Z
static void McASPI2SConfigure(void)
$ l$ p! p6 k: T; x- ~- L! H; e{2 }) j9 g+ |* t
McASPRxReset(SOC_MCASP_0_CTRL_REGS);8 m6 n- r# K. G% u- M& h
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */  @- {6 r$ z% h8 ?4 E
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 z6 C" B% R' M: ?" c& U
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */( b/ m7 A! S+ ^% S" M% Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 h9 ?# y$ w5 r1 F' i
MCASP_RX_MODE_DMA);: Z5 J8 n0 x. B2 Z' ], Q" J* N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; @5 X8 L! _& ~8 g4 J6 m) Y2 n+ LMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 i8 v) v7 o' R- C. E( r  sMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * {% P6 W* x7 `- @" X
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) K# S) }: c$ R0 ~0 V' a4 u
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" F  `0 B% V7 {1 j$ i$ T7 \1 m6 V" }MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
# }2 u# q4 f9 yMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! W# T4 [1 ?/ R0 V  b$ y
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
: U0 `) k" X% IMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# d7 r" {: L( Q& L. a0x00, 0xFF);
/* configure the clock for transmitter */
6 c) a) u  }6 z$ KMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);9 s- ]0 F8 H' n6 e: g' Y* r
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
0 A; z7 ]5 Q( F5 n9 q; `McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% x, X6 [' U- b
0x00, 0xFF);) ]) }% p: ?8 o0 S
. B. n+ a: I1 ^) b) T) ?2 x8 f5 e
/* Enable synchronization of RX and TX sections */
8 K4 X. \6 Y' h9 M5 j1 N( RMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 |& n* J5 D1 J* F1 Z
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);  ^! e" s3 X: n/ e/ N3 _
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*0 l5 y1 N% A. Z. z4 y4 s
** Set the serializers, Currently only one serializer is set as$ h( o% q. _7 [" J: V4 h
** transmitter and one serializer as receiver.3 P8 d5 S/ v1 a
*/
; E$ I* L3 @5 \) tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 i; t4 g+ D1 M& KMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
4 n. u. W$ q' _3 e& \) h. \4 [) F! Z; {** Configure the McASP pins 5 E+ F% k' Q2 ^
** Input - Frame Sync, Clock and Serializer Rx
/ h1 ^) j: U3 P3 `* x' O# @** Output - Serializer Tx is connected to the input of the codec
0 r$ o7 d4 g2 r2 c4 q; B' U*/9 l, j5 i* [" q4 _4 W: z
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; z( O5 W! F* e' m# O0 n
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& c, _4 `# p( b& ]( sMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 k7 r* X6 b' f2 R# Q, T6 h% a
| MCASP_PIN_ACLKX
4 E8 T/ a& L/ \% v9 }, ?9 ?+ y2 ?| MCASP_PIN_AHCLKX
% ~* Y) d3 I2 U6 T+ F4 e5 J| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
: J! {* K/ A3 v4 n; H% uMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
8 z# ?: S5 K) t8 ~, |; o| MCASP_TX_CLKFAIL
$ E* L/ p! G0 S+ M$ T9 s2 x| MCASP_TX_SYNCERROR
; x, E4 y- ^( e: g, T4 t8 p; @| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! `+ P2 y8 O; ?1 y
| MCASP_RX_CLKFAIL  L+ G% N% |3 D: H# }7 f
| MCASP_RX_SYNCERROR 1 f! y/ f" |9 R( N' m
| MCASP_RX_OVERRUN);  G. l- N, B* P; D; Y
}
static void I2SDataTxRxActivate(void)
) G$ d0 u1 c8 x$ ?* p{
( \  A7 _( \* \/ g+ H- c/* Start the clocks */1 y7 Y2 ]! E, u4 @
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);3 k5 j& }% _  d" g0 i8 t- T3 S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */, \2 x1 d: K% t$ q; K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
- X" t9 K6 ^8 p. `: ^4 ?+ kEDMA3_TRIG_MODE_EVENT);
6 }, g6 w- t$ G) d/ DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & h; u; W: }2 R. X' \# P' e
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
$ V0 N; B' p- S4 H% uMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);) p% J' r( ]/ c, [7 z8 m
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */6 `3 ~( K4 G2 S8 \) N. T
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
( Y3 N6 Q2 Z0 ^: r0 zMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% a1 @8 S2 h5 UMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
1 q  N2 A: T6 d, ]}

+ |* u  h. m3 x8 M( @+ Z: _
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" @* K( B0 A" j4 |% w3 a/ s3 ?





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