嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
9 r# U9 f$ y! P: Binput mcasp_ahclkx,
3 m1 Y3 g# I3 u) C2 X, c+ winput mcasp_aclkx,, O2 @; `" ]2 b5 ?) k
input axr0,
! w4 k; O1 |. i9 z& h, b. B. F$ E+ M2 M) y! j: t1 `7 I
output mcasp_afsr,% T: l3 R2 v. E
output mcasp_ahclkr,
+ N# U6 ~) d; t" foutput mcasp_aclkr,
" T2 n) {2 @- v z- b5 E4 G( Doutput axr1, m) ?; K) U) j
assign mcasp_afsr = mcasp_afsx;
5 l/ b, ?! `: v; k* A& jassign mcasp_aclkr = mcasp_aclkx;
( s1 v3 R1 C2 l& @, w' y, sassign mcasp_ahclkr = mcasp_ahclkx;
+ ~) P- w4 V, p- Iassign axr1 = axr0;
# T" |3 V2 t) R3 _( ?( ^0 E2 v+ Y. @
( k t6 E7 b0 P5 @/ ~
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
K5 Z$ c4 L; \8 F6 v1 B0 Y2 Kstatic void McASPI2SConfigure(void)
4 a, N$ y4 R0 ]4 d{. S( E" \0 h' d% X- H' Q$ E$ H
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
$ l1 `7 c+ |( ^McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */1 K# b0 A% \7 ~! ?1 J+ J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
8 K0 y3 ~7 C0 p7 V( C. ]6 pMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
6 y* _9 w5 O# F5 n. y+ H b) bMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 W2 o2 L& J& g/ r7 A
MCASP_RX_MODE_DMA);
+ l( x! l+ a3 K) n$ ZMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ q) A F6 e. E. e; P9 pMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */( T, I S) D; ^5 w' [
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) r' z8 D: [2 b7 [& lMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);; u% x9 \, S: P) j1 G x! x
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
% W4 y/ _8 V8 r3 q$ f& K: Z8 TMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */: J: U2 C8 G) o, p
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; E* ?: B+ ~. y5 g1 y# }3 lMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
7 h' M6 h4 t1 o% }McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 H( {3 e9 P: V& a' b4 h
0x00, 0xFF);
/* configure the clock for transmitter */* j5 ]2 R3 z/ j: b' f3 u& z$ }
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 R) o0 y& X5 C+ C( N1 W
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
! ]: i6 B) k8 o9 hMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, N* H3 C' m* H
0x00, 0xFF);/ i$ W1 `* N7 G% M, K4 R. W$ I
8 E! M5 ^4 j/ A3 |( G7 s, Z/* Enable synchronization of RX and TX sections */ * ~! P/ N8 x5 a) H( s
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */0 M/ {1 W0 B4 Y6 k% X
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, }& ~4 n& l6 H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
; f8 H. ]7 a- b% L8 I0 M1 u! ^** Set the serializers, Currently only one serializer is set as
. k `- d- o% U( y9 h' s** transmitter and one serializer as receiver.9 c/ [7 r8 T1 q x) L
*/3 z( Z7 o- d! h: d
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- U4 _- E) \7 I# H$ IMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
! }) z2 G- q( s. |* L1 w** Configure the McASP pins 2 E6 q [, W& C" p5 n% P
** Input - Frame Sync, Clock and Serializer Rx
- n- d% X& y9 B% @** Output - Serializer Tx is connected to the input of the codec
) w; S# X9 \6 y2 D, C4 a* J2 [*/
6 r9 \# ~1 [; I, _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);& @# E+ q: O( k# `5 y
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# T$ [6 N! Z- Q; w) l, u* H
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( h2 L7 N, r4 |6 O# o' d5 F| MCASP_PIN_ACLKX
$ X1 l) B C% `1 e4 }' E" f5 k4 ?| MCASP_PIN_AHCLKX
: x% D0 c M$ i' V| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
2 `! f* k1 o9 O. ^& zMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: l) S; \' P- m$ @6 k9 Z* A3 ^& P| MCASP_TX_CLKFAIL
2 X% T4 T+ f. f| MCASP_TX_SYNCERROR
1 I/ G/ t. J* ~, y% n| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * C# o" {; g- @+ Y' F: `
| MCASP_RX_CLKFAIL
" h3 S( h5 W2 L1 X| MCASP_RX_SYNCERROR % A* [2 T8 K: l. O
| MCASP_RX_OVERRUN);5 e `" @& J8 S5 `
}
static void I2SDataTxRxActivate(void)9 n1 k r9 P' ^
{$ k5 D0 b# F1 u: u' W' B
/* Start the clocks */+ ~ N7 w+ @! G: f% S* \
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 t3 Q0 v# ^' |& ]3 tMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
3 W: H) B+ R' [0 y/ P, uEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% ]' K! X( L( R3 d. Z
EDMA3_TRIG_MODE_EVENT); O {; B" {% v2 u: l
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 G4 V0 x2 m5 f: a; o+ ~' Z0 tEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */6 a5 \; o5 g* c1 ?
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% }3 D8 w% F4 d$ Q7 K2 v0 j/ h8 X. cMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, }6 Z; J2 J7 I: T$ E' y* J: qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */5 G" l! p1 v$ c) ]* b; z @& z+ r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);: r0 t* d$ s/ ?; J' F* Y: |* X
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 _4 W0 I. k6 ?) ~! X
}
9 O& b: T3 O% U
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ C' T. d6 Y9 k- Y0 X. r" o( D1 O8 e
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |