嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,: R' B$ V7 C) l
input mcasp_ahclkx,
% K6 Y# U, e' j" U% \6 {input mcasp_aclkx,. h8 t( N2 N7 V8 {; h" v2 z, w
input axr0,% |6 w1 `& _7 w/ g8 [6 k
/ D% Z" V4 F$ V6 ]' x5 N: b
output mcasp_afsr,$ g" k) A3 a# ]1 q. y
output mcasp_ahclkr,
# M `9 X$ C9 z1 \7 k q* K Zoutput mcasp_aclkr,
% R( x4 L9 s2 t8 noutput axr1,
8 \6 o& ?/ W0 D0 \
assign mcasp_afsr = mcasp_afsx;
! J0 e0 g1 @% F3 V# g: r, c0 Dassign mcasp_aclkr = mcasp_aclkx;
, E, ^$ l: `3 W. e" c0 @assign mcasp_ahclkr = mcasp_ahclkx;6 k& j8 }& G: z# B
assign axr1 = axr0;
& B) ?& m9 ~0 m
: I3 g' @: B3 x$ |
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) A" t+ E- ]# [, w0 ]static void McASPI2SConfigure(void)
5 E- n& M4 a+ T( F2 \4 l2 ]" a{/ |0 m% d6 M! l5 n3 @3 x1 d
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
! ~* e8 Q$ \8 s6 u: p. }" PMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */" C) K% W* c, C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ |! |: I' {% `. k
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
8 n$ d* r4 x" r1 W7 x: Q5 HMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" I H! a! W4 n7 BMCASP_RX_MODE_DMA);# H% G0 {4 B9 r1 k# I) S0 N$ I
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* s5 ?* A- a( C/ G# v1 U
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 Q; F6 y0 A& m* DMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, V, A, a" M) P: YMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);# i* O) P7 A) S4 M1 T: F+ T; S
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 4 w! U* g! O4 P2 Y" _
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */' ]9 e$ _' c) ^% C$ A, U3 B; a: i( L
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) m. |: z9 L" h# |7 B
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % l8 c1 a7 r3 i4 g: g- Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
- k5 `& H/ s- X* a5 C0x00, 0xFF);
/* configure the clock for transmitter */. T) Z" ^ k% Q9 [
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 Q- r& y+ y- y* J1 H" L5 eMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 b( Z1 i7 x8 S+ k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! h" M# M& ^1 e g% `0x00, 0xFF);
8 q% `) f. Y% ?3 z" T8 H
5 V' l$ J4 C+ J6 w7 I& i. d) B/* Enable synchronization of RX and TX sections */ 9 H a! T5 t2 D `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */5 s$ {4 p. P% P% [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; X; S. g7 l+ m6 L; i: i
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
. }; _0 C+ T) r1 w. \5 A! i** Set the serializers, Currently only one serializer is set as6 C1 ?. m5 A5 ^- }
** transmitter and one serializer as receiver.
9 _! g2 l8 q0 @2 L- g# t i*/) i% e* M+ G/ {: N* x: X7 U
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);$ O" b1 b% L* ^8 K4 c [' \% Z9 f( {
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*6 D9 n8 O9 v+ Q* \
** Configure the McASP pins
8 C" ^. C! \7 J2 v. K** Input - Frame Sync, Clock and Serializer Rx
+ ^. f; h: X" P# g7 ^$ C! s6 v** Output - Serializer Tx is connected to the input of the codec * T! d: ?( {2 R, p8 {0 A. Y
*/: \1 l# q) l* Y; A2 B' L) F8 O
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);# i: L5 d; z/ j3 K4 U) Z& v( _
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. N' o, m2 L8 l7 \( h$ j) vMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 B" m& _' j6 E, x2 z
| MCASP_PIN_ACLKX
2 H! w1 w/ d; S5 [1 j4 V& N| MCASP_PIN_AHCLKX
, U( s* W+ @7 m) O" G1 O# _; l| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
. X$ W7 b; p/ p# BMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. M: a- d7 J w| MCASP_TX_CLKFAIL 0 P) W& q' l/ G k+ b( F% _+ ]
| MCASP_TX_SYNCERROR
d6 f& e/ S5 F. u) S( m* M| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
% I2 d: g$ S( Q| MCASP_RX_CLKFAIL+ ^' m, b& A; Q7 m1 b2 f
| MCASP_RX_SYNCERROR
# U: R5 g* b! E5 s| MCASP_RX_OVERRUN);4 x" d. r; d$ x. _5 m5 A5 w3 o
}
static void I2SDataTxRxActivate(void)
3 F2 ^! v" P0 x0 D; |0 B- @{3 `: l3 N. I3 W7 S. _$ Q' r
/* Start the clocks */0 X* t1 A8 @& R$ U: X9 L. q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 }7 Q8 S$ }5 a. Z; Z* T: N# MMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
/ b7 F7 O/ A |3 a1 I/ z5 o" k' A8 g, TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,3 u( Y; c5 U8 _# e
EDMA3_TRIG_MODE_EVENT);
0 n0 t# C$ o6 U+ c1 bEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, q2 v7 B8 r0 p9 w+ M% o" z( |EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
# Z9 Q! T; Z, t3 c# j5 | Z9 JMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 L& o+ f2 k# y
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
1 G7 y1 J+ e7 J/ |; Vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
6 }+ w, M. `, G# Q4 aMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);- e, c5 y+ O) l L2 [2 y# ^
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, {% }2 B# L0 B' J- p5 \0 O* H
}
% e$ j$ Z1 T. W& @4 v9 i7 @
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" }7 Y' l/ m8 h7 O0 K
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |