嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx," j n$ |3 G% M$ E! z
input mcasp_ahclkx,: P5 y1 c% g7 _+ j- ~8 \, I- l
input mcasp_aclkx,
S$ i3 f" S. n1 I; f9 tinput axr0,
4 [. u$ i, ?5 l/ v/ {3 U* D) v( f* m/ O! C5 N! P8 Q! i4 u6 S
output mcasp_afsr,
! P# W$ ^6 ?, Q5 Ooutput mcasp_ahclkr,
4 ?( D8 Z- {2 j, b S, U. Goutput mcasp_aclkr,
$ K& Q( Z2 H2 @* Q& [# @. V7 S9 Boutput axr1,
' U$ o% ?' _0 X3 `
assign mcasp_afsr = mcasp_afsx;
7 t' A; n8 U* p: Tassign mcasp_aclkr = mcasp_aclkx;
( p/ L) M/ b) m. W2 }assign mcasp_ahclkr = mcasp_ahclkx;
: u6 Z$ S! |, ?& @. b5 Uassign axr1 = axr0;
4 y" V2 N9 F/ j; e& p# V
: a) P+ \! Z7 e8 b" E9 b在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
( p$ Q$ n9 d$ B( p9 k* cstatic void McASPI2SConfigure(void)0 `4 X$ C. v5 z# G# `% f$ C
{
9 L/ I# x3 V8 |( y' |+ i4 lMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 _, p" y9 R/ _' Y( P/ s/ O! Z- WMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// J% d; S- M' [8 {0 S
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; H) x$ a) Y, C$ P _McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
7 U# t( ?( n' B, p( sMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 r# J0 B) N; k" Q4 a
MCASP_RX_MODE_DMA);2 s" C. U" |# G/ m
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,& M K0 L# l) p' w+ D3 z
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */0 ^5 l1 F1 _4 [; o) v! K/ M5 ^
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, E* @2 M; W% t( Y
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ z9 @# d- |( k2 [
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, , y; V0 }# U6 i5 P" n5 k/ R
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */6 C5 X; {% G: W7 o, K6 h
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- C3 D1 r, l" {8 U- R0 S1 gMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, T: Q# g3 b. \McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 K7 ^9 j( Z! j/ f# B$ L5 G. g0x00, 0xFF);
/* configure the clock for transmitter */* I1 M7 A' M9 q$ s
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ A/ V5 [) ~, n8 ^6 ^4 BMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 x6 \7 q' K% `1 V5 KMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,! O- s% q, P2 l$ u8 U' f6 @
0x00, 0xFF);
2 h; R' }+ H* i& y. Y* T$ q2 g( ?+ K; [3 h) P/ m7 A
/* Enable synchronization of RX and TX sections */ & u% f$ \ b# I6 _8 W
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ t$ L* T& S% A8 DMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 J: K, w+ P' t( D9 v4 I7 k4 X% O
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*. |2 K0 x) |! Z( w
** Set the serializers, Currently only one serializer is set as5 q+ y- J, D1 I5 E: Y- R
** transmitter and one serializer as receiver." n6 a* K0 y: {7 t
*/- @; r8 B+ N8 c' x8 C% S. a+ R
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
b7 f w# J9 wMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
$ E( `( |% C: T \0 x, ~* |2 t** Configure the McASP pins * I, b: ?, l" e; f' a- { K% X% H
** Input - Frame Sync, Clock and Serializer Rx
- K& W! G0 }; Z$ K8 v7 e** Output - Serializer Tx is connected to the input of the codec % ~3 ^. C% o& A, l( C, j1 q
*/
8 k+ Q4 e, o, g1 |5 p* WMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);, K* h' m$ X' a
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) m' g* g! O* F/ W8 c7 G
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 m6 P& C6 d# r' y$ f/ Y
| MCASP_PIN_ACLKX. @6 D1 M/ a* n
| MCASP_PIN_AHCLKX
) L" B, y6 `/ K! o) N) C4 f| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */: E8 @, S7 h& I6 B- F
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ w `+ G, H9 U0 C" G| MCASP_TX_CLKFAIL ( ^; B$ v4 S5 J+ b
| MCASP_TX_SYNCERROR0 m6 t& j% J: N. T% P; A
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
# G% a( h$ l0 f| MCASP_RX_CLKFAIL: `: o. t1 @' V+ j* {* F* Y
| MCASP_RX_SYNCERROR & _' n8 m* o7 F) f
| MCASP_RX_OVERRUN);7 {) U6 a- L- A
}
static void I2SDataTxRxActivate(void)+ A/ k/ L! ~& A- R
{
3 N9 f; Z) Y: R- a, r; n& c. B/* Start the clocks */& ]& g3 w4 w! [9 W4 c
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* u2 D' }/ J" h
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
, ^* g" i" q5 W E: k6 N2 u2 \7 @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% d, b5 e/ \4 L9 C3 MEDMA3_TRIG_MODE_EVENT);
1 P- P" e) P3 j6 ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
7 ]3 ^" F p5 W" E8 |* TEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */6 u% M! _* Q% `, G1 ~9 H1 _5 [* N
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 f( E% d& J! e" p% ?
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
- F8 R# G, n% o. c2 ?while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
& @* r, J* P0 u& i& ]4 x$ w- N6 c: fMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 |& n( Q0 N7 I$ ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, d) y9 ]# m2 R. v}
8 L4 z/ `1 `4 N: r% y! ]1 U% u
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) ~' w' ^) O& D: w% e" c2 b
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |