嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
  Q- b! X: k$ K8 c) `/ k% l7 Xinput mcasp_ahclkx,
6 ?& |5 ?0 o2 V: b' \* }; oinput mcasp_aclkx,
* J' D  N  u: ?. m: N0 |+ Winput axr0,6 D% D" h0 a6 G

& V1 }% i; Y% I# K2 p% z( \output mcasp_afsr,# f; w$ o6 I) T
output mcasp_ahclkr,
7 `+ n% _3 D+ doutput mcasp_aclkr,
9 |. C4 U! f. B  r# _2 I+ Q5 S4 ioutput axr1,- r3 S. H* d; {9 {- a8 b: i8 E
assign mcasp_afsr = mcasp_afsx;: Q2 k1 r3 f# B: T
assign mcasp_aclkr = mcasp_aclkx;* ]. g: q! S1 a. a; r/ C
assign mcasp_ahclkr = mcasp_ahclkx;
5 s: A' `9 D/ l4 ?6 {assign axr1 = axr0;
) i* c4 ^4 m- M
& t" K: n0 N1 L2 ?4 b4 G; e) [8 S
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

( T" C1 f. i% p. k) ^
static void McASPI2SConfigure(void)
* |/ _% \: |# _7 c" A& J  a{0 C) X' a) L& O/ ?: v! w
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
: r' H8 ~# x4 q. j9 s  ~McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
: ?9 f; S( q6 o  q# B8 xMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ ~* d3 ]* R/ G
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
" @: t; q; m' Y$ d9 Z& W! sMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 f" v/ S: ^4 F- w4 s- IMCASP_RX_MODE_DMA);) _4 z( ~# w! R
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' ]2 y9 X0 [' w1 \1 q. ~MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ E0 w4 h, ~. x* AMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! V! J. V1 Z- J( t2 ^8 NMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: p3 W& y" i, n7 c  AMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
$ Z$ k( [0 h5 R7 h9 g/ }7 ?MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
  @# K' \+ F4 h% ^3 dMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 J; N9 w0 m0 ^5 X" {( ~
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' G! h1 u% r4 Y/ e' r
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& B6 I' m. @/ d( Z$ i0x00, 0xFF);
/* configure the clock for transmitter */
# v0 v2 v& O4 E6 k' H0 WMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 r; D, W: v+ P: a0 y1 E
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. z% Z0 P* W: t; bMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
/ K9 n1 [7 J- x. c9 i# F0x00, 0xFF);+ ?0 L) C6 [/ e1 v( a

/ b# k" Z0 t2 _/ ^/ k8 u/* Enable synchronization of RX and TX sections */
6 g$ b9 P! s4 U! AMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */( Y* D$ M# p* L4 J3 C/ R+ c* D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);3 W3 r! R! ~$ c& L5 p
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*2 o6 e4 E1 z0 q. F# O/ C1 @+ N
** Set the serializers, Currently only one serializer is set as
8 r4 g7 u& V$ b) n** transmitter and one serializer as receiver.3 A! u9 G. p! [6 T. }7 A9 H" M, U' T
*/
7 i8 m2 N4 P: `: a, X  ?McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 Y; N6 L2 q* V$ D' oMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
6 i& c& x, y" G1 R( W** Configure the McASP pins
2 v$ r6 Q  m8 v4 B# B: |! D** Input - Frame Sync, Clock and Serializer Rx3 \; @: l0 [2 K, v) f! T  e. U" O
** Output - Serializer Tx is connected to the input of the codec
# d; z, A! ?* e4 e5 F3 H*/' l; `3 E- O% t
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ u5 y) m8 Y7 `% U1 D
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; d* O; s+ F. _5 PMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 ]$ j* v1 ?, V: C
| MCASP_PIN_ACLKX4 Y; d& M, K6 O2 @# S; e
| MCASP_PIN_AHCLKX" R$ S6 B. u. Y0 I) F  Z
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */. n% d# @9 U) H6 _
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 D. A+ b$ H4 O' L$ c$ Y. _6 n4 ~| MCASP_TX_CLKFAIL
' w! m, H. [' O- ~! ]5 a8 ^- || MCASP_TX_SYNCERROR) l0 p9 N  u: j
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . o! c: x  g; Q- A, I
| MCASP_RX_CLKFAIL& J+ n) q: R! t) L. j
| MCASP_RX_SYNCERROR
9 B& e6 O& U- \( E8 R6 L| MCASP_RX_OVERRUN);
3 F, m2 R2 M* z}
static void I2SDataTxRxActivate(void)$ q# j; p# G: e
{7 o3 v9 _; v1 G; V7 h5 H
/* Start the clocks */# h7 h& G1 t1 Z$ A" [
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);& z3 ]  g" H. t  x8 C
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */" e6 S  x# W6 H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 g% }5 p$ I" xEDMA3_TRIG_MODE_EVENT);
4 T; s8 N, j  f( [% ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, ~* H+ ?2 a, ^EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */  l: T( U+ X6 ?" j
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* ]# B: [6 U' a; s4 sMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
! W7 B( t7 m, e1 _( A+ U3 a3 a. Kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */* a8 {, E4 o8 {: \
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! Q) K9 R( W! p* r! m% C
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. Y4 q' f1 [+ D" P
}

- g  I" [/ }$ C! w
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

6 h& \8 j* h6 W' W4 j




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