嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
2 ]$ Q/ i) d, ]1 F2 q7 yinput mcasp_ahclkx,: Y6 R0 S. c- \" \2 W% H
input mcasp_aclkx,
# \% T! o/ B! v4 t5 |/ \3 Einput axr0,
) a) q& S/ L9 H. m1 m2 \. u |" W: |
output mcasp_afsr,
. W' d$ \6 u2 qoutput mcasp_ahclkr,
$ ~5 Y6 C/ @6 Zoutput mcasp_aclkr,7 O# M& Z: J7 b( [# J. b: W+ s
output axr1,
" w% H$ y" t/ t+ U; c. i
assign mcasp_afsr = mcasp_afsx;7 k% m/ \& e. t3 v7 {! k
assign mcasp_aclkr = mcasp_aclkx;
$ P- S _/ q# gassign mcasp_ahclkr = mcasp_ahclkx;
' w0 a" z& W* k1 K. Z* w1 Yassign axr1 = axr0;
9 _9 \2 O9 G1 K5 P% D, f( `9 L0 ?! T( F) h) [7 q
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
* V7 A$ X3 R* q2 d2 ]* V- h, d1 k( Cstatic void McASPI2SConfigure(void)# p9 _7 e' e5 c
{
) q9 c& Z8 k# H% b* G" `, t; |: dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ |9 u% K' r$ v c- }4 }McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* }$ K. E3 ]8 n0 P, u4 `/ Q4 I' ZMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
" `1 ]- [8 X; I4 m+ A2 _0 }McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
6 J* t' \3 @* S/ HMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. h g! @/ Z/ ~( s4 z8 XMCASP_RX_MODE_DMA); _0 o6 _. b6 J5 p" c0 k, _
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& P- F) u9 B8 v# J e( D8 q
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ ], Z$ S) r7 O7 N @2 Y* Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 l+ p p- `2 C' l6 P2 FMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
c: h7 J0 D2 q' |, y( a" h- hMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
9 w# r5 R" m+ [/ q% EMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */0 u+ S* v% n# g' o6 s/ @
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);2 K; q" u5 v2 _. t& u l
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 y3 ]! L3 Z" i i( f( F0 t/ P" ^McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 L, j# A# i* s0x00, 0xFF);
/* configure the clock for transmitter */3 `; t2 S6 j9 s6 A2 {
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( E9 V, |$ y# F x( K" n2 KMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
8 Z) D, y" D& UMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 ?) r, D$ _/ U" ?7 w8 g
0x00, 0xFF);1 `: v# F& G# c3 ?2 ?* j6 ~- h+ h& h2 g
, q& h2 o0 u* K* q' \& u
/* Enable synchronization of RX and TX sections */ ' m. y0 \7 P$ c" y; E& Q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
) t6 [' V g2 K5 K( _McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ `3 T6 A" f) S3 E0 O
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*7 [& F2 x/ f" z/ T" s, U9 a
** Set the serializers, Currently only one serializer is set as0 ~7 A$ O' i8 I. x
** transmitter and one serializer as receiver.2 E) x% {; B8 O" B4 [
*/+ `2 b; X' b. y- }7 k3 {
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 p; A( Z. }6 H8 c7 V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
% n" G4 {/ v. k ]** Configure the McASP pins + N' I; N& J6 F" L. c( q6 f( z6 Z
** Input - Frame Sync, Clock and Serializer Rx; \/ |5 B3 q Y% _0 x5 D
** Output - Serializer Tx is connected to the input of the codec
; v/ }$ T; e% [ @# r( p*/' q0 o% P5 _$ p/ I! O
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 B% s' s1 J0 kMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
: Q1 B- {) i3 m0 {0 ]0 QMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ F$ p- A1 {) G" h
| MCASP_PIN_ACLKX* X, [! i7 m, |; q B
| MCASP_PIN_AHCLKX
0 s9 Z' H4 e6 O8 K/ E$ ^: G| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
# J5 U3 O2 |. Z) S" [McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 A9 u7 M: s9 G! n| MCASP_TX_CLKFAIL
& I" Y: H& _: L& f9 C( O| MCASP_TX_SYNCERROR8 A* b1 G/ l, j- A2 C& H% P9 C
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ E3 _1 w! a8 Y9 z r| MCASP_RX_CLKFAIL+ ]! a! a( j1 ?2 O
| MCASP_RX_SYNCERROR
3 }6 y$ V1 t6 p5 |# H| MCASP_RX_OVERRUN);
" C, X# T/ q$ B* n# H0 d}
static void I2SDataTxRxActivate(void)/ h$ `. V5 K s3 N; o
{
# y0 B" u* g; k7 x# r/* Start the clocks */% R6 h$ X/ }1 o( S z8 U
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 V7 F" v, t1 K } I4 T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */, y& R4 S8 n" B* ~! U* i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 v [' S0 _4 M! N1 [
EDMA3_TRIG_MODE_EVENT);
8 W1 G0 D8 ?3 u- P2 [, C! N7 XEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 W' F' E# ^; _5 L, c" gEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */7 p5 ~* P% O1 I8 P
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 A& P6 Z, A$ h! p' J
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
# W2 Z, e9 I/ \6 Y d" Y# c0 twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */4 q3 B8 S+ w5 b+ e2 D
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);1 i) ^+ Y/ L, r; p2 I2 i7 v
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);. z7 @- Q- G" T5 H5 S( a. j& j! Y
}
! m/ q% f/ d4 P请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( r" u! W" X. @, G8 X# d2 t
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |