嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
" E( C/ N' x" c, s8 p+ Yinput mcasp_ahclkx,
: Z- h" I" r: U1 a" `3 Jinput mcasp_aclkx,
, i. j! z0 f; P) J: b) x1 @4 `' @input axr0,! Z( [" r5 S2 P& g
- |6 ?- P7 l" Y' ?4 Boutput mcasp_afsr,
6 m6 B/ H1 w, d, p7 Qoutput mcasp_ahclkr,
* b3 Q* s5 W, W4 u0 Eoutput mcasp_aclkr,
* `5 ]( q. H4 uoutput axr1,
4 {+ d) A- x; m# e: T; g. @
assign mcasp_afsr = mcasp_afsx;
% a, T9 s6 L6 T% t8 h% Y1 a# Aassign mcasp_aclkr = mcasp_aclkx;( W* F( B- T+ S9 ^+ p- Z9 q3 g' ^
assign mcasp_ahclkr = mcasp_ahclkx;
9 N/ |3 o I5 ^. A6 M/ Fassign axr1 = axr0;
9 ]2 R$ z+ o( U" i1 s y1 R9 x) x9 h& K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
" w) V/ s, U% ostatic void McASPI2SConfigure(void)
' w" v9 X; M+ e+ U{' Z/ J/ b3 `9 ^8 F. A
McASPRxReset(SOC_MCASP_0_CTRL_REGS);9 u/ W: c$ Y: U9 b# \0 }& x, C
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
& A$ a: n! Q& e3 f* o6 I! SMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- @4 i$ a" t7 \. f1 y/ ^4 FMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
9 }3 h% A4 b$ t+ \McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: l: l7 v- o3 L3 UMCASP_RX_MODE_DMA);# D6 x9 ~7 W$ n% D' b3 y6 m6 X
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 ^7 D( M3 L) ?' v3 i' V' BMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
) m2 { A% G. r: m3 `3 fMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
" r( i5 a8 Z& z0 Z" mMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% \5 z/ T6 z+ U7 Z7 k/ X& fMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ G8 Y( d. S/ c5 n2 VMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
; ^5 @$ O1 e7 Z* B0 ^2 jMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 [9 l( u, g4 V0 |) b( d1 t- ` z+ l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % D& i9 s0 A( m) [1 c% }: J1 e
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ k7 l& X+ y8 M6 u. @+ m" D2 ?% I
0x00, 0xFF);
/* configure the clock for transmitter */
" N7 C9 Z& X$ L$ P# oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 k5 ]0 Q! N# @3 M7 N dMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % A' A2 e, N$ W/ G
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 l8 {$ U, o9 X! h
0x00, 0xFF);
3 g; V! f5 `7 N: }& z3 \1 ?& \# ?3 l6 R- i
/* Enable synchronization of RX and TX sections */
) }1 u4 f' M& l* _& ]; PMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */( g" i8 Q! x1 M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( U& ]# |( ?; V% s( e$ ]McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( z# |0 H2 D7 H
** Set the serializers, Currently only one serializer is set as; S* A. k' K2 h5 m( v7 c5 G0 i2 I
** transmitter and one serializer as receiver.
7 A e+ v# {+ h: o7 z( }( y& Z7 R }*/+ N9 z* ^9 {# y( J
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! q, B! ~2 ?* v7 L1 @4 { c9 G, |McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*9 P2 K) v8 _- R: S! C" {& B* M
** Configure the McASP pins 0 ?8 ]: u/ H* Z" A+ b( h s& V$ }7 f
** Input - Frame Sync, Clock and Serializer Rx0 x+ |* [3 F6 l7 m1 Y8 B* B% s
** Output - Serializer Tx is connected to the input of the codec
* N) j: v6 }! q0 [% c( R1 c" |*/
- C& e3 l, ] j* Q7 b: n( m% ?McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);5 [; H% S# a H% p1 G
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, G3 v7 B9 [" y' |1 t: M+ J
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
# j- h6 H! f B| MCASP_PIN_ACLKX
+ ^$ l) Y9 h9 m* x| MCASP_PIN_AHCLKX# B9 Z9 T* }% ?
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
& j8 C' u1 W# m& U4 z. K$ R0 kMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
M8 O) C- W6 [: v$ D| MCASP_TX_CLKFAIL 1 K& Q' p' a; H7 l P: g& ^; u/ v( X
| MCASP_TX_SYNCERROR% _4 y6 f3 Y) O+ z
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: p! F# A$ m: J# l {6 w( u| MCASP_RX_CLKFAIL
. a1 o. n$ w9 q9 c) z| MCASP_RX_SYNCERROR
% S ~5 f/ \' Z9 o+ o| MCASP_RX_OVERRUN);$ C Y: H! `6 q2 H& [4 k. j
}
static void I2SDataTxRxActivate(void)
/ D2 q1 o/ f' x; O3 I7 U6 D{8 _+ a' O8 p: G1 [0 [
/* Start the clocks */- d( g$ t1 ?. ^- A* ^2 {7 v! P& }( @
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);& K# W0 E( b4 |3 u
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
9 N9 ^) U2 S4 o7 ?; N+ N9 O# wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! d {7 c# O& u& m3 v
EDMA3_TRIG_MODE_EVENT);& ]% ~ H! r9 a1 j# r6 V/ d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 H% q0 S: p7 ^: ]7 a$ t" q2 XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
2 v- k9 k: s7 R' m9 r/ y+ R; BMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);; I) Q! d! ^7 [0 a$ j
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
( W1 _6 ?1 E( a- P4 D$ ~while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */) g) Y0 l' E; Z- m9 P7 o$ G
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
' _/ @4 z5 c! {; s9 z1 v2 FMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);4 l% C! d y8 K' Q4 \- R# D4 m: a H
}
0 k4 I7 a& ~2 e" |# M5 v9 z% d. T
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# O/ h- M: k$ g* k
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |