嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& c) {" |" S, n/ N6 t8 ]3 J# @9 }input mcasp_ahclkx,5 X" y" d9 g9 J/ a [2 k. M- N
input mcasp_aclkx,+ }; @5 `( m i7 O
input axr0,
+ M% {" z# T1 j% y0 ]" }0 @
. w9 d% |; c; g$ ?; poutput mcasp_afsr,
4 v/ J" B5 |' }% Coutput mcasp_ahclkr,
$ h) }! A. p2 L5 v/ f% ]output mcasp_aclkr," o6 q, m$ S9 d
output axr1,6 _) C j$ I- G9 O: j5 B" H n
assign mcasp_afsr = mcasp_afsx;7 ~. y% e( T5 k1 |! S2 T2 b
assign mcasp_aclkr = mcasp_aclkx;
3 L( l [# \& _7 X7 p& }/ @assign mcasp_ahclkr = mcasp_ahclkx;
% W, t: B- c8 t& a, Eassign axr1 = axr0;
& c2 Q( E1 O ~
& u% `1 p h0 T9 P8 L: _- C
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! V+ Q. H* z& r' u. P
static void McASPI2SConfigure(void)
; k+ g C' g9 k8 Z. I/ D% O{; ?7 F. R* r* F1 J0 b9 \* z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);% }1 m# ^+ q( H
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
- p9 M# k! n2 n/ _6 ~1 x2 _McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 \% ^# W, r) \# ~& KMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */* V. U8 i- x- b9 e0 f4 q: O
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* E$ |& I( `: z/ Q' c3 Z# tMCASP_RX_MODE_DMA);- N3 X+ w6 A- _. ^
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! n$ k+ ~5 ~) y8 A+ ^) b
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
! i, T! g) w- F/ w4 i' U; T1 cMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! q- l8 B! [ p" m, w* }MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
1 P2 }* F* Y9 b/ W3 N3 TMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, b2 G) b7 m# z3 I/ M5 a
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
@8 z. z% C! P1 q: lMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 M* T2 q# j2 s4 `: ]$ ~McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) N5 J2 Q( i& z; e3 D
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ h! S! I) F0 I8 G: }; y8 _0x00, 0xFF);
/* configure the clock for transmitter */
# x5 P6 W; h2 N' i0 [; eMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 }* k2 {8 m. r
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( |3 ~, d7 K$ {( e! s" U# p0 c- eMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
k* C, H) ?! Z1 W6 N d0x00, 0xFF);# V# K& q g }
X& G6 J# Z' }% i x( r, ]/* Enable synchronization of RX and TX sections */ " x( ~+ e5 O r {1 r8 C
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ p% I ?. s: A7 ZMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* D, }8 H; _. w+ N: ]McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*" y4 j% j6 x. J# A* e8 ~
** Set the serializers, Currently only one serializer is set as R" h% _( R" x7 B+ z0 V' @
** transmitter and one serializer as receiver.
9 h; W) g! e7 d8 C! D*// r6 s$ a6 P, i# W7 C2 N3 ?
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 u- n$ t) c) M1 c% E- ^" @- ?( LMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
5 b8 m' N" ]( k* ~1 R) o** Configure the McASP pins
6 b$ I6 a3 b% S- z! p9 [** Input - Frame Sync, Clock and Serializer Rx
4 [) u5 x: a' `8 e. z** Output - Serializer Tx is connected to the input of the codec 0 @8 f9 v4 _) N. ~5 m" L q/ b
*/
" x* I& f( N; S) o) Z& R4 fMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);3 K- d4 t5 g! ]" y. w
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 C6 ~+ Q v. v. g* |
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ ?! [8 @, E/ t5 P| MCASP_PIN_ACLKX
6 w" H. E- E Z% s: M Y| MCASP_PIN_AHCLKX3 O3 C/ W( ~/ x7 W' `
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */2 X# e/ Z! P% L: J) t
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR % A u4 p" ~0 W/ Z8 p ?
| MCASP_TX_CLKFAIL & E g, ]2 A2 M3 u% v
| MCASP_TX_SYNCERROR$ w$ v( W/ C: c4 O* s5 q+ |4 m$ L' z
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! z- n% I* s6 O1 b% b3 S
| MCASP_RX_CLKFAIL
* J; v4 M6 y1 T, v0 c6 ^% {| MCASP_RX_SYNCERROR
, Z) o. [: B# b( t| MCASP_RX_OVERRUN);
1 I7 K" P6 ?" l/ e! _- s}
static void I2SDataTxRxActivate(void)6 ^% N3 E; U- p2 ?9 R' p) c
{
+ m) {+ [& Y+ W1 H2 S7 y/* Start the clocks */5 ?- X& t) O# x- w
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
~2 U: k+ ?0 ?+ Y1 S) I- R4 FMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
8 |4 h/ G6 m! k" S" {& ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: T" }) p9 [* T; }9 B6 k; O0 u
EDMA3_TRIG_MODE_EVENT);
5 L! |2 j( \* L* VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 ^- Y1 Z2 T/ ?: f& Y$ C
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) X+ B7 ~ v1 N1 N
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);: ^' J# S |/ `% M
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
: r; @/ V2 v. [( F' Qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
% o* k$ L+ b, x0 X1 M aMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);. w5 R1 ?- \" q4 P, m* W% \& u1 u1 ^) @
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* l+ w% X* z/ p* }4 {- y! N% R4 Z}
: {1 j8 ?8 E ~5 O请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# O* D8 d0 I7 {# o
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |