嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
9 v3 z9 a2 o0 F0 y& {8 Pinput mcasp_ahclkx,
3 n8 O. I" F3 a) r0 Q. ], Vinput mcasp_aclkx,. @8 U* { g) V; C1 W- s- B
input axr0,! E- F z) e" r: {/ V
% b( s* e: c+ Soutput mcasp_afsr,
# Z0 m7 U2 X8 ]" \( e3 s/ o5 ooutput mcasp_ahclkr,
) P2 H+ j1 Z, G1 Foutput mcasp_aclkr,
& O+ ]1 y4 C2 l# w" f* C0 X, _) voutput axr1,
4 t/ u4 M3 o% } ]) R6 v4 ]
assign mcasp_afsr = mcasp_afsx;
5 u. D: c9 d$ p- Q, H/ _assign mcasp_aclkr = mcasp_aclkx;/ f0 z W N8 F* r* e( j4 \
assign mcasp_ahclkr = mcasp_ahclkx;
, D8 m5 i$ G' U3 O0 fassign axr1 = axr0;
$ l% l2 M8 N& Q. E) I) ^
/ J5 Z+ [6 F/ I* D/ C9 K5 m在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! l# n! M% [+ ^+ c
static void McASPI2SConfigure(void)0 e2 J& E* A' i9 H# ?
{
/ X" ~6 _1 [" S+ i4 G. `McASPRxReset(SOC_MCASP_0_CTRL_REGS);1 J# [" r3 Y. a% v& m a
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */; x( p" n5 I0 z/ g/ {( I+ D5 y+ L
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);9 N# Y/ G" K6 I1 a# J
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */2 p5 Y5 v5 A( w* Z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 \. C* J3 o5 _3 E; {- GMCASP_RX_MODE_DMA);' U9 ^4 a5 B* W) q) n
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ [/ s) z: t# M# u% Y
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 _/ r* I2 ] l. ~9 e; P
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% j9 S- q6 N$ G8 l. MMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: n7 m$ Y. X& |5 C V. {: L6 Q8 FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ; z" M4 ~" d6 Y9 s& f6 C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
" k1 F2 K; ~. b$ G# oMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; E( Q# K/ [) g8 U3 t+ f: tMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; a. ], H' w& ?4 ^
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. o4 O1 t/ q/ Z8 u, \& c9 D0x00, 0xFF);
/* configure the clock for transmitter */& X+ \; Q* J: q; O5 O
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* a3 j+ C9 E, |$ [5 b
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- e( u- _6 N" n( D" WMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) ]/ u8 l9 a/ y# _' n. Q/ o
0x00, 0xFF);
" M$ B2 T `6 H4 e0 F7 e4 l/ i7 Q- \9 J# B
/* Enable synchronization of RX and TX sections */
: @6 N2 l. b J8 g% o$ M. [McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */6 I4 v' r( o! x3 J/ M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
x# D: C6 S" B% k* B, JMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
1 G7 }! o* g# ^8 g/ ~7 t9 ]** Set the serializers, Currently only one serializer is set as
6 K. D- i- u( l8 ?/ v, x0 ^** transmitter and one serializer as receiver.# U( q1 U" x5 ^
*/
' w9 u# M/ |! {; _/ O7 u! _McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' q0 s, g) f& \& ]$ lMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
: [1 F. C* @; U3 U' g** Configure the McASP pins # \# J4 _6 H5 R1 B! i5 b4 E' N
** Input - Frame Sync, Clock and Serializer Rx% T) P* D( A6 d! M
** Output - Serializer Tx is connected to the input of the codec
8 b& u. U+ E: ~+ R9 Z: O2 ]*/
. i4 Z* J7 j5 k# Y# oMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
F* a/ p3 H @- U9 I* ?McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& h K! Z% p" o3 W- [ DMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; V; v4 Z' b; b+ G" W( T
| MCASP_PIN_ACLKX
( b2 R) y& ]1 _| MCASP_PIN_AHCLKX
" @5 k; u% A% `5 E5 t| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
1 i2 M7 t; ~& a$ G$ B9 SMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " a: x3 N+ V7 n" m2 O' v! H
| MCASP_TX_CLKFAIL
: l. o5 \: V& ?5 R& ?' F| MCASP_TX_SYNCERROR, y% Z* X! f' M& n0 o, M# w+ Z) s
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ Y" v6 \' P6 ^( y! m7 [3 q/ ]
| MCASP_RX_CLKFAIL
3 B. [7 p, u" X3 U- ]4 W) @: Y7 X" N| MCASP_RX_SYNCERROR
: ^, p( t* j; |: a+ K- j| MCASP_RX_OVERRUN);
5 G3 y/ K2 u3 q# @7 J5 w/ u( [}
static void I2SDataTxRxActivate(void). e! Y. t0 e) f& J# A+ g' Q
{3 a- _$ u, i, x: J7 a- A
/* Start the clocks */5 m C7 g/ O1 y- f& I
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ ~) g+ A( j' y; p5 W
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
, w8 ~: e; [% ?( ~' X/ P( x# TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 x7 C& z; E1 m% g+ W/ {0 h% X
EDMA3_TRIG_MODE_EVENT);- I( I9 W7 T3 \2 O/ A
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
2 ]' O0 \# V2 u- ?9 D/ k9 X: H+ PEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */- G: B2 g3 X7 ~% C
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);, M5 C5 X& Z; X! o( |" S* v
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */! \, b' ~, z( z; g( u
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */% d/ _$ ^) b* v
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 Q7 Q% |6 _# x! A8 hMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);- Z6 Q: d: ^& q C9 ^
}
X! I, v2 g; a9 A请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 m8 P4 a' I- h+ i+ M- s3 ?5 a( ^
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |