嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
8 Q) |, M7 C' L1 l2 hinput mcasp_ahclkx,) K" V+ w+ b1 E1 ~6 u
input mcasp_aclkx,1 h/ R: J0 d) o- g
input axr0,
: H! y: K7 x, w6 i5 {
. A0 @% Y6 G$ ^6 e6 J$ b8 ?, g( |output mcasp_afsr,8 L) D% E8 X% J' T4 d; |
output mcasp_ahclkr,
L. c. \+ r7 Aoutput mcasp_aclkr," e1 q6 Z/ x* `( H3 x* n! H
output axr1,
! C3 H6 _. u6 L: G. ?9 ]6 I
assign mcasp_afsr = mcasp_afsx;
1 |6 b L4 X& rassign mcasp_aclkr = mcasp_aclkx;
, k' A7 \6 X8 F7 E: q0 a, _! l5 }assign mcasp_ahclkr = mcasp_ahclkx;
" m$ O2 W; t" C! x. p# Uassign axr1 = axr0;
, |, o8 r2 Q1 z3 i7 b5 r& d/ O
! z& ]5 E2 G O+ Q( ^在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
9 O e7 P' l" ^! U1 D4 zstatic void McASPI2SConfigure(void)
3 n- e( r5 e( ]# r& ~0 ?5 x; g{$ {* l* _5 I- R
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 F" c5 k8 B( {& ?McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
; J3 j( a; ?# k' e! D5 ZMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
+ d Y' s2 {! o9 g( dMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */0 F0 X+ x2 j& S. P! m& F9 r
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
F% B X& r4 K* p2 y) \: _8 u3 hMCASP_RX_MODE_DMA);
. ^$ p+ X4 z. G. LMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. }& c5 T8 D+ |' @! O0 `4 U1 F2 @
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 v" y' k4 O& b+ C: p: d eMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ [) s+ L# O. X* n x% m x) fMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) k; |$ C5 H* t5 Q; v# Y5 O+ r9 ^McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / S( l7 x3 ~9 `: `, ]- }: `) C
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
" m$ Z+ v; J( a/ YMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% l6 k( m h9 X9 f
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
+ r' d& R4 _; y4 g ?3 YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,4 |) v7 s" d7 T" ?$ h
0x00, 0xFF);
/* configure the clock for transmitter */! l+ `: s6 n) |
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
/ U- j6 }* F; ~( X1 eMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 @" \6 `; j0 |7 [3 ] p9 n
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 C' j- N) M* s" A" T5 q, G8 H$ n
0x00, 0xFF);
3 C+ W/ s" Y0 d9 ~
$ v0 [% s6 c$ C( I6 {0 R, n8 U/* Enable synchronization of RX and TX sections */ % v: w( a4 K6 u
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
' @% U: r, l' W0 H! c! WMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& ]6 Q4 a$ f) I( K UMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
; r+ P" B n/ `( e& s** Set the serializers, Currently only one serializer is set as0 m8 r: g# L! f
** transmitter and one serializer as receiver.1 |" x. ]& c, ^
*/. j4 z! b; W# G% _
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& K, k" ]# Z9 AMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/* b) T+ b2 K; C1 C4 c6 `1 i
** Configure the McASP pins $ N/ v+ Q# k6 o0 o8 ]5 u# O
** Input - Frame Sync, Clock and Serializer Rx7 `$ h0 ?( p+ x1 M9 L- |. X
** Output - Serializer Tx is connected to the input of the codec
& f+ ~, J# K# P$ {# n4 X8 B*/3 e7 _6 s0 ` V, x4 ?
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ P' @" I1 ^# p' {/ Z0 ?7 t( I I3 IMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 F1 X5 W6 u6 l1 ^4 d0 N1 S" L" R( Q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 P0 H t9 _0 Q
| MCASP_PIN_ACLKX
5 e* ~* I& I% c; B2 G| MCASP_PIN_AHCLKX1 \5 ?- s& _8 ]3 [
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
; C* D3 k& x- o" L' }McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 E! D( C9 M& Y. d1 n- F
| MCASP_TX_CLKFAIL $ X5 r, G; B+ n8 [
| MCASP_TX_SYNCERROR
( Y; j6 z) r; X3 N/ R' L| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ L0 M4 D2 @* k Q% V0 _( e+ Y
| MCASP_RX_CLKFAIL7 U( D: J. e1 |, A
| MCASP_RX_SYNCERROR 7 i# p4 X0 ^4 q, B8 J: E! n
| MCASP_RX_OVERRUN);
! O g3 r- ]8 _6 R# {}
static void I2SDataTxRxActivate(void)6 U' T( F2 ^' C+ |6 g
{
! S, I, d( w: y% l& Z5 A/* Start the clocks */7 x2 B. B9 B- b; z9 T+ y: A
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 p e3 y8 J: H* i
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */! j/ U7 ]! h" ~ W0 d! K% {4 A. p' ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 s! t- c6 x% j# h5 n4 uEDMA3_TRIG_MODE_EVENT);; Z: l D" Q8 c% ^2 i/ a
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 1 S7 `9 h, _5 W* v; o; G
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */5 @1 Z/ H$ u9 q* j$ G' M- T4 g
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; p7 a, M4 m ]+ I. Y9 D, DMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */% i* E4 \. M0 e* k8 \% V
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */ h; |1 _. N8 R1 v7 i6 f# \1 a$ P
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);- L- |( i% @6 h6 `
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; ^" ^' m$ `# Z' R( Y. [8 o
}
2 i# X% s E' I" R
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# [- G0 l" m4 q# }
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |