嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
* y8 a; t- G7 {* @$ ^input mcasp_ahclkx,
& C9 m) e( L, e- Zinput mcasp_aclkx,
* F6 J/ F2 v' y" D" r. Vinput axr0,
9 N4 j/ e( i/ H
9 b/ t) R( N9 @: A( _% doutput mcasp_afsr,/ X: B g. y) h7 g5 O
output mcasp_ahclkr,- F( g M2 n# [9 p
output mcasp_aclkr,
, M" ^3 y" ?2 L7 W4 j6 routput axr1,) U7 y' p7 @8 H, P3 b. Y; W" j
assign mcasp_afsr = mcasp_afsx;
. D( v d/ \ U$ F: dassign mcasp_aclkr = mcasp_aclkx;
5 r+ }7 Z3 O, M$ d. jassign mcasp_ahclkr = mcasp_ahclkx;
. J$ b# N$ p% r X8 C; ?+ [9 aassign axr1 = axr0;
) V3 a. Q) J. w: l0 {6 P0 f
# H9 k5 p# V% s7 \% U6 [1 r
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' |+ F+ V+ y7 `' P
static void McASPI2SConfigure(void)' n8 u3 [) U, t% t6 c" H. v
{
% B6 ?8 N# Y' G) f" @0 lMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 u$ m( Y$ W/ U* A: `McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */ w7 ?( T/ \' J" H
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 e% Q" C' F5 q7 p5 p7 ^% oMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */: ?, W+ F0 Q! ~; L2 n7 r4 _
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
?, R* ^6 L$ C3 D$ p2 t2 EMCASP_RX_MODE_DMA);
/ Y3 c& c2 M! O/ x" w0 Q; I7 x* A/ PMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 ^' w( g4 D( D# s2 n1 w9 _- zMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; f; O& W Y' O" }. S) U' i
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " m) b, p/ G1 j ^$ a# n
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 |; {$ U/ Q- j
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 p) a- s t8 Y' L/ A* cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */0 p+ B8 i- M C, |1 d
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
. r( X, j' |% g) d1 NMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
O4 b; x. B/ P) v9 [ MMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 W" Z% V, P4 i# i
0x00, 0xFF);
/* configure the clock for transmitter */
+ w+ M. n) i3 u+ c) L, E% w; TMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ I$ d) M3 e% `- I. TMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 Q2 s) y4 K5 |0 n; F
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,8 k5 _) _8 @2 S
0x00, 0xFF);
a2 V3 s0 T- z6 n3 H3 d4 j. a. m
/* Enable synchronization of RX and TX sections */ & X& l1 D0 `- E, ?0 H& q/ z) u3 u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
6 ?+ m4 [, g6 x8 C9 sMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 J9 \( x# ~" N, s+ O) \1 VMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*) |( G4 b5 ]7 K" G2 A- b
** Set the serializers, Currently only one serializer is set as
U- S0 t4 e: N9 ~& f$ y! Y** transmitter and one serializer as receiver.( G+ O1 ?" Y( x3 B% k& E' h Y4 _
*/+ g' h4 b4 W7 y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
X) F, g1 r5 K. ^1 b1 z8 y3 bMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
1 L# E( `$ y) ~2 @** Configure the McASP pins
* f. t# e7 ]0 J5 ^' A0 y- D5 n** Input - Frame Sync, Clock and Serializer Rx
4 l- `6 O# E. G' n. Y** Output - Serializer Tx is connected to the input of the codec
; d8 S! `7 b7 J% V$ U& _9 m2 f*/& t- N4 v$ P, t7 g
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. l R2 s. u+ {2 c( f" V2 MMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& b0 P9 |, g8 X3 h+ g2 @% @- Y4 r2 bMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
a2 r5 t5 T( d/ a! {| MCASP_PIN_ACLKX
; l7 s7 v! z2 {3 E| MCASP_PIN_AHCLKX9 q/ p. N9 g3 A! f, O: D
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
4 z7 D. f D% MMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) h( Q6 ^; {3 d4 q7 F
| MCASP_TX_CLKFAIL - G8 s, k) v9 o, K- u% s1 g) L
| MCASP_TX_SYNCERROR
2 Z7 K# O8 \9 c, E7 D. H| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 8 D+ z5 Q4 U! `5 C. }
| MCASP_RX_CLKFAIL
$ g. G5 V( i6 t- V7 j| MCASP_RX_SYNCERROR
" L7 r# T3 F; r6 q4 G| MCASP_RX_OVERRUN);
# l# J9 S' z! r}
static void I2SDataTxRxActivate(void)! U7 E+ i* h4 ?. v& a1 y
{
, x& U5 G6 L; ?* G3 k/* Start the clocks */" x. A& X d2 W; o. k
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% J9 j4 `! Z! s# E a0 P
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
7 B( d) @$ B! ]$ Q* h! bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( h6 z9 C( n( E3 r
EDMA3_TRIG_MODE_EVENT);
1 c0 w6 C( ]: `; s, p: D9 Z$ X, tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, * H- H. E2 a$ n+ I1 E, ~/ V7 `8 F( x6 I
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
- c+ h3 l* \+ M8 k K" B) F' OMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);! w h5 j5 @8 l
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" q6 d' |+ u% P' `4 Kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
/ d( Z, d" l4 I+ H) X! sMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
% q4 p. Z* M2 s* AMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) z0 C' ~0 J3 F% Z2 H% M
}
+ A# K+ b/ q5 }2 N; `. {. G
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 l; @/ S1 e% N8 ~
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |