嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
+ `! y/ s1 @: u9 v1 j% b% ]- cinput mcasp_ahclkx,
2 }9 ~/ w. g. H9 M4 dinput mcasp_aclkx,
# O7 x9 q7 X# U/ [5 ]. t8 S( H5 Ginput axr0,* F/ B& W. u2 X
9 p- [2 d5 a* v, Q6 K0 t
output mcasp_afsr,& W. Y# T# f$ j$ O
output mcasp_ahclkr,
* U3 m% u* | X7 U5 X/ O% Joutput mcasp_aclkr,, B9 c: ?" X+ x( l7 H* g- \) G
output axr1,6 X4 W0 I+ X! a$ ~& r: R
assign mcasp_afsr = mcasp_afsx;
# A; k0 Z0 H9 H& ]; Oassign mcasp_aclkr = mcasp_aclkx;* L0 I# u& k# c' |/ p0 a
assign mcasp_ahclkr = mcasp_ahclkx;
+ k( m+ u! L. F2 x% |5 a( |assign axr1 = axr0;
& Q7 ^- b; g" f* H' K9 m% @
% ^7 R, z% i: n- S+ ~在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
- k) V9 a$ F5 V: h: Ystatic void McASPI2SConfigure(void)
, Z% J( {7 Z* H: |. g' w+ q- f5 L{
6 [7 u l6 d* ^8 I( rMcASPRxReset(SOC_MCASP_0_CTRL_REGS);2 K( n% Y; b0 Y0 l; A; W( A
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */- K9 q1 f3 J# T$ }1 b) r
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ p4 u' f7 [7 i1 ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */3 N0 j9 n' Q, R
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ h9 m) a1 X2 d9 v0 KMCASP_RX_MODE_DMA);. Q d! ~( Z, ?, s: S/ u
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- {% B' u. `" i% e5 M
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 A* s& A. d! t" o( ^
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " ]/ p$ i2 _% e$ }5 ~
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);3 e6 s& z7 j3 }8 I3 H+ J
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 C. i$ w/ n6 Q! `+ s& Y) k; {. A
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */% }$ \/ `' S2 D3 Z
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. ]* u& R- n' S. P4 y& }6 F
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); # i" ~6 P( l j8 [- E: ]# E" \
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 t0 p2 T' v+ i2 j! ~2 m0x00, 0xFF);
/* configure the clock for transmitter */
( |6 L, w& o# s2 @$ XMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; F/ e3 I [4 C" w L0 P
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 c) z* \+ K0 i2 rMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- l# _7 @# l, s& j0x00, 0xFF);* u# ^8 S9 P& ?) G8 X7 t
' m6 w9 T7 C6 m% {
/* Enable synchronization of RX and TX sections */ ' r1 j/ Z9 Y- |" W4 H
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */* k2 \( m2 E. P5 P6 c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 K d& W% f! {3 L" G# Q; yMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
0 t, q! w# W6 p** Set the serializers, Currently only one serializer is set as: Y: N/ u, r1 g* A
** transmitter and one serializer as receiver.7 M; |8 [; [6 i, V) V
*/* `. }0 y5 `: _ a2 g2 b* ?
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);: k; Q$ |0 J# Y+ H8 L; N# p
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
$ |! B" B0 \+ H6 |** Configure the McASP pins
. o$ s Y# Z% X** Input - Frame Sync, Clock and Serializer Rx
% b- t" Z: |. E# c** Output - Serializer Tx is connected to the input of the codec
x' O0 n. y# H7 T& I. B2 |*/4 ^" t6 Q/ E I M
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% p1 ?9 d% N! B: p3 b+ g8 ]McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 d% ?( m- w; h7 b7 Y' S$ j% D- z* M+ [McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX0 h: b; `5 j: W" X" O3 i5 W0 ?
| MCASP_PIN_ACLKX
- Z: e% @- _6 s4 J8 ]6 Q| MCASP_PIN_AHCLKX
9 _, w- {& A: j5 G0 E0 X* J% i| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
! h, g6 T: @1 @; fMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 w0 X" o6 V1 O8 o. z
| MCASP_TX_CLKFAIL 4 q" ?) @: K) Q/ ]
| MCASP_TX_SYNCERROR8 T. j( y+ x- |( U+ c5 ]
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 {. \9 O% A4 a4 [4 d! P6 M& I
| MCASP_RX_CLKFAIL$ X& a4 d" J3 j6 e% Q0 C
| MCASP_RX_SYNCERROR
, N7 R! T4 D0 a| MCASP_RX_OVERRUN);5 U* g1 X$ F: g
}
static void I2SDataTxRxActivate(void)- C: t1 W" y% j3 A% k: b8 J
{
% P/ W3 d5 `% b2 C* ]/* Start the clocks */ r9 d' o" W8 o+ @' Y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);6 X3 I6 B$ }& y6 u! [9 a
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */2 j& Q3 u8 U+ E0 g
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,* v# u1 g: d7 x& }% j
EDMA3_TRIG_MODE_EVENT);
+ T* m7 \; E$ [EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) X; J$ q+ U9 N
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */$ ^, f7 @4 E/ E7 D1 @( u8 e
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
0 R5 c- w7 i6 Z; V! MMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */9 \1 M2 \% D8 Y2 V, R$ ^8 G
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */! u2 G* C, M+ J2 H) f+ C
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);* ~- q0 ~' u! w& k
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, s% v$ z0 {9 a. e6 U& U
}
' \; u! ?) D' E; N6 b! }9 Y) W
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 M: t7 z- M, [1 Y v* ~: }
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |