嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,+ U7 r$ ?' x& Z& K5 _' F R c
input mcasp_ahclkx,
! c* f: V2 G1 ?6 n4 ^* H7 T: ~) Jinput mcasp_aclkx,, b# b9 e8 E" C; \, ]. ]% i; K7 ], _: e
input axr0," d" b. F$ {- l$ d0 O5 i( ?
2 ]& z. b/ o) }! E$ y' n$ f7 x* }output mcasp_afsr," h5 E* A) i1 P ^, H0 L
output mcasp_ahclkr,
- K% u9 k% K3 r% eoutput mcasp_aclkr,
, s u' x' |, ^: s) J" boutput axr1,
y. I7 u* V: m: ]
assign mcasp_afsr = mcasp_afsx;4 o% W' e* U5 _# F' e0 ~/ J
assign mcasp_aclkr = mcasp_aclkx;% l' b8 Q& x+ i0 N; L. D
assign mcasp_ahclkr = mcasp_ahclkx;/ h% Q$ Q2 n) @& n: D
assign axr1 = axr0;
. s* u7 G5 z B" ~/ ]2 o5 L% Z
; P) S8 E3 G! D在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
# b- R2 p9 y- Y/ M* R
static void McASPI2SConfigure(void)
8 w0 _8 M/ j! x{
' V" A1 j! z$ nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 Z+ c+ D3 M0 F7 o/ M% QMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
/ @: [2 g% ^* X2 lMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( G J o5 z- h C" ~6 bMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
. `. C; B; i! ~: hMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ c0 P. ?! K# eMCASP_RX_MODE_DMA);* L: y M5 O5 a
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 _2 _& O( Z! n; c) zMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ d# n! p; ]9 w/ \& N4 J# u
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 c3 x; r: {6 c% R( g8 X# u4 HMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! m8 ^: V! f6 y. O7 `5 LMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / v% R9 s9 h; o( c% e* M: g* r. a
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
) g- g% Q# j0 F2 t2 iMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( |& i7 v/ j2 `6 J8 p
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; y/ J; p' z2 L: ] t$ ^2 Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 [' B( P% Y0 }* S$ u/ u; h0 ]0x00, 0xFF);
/* configure the clock for transmitter */
7 h0 X) f0 O% M/ U3 q7 r2 ]McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' l+ `; X! q) x- W( K
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 X0 E+ u* s9 y% ]1 v% _7 m
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, ^9 H, T4 \3 a
0x00, 0xFF);1 u( ?" e5 g; [ @4 m D) x3 ^
- V* }6 @; h& {! l" O, p, A/* Enable synchronization of RX and TX sections */ 8 b' X) ~2 Q5 n2 R Z S; F
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
- N) Y6 _0 B) J/ P2 c3 @$ f" eMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);# ]* v; W! H+ }" j2 B: \( R( |
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/** E( x; c# Y* p! ~, x g3 ~
** Set the serializers, Currently only one serializer is set as
; Z5 |. ^9 J0 z1 ^# C* @' V+ _** transmitter and one serializer as receiver.4 v. R5 o _/ b2 r0 j
*/5 R. L% C M+ I; A
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 @" T# T+ {- O) @
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
5 g& T( ~5 i8 Q** Configure the McASP pins - L0 t) w3 V! Y9 c* e1 f3 s
** Input - Frame Sync, Clock and Serializer Rx( @. X$ ~/ w, `
** Output - Serializer Tx is connected to the input of the codec 7 N2 t# T8 D# W. ~8 |0 Q" @
*/
! n, z" Z9 t0 j: r1 r# E" h8 aMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);! p8 G/ J2 d4 x0 \9 X g$ L& {! v
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
9 q$ x, u1 E- S9 C$ V; ]4 JMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; q$ F' y+ k" l" u& C& N \| MCASP_PIN_ACLKX- e) \" Y1 O e+ p
| MCASP_PIN_AHCLKX6 l; F$ K S/ Q! t; s9 K' Z% T2 I/ b
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */2 v9 p" B5 G2 l5 }! U: n3 ^- p
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR : N8 P7 c5 ]) D( N$ A4 Z. e
| MCASP_TX_CLKFAIL ) L& G p* @( f% B1 _
| MCASP_TX_SYNCERROR
1 S6 B' I6 Y5 G1 `) ^' Q| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
6 s4 I* w- y/ {- p* t| MCASP_RX_CLKFAIL; z% X* p: F) E1 I6 K/ [* z" Z
| MCASP_RX_SYNCERROR ! b, d! i. ~3 X$ H& J+ ~
| MCASP_RX_OVERRUN);- H: m( k% |% n6 n# e
}
static void I2SDataTxRxActivate(void)/ K* E, W7 n( f# V6 U
{
8 U7 o( @% U! U/* Start the clocks */
/ i$ ~. I" v5 MMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" r* c) b4 K' g' E" t3 t7 j
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */, e. @ p K" U9 G: ~' n
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 s5 |2 {% z0 Q% L. B/ t
EDMA3_TRIG_MODE_EVENT);/ l2 h3 o/ B( v. |6 E6 M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 x b; b( ^" m/ r; G9 c6 V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
T8 X) }. z& N* v8 jMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 _1 o! q2 c% n: d9 J) I+ y( x$ @
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */" e# j9 A: C6 ~ H
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
( m- q8 N \$ w; FMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 J$ }/ c) s8 s* o Y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, A0 \- H7 e3 k3 H, p5 z$ L5 K$ A}
! o0 c* d3 W, @% o请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. h: N% f' A* P% q4 \
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |