嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
$ c! h6 ]7 K5 I7 c |! \) ginput mcasp_ahclkx,% d q! ~6 l$ }0 F2 u2 |8 U$ g
input mcasp_aclkx,& w w% X* Q6 |% F. F
input axr0,7 v l1 H8 ~) }& ^8 {2 {
8 O1 y m' q. }, x* h2 d c) L c0 Boutput mcasp_afsr,
) s1 h3 r+ |3 C9 `' @ ioutput mcasp_ahclkr,: q) `9 o: b$ Q; s7 \; W6 [2 q1 p
output mcasp_aclkr,9 N' H7 }* h9 C/ j, R% E" S) j
output axr1,
9 m& F' h2 }7 M$ q+ _: N
assign mcasp_afsr = mcasp_afsx;# J) {3 @$ x$ N) p
assign mcasp_aclkr = mcasp_aclkx;7 z- e: f1 @& S( }7 {
assign mcasp_ahclkr = mcasp_ahclkx;8 J. ^2 n6 o9 u# c- P
assign axr1 = axr0;
+ z/ p6 U4 }% q4 g& K$ K, s: e: s, i+ t4 V7 _+ \( B% M9 T3 K7 Q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ g% o$ I6 S5 c5 B& b8 i$ J* z
static void McASPI2SConfigure(void)0 M+ s* Z3 l) S2 _
{
0 s2 g6 ?3 ^( nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
" I$ x) ?$ |) g" `1 l" G( S6 oMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
1 U% e3 m( k9 b! {, A& aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 r1 {/ n& B3 m, `5 C) F" k9 K N: i7 u* BMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
) j) E" V( ?3 ]7 k- MMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ L. T) K3 p& Y+ RMCASP_RX_MODE_DMA); |/ y9 z) q* x! o. F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# l& T4 l3 |! e- @MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */) ]( J! S9 M; A/ o. W. F+ l! u0 Z
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, l {# |) Q S( ?* p
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 @. v# c6 E7 A. o
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
; |5 ]& |. d0 e1 n: {- d, G1 AMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */ k- f* s' Y$ d
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);, g7 J1 l, p+ x; C
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' @9 J& t! Y" `- B: }: @+ M/ t
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' b7 r# y( ~5 s; m6 \' A( _7 W# h" l, z0x00, 0xFF);
/* configure the clock for transmitter */
3 f1 N, F! F8 _( @0 vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) R) J! s- q; l1 A+ P( k8 v
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
: |4 o1 _# B# ?0 \McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 t, E7 |# X, v. |8 Z0x00, 0xFF);
' q/ ]# t |& i: N: K6 J
5 B* a5 h2 U5 r' q% Z: j: p/* Enable synchronization of RX and TX sections */ 9 ~; ~( F% I0 ]3 k, [+ b1 Z
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */. u+ x. q6 T8 x$ y1 {3 o
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
8 |8 J/ `: `- F3 |+ CMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
6 ?9 H. O+ \7 T% g% P% z** Set the serializers, Currently only one serializer is set as+ m, |* F9 f9 K( b. k( H
** transmitter and one serializer as receiver.
1 J7 M o: C& ~% y. d: g*/9 T2 \' [3 {& ~ `( p0 Y) E* T
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. ?: j) Z% N, c' j4 u0 [McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
7 l0 ]7 I: f8 b** Configure the McASP pins ; j2 Z9 I" T) [! m% @0 g
** Input - Frame Sync, Clock and Serializer Rx
1 |$ G, Z! j, [** Output - Serializer Tx is connected to the input of the codec
1 [ T( }8 {2 \*/" R* Y2 G6 r& {6 y2 ~( b1 e
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 A) w; Z; O( C7 \& E y" o! L9 l5 ?3 }McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 X: N, L( i- l" J2 O4 X
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 \2 A Z, t. z8 g( X1 l& [
| MCASP_PIN_ACLKX" n4 E" o. o: s( F, D( |
| MCASP_PIN_AHCLKX
" o3 e3 w: C; R0 }| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */2 j2 ~% ?, C+ s+ D0 X5 S) l
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + b2 Y( c. p G
| MCASP_TX_CLKFAIL
* S- \: M5 m4 i0 z1 V0 o| MCASP_TX_SYNCERROR
! t; o. {1 C# K7 p1 p5 o2 g. k& b| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% _) x4 x0 z, H8 M7 G# b| MCASP_RX_CLKFAIL
" t# |9 p0 A* D& z% H5 X3 ]% p| MCASP_RX_SYNCERROR ( e$ T8 j7 i$ r: O( b
| MCASP_RX_OVERRUN);% m5 g9 G4 g: G- D- ^3 p5 J
}
static void I2SDataTxRxActivate(void)# Z) y1 R8 T1 U, \# o( w: l% j6 M
{
6 g4 p: g3 T7 \2 V. i/* Start the clocks */
3 L1 D4 i/ l0 I% V5 G1 n$ ?$ B/ g# IMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 a0 b- ^0 a4 Q9 ]" e/ F3 KMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
( |2 U8 R9 ^) r2 e. [0 ~: \3 P* ^ jEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 {8 R, h. l( f1 E* S! g5 _! m
EDMA3_TRIG_MODE_EVENT);
4 T; h2 a5 V, E- YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
( U0 B3 J* m5 r; m4 ^EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
2 U' J. q+ O" A3 V: gMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: V1 j5 b1 M' z& L2 O$ g' e$ @9 B; i, [McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */) G* b; s: ~* m2 p% h5 F
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */. K+ Y: `& o1 X6 N
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);# B* ?3 m B! U3 o; |' O1 J
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);! A, M- _9 B3 G. L, X$ B" \+ T
}
4 d0 y. [! i% ?. q请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" g, {: ~0 @! W: V, _3 y2 z
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |