嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
9 ^, \ ~" p7 _7 U' J. u3 uinput mcasp_ahclkx,
& A* [( J" V/ m& Kinput mcasp_aclkx,2 ]6 [# w; k/ \4 D1 [( l& b3 V$ I3 I
input axr0,
2 s1 B7 C% v& h! c4 C% E$ d
; q% q) S* @& J/ joutput mcasp_afsr,: B9 `) J0 {" U" J- }. w: q
output mcasp_ahclkr,9 f+ f3 z* ~/ H% i* x
output mcasp_aclkr,
$ I S! [ R: c% Q1 Toutput axr1,! B0 N: c) P* a) f$ Z/ z( m
assign mcasp_afsr = mcasp_afsx;
8 x! z6 t4 z# v5 S+ sassign mcasp_aclkr = mcasp_aclkx;
( U; Y* k0 C- u' Vassign mcasp_ahclkr = mcasp_ahclkx;9 u& }# j3 x( u8 [5 S+ V; L/ X
assign axr1 = axr0;
5 d6 n5 @/ `7 k: a3 A/ P! e j( } w$ h* A0 P Y
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 y; N" P1 a+ H$ B" {
static void McASPI2SConfigure(void)
, O: o1 |" H: B/ F{9 F1 a3 p3 J& S$ I
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
& u: B. x3 p* u' m' G) SMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */ i) {7 H' M0 |
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 l5 q0 @# z) T, P/ W
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
, d/ n6 a! s4 C! h" ZMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- D L% `, U3 T7 @2 fMCASP_RX_MODE_DMA);5 D5 B5 O( _# ?$ g, U5 W9 E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 u0 Q, v! k! ~& ~* s, Q a$ i
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
g* S: d# |9 j6 n9 C1 rMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
?" O' Y2 ^! o4 L' {- T' e8 aMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, s& D8 l* r/ x$ y; M
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 D7 k Q. a m* M" }- wMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
* p1 K* ^+ E$ }% t* r; Q$ U0 HMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! z5 U& C+ f* r' K# H4 W/ _
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! P# _, R. X$ k& h3 RMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" [2 `3 J( o+ L0x00, 0xFF);
/* configure the clock for transmitter */
- W; K+ }( c& A' W, qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 {! B( r- B, F4 J. E' rMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ f3 v+ \ v+ a# IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 U# I$ M3 Z: G+ f$ K1 E: ?, F
0x00, 0xFF);
1 g+ P! H2 E% M7 q! G# e3 L- p u' y8 B" W" G
/* Enable synchronization of RX and TX sections */ " L9 U9 o' f3 O- ^: f; K
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ ?& M; n) _2 G1 U$ L; @McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); q" P0 h: r x1 M
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
M: ^9 Q/ b) N4 k6 m' l; x** Set the serializers, Currently only one serializer is set as
! f3 K" ~/ L$ ]: ^** transmitter and one serializer as receiver.4 K6 h4 m7 F4 X1 ?
*/0 _) H) ?% S/ o$ R$ _, b
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 R4 x/ @$ K3 {" c8 b aMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*7 ]; B" R; ?0 I
** Configure the McASP pins % A4 G4 B4 h: c+ G
** Input - Frame Sync, Clock and Serializer Rx3 p( a6 I; i8 @# i- f' r2 @* t
** Output - Serializer Tx is connected to the input of the codec
) F: \2 Z! q2 I0 b( f8 j3 N*/
) `0 g7 ^8 a" gMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: `& c/ @1 a" R* k
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# ]; X; u1 Q* b/ Z: L9 I! O
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX1 h' Z' i$ y4 m" z
| MCASP_PIN_ACLKX! K: b; u# y! C) y' c1 M0 J. Y
| MCASP_PIN_AHCLKX) e) z" J* H: v a6 c! \) Z; F
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */& w( m# v# K2 c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& H% Z; d1 @ g5 O, N- C| MCASP_TX_CLKFAIL
' A: Y: T3 |9 G2 [3 ^| MCASP_TX_SYNCERROR3 Q) B7 P9 p. ?* \/ ~' s0 {
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 9 t1 `) R3 ]2 |0 r* d- a7 ]& { L9 f
| MCASP_RX_CLKFAIL
- @* J& x( S; m k9 V| MCASP_RX_SYNCERROR
. x) E) G6 B8 b$ C8 x9 ~5 @5 N \| MCASP_RX_OVERRUN);
' D E8 L1 h- k! |; N8 I}
static void I2SDataTxRxActivate(void)2 H- Q( ]+ h" r; b
{1 z1 Q, X" t1 \& f8 G
/* Start the clocks */* Z$ i/ ^+ M+ `- K
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 i2 J2 ]$ h. }' _, `McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */" F' n% W; G: S; ]0 P: B
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,' @0 N- P6 |& e4 Q W
EDMA3_TRIG_MODE_EVENT);
# J. p) @% }0 S! k- o: |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( q* ?$ i: w" @% Z' X, S
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */0 N2 S8 w! Z1 B* c& t( k
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 |& i4 J6 z3 E+ Y- {McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */1 R& {1 K; Y6 }- q$ i
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
2 g9 X9 F) Q' _0 hMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
" j; j9 [+ A9 Z JMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 \" N9 ~) p4 b4 M* D' m$ y% ~
}
4 D- V/ j5 l" l0 {1 h% Z6 J# J0 B
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( z5 N2 |* l, K
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |