嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
A& l' J) V9 r, ?; \, Cinput mcasp_ahclkx,
; J6 r. K) _& m6 G! W7 I! h6 iinput mcasp_aclkx,% x& V4 v+ g5 `* ^0 k# u
input axr0,: U( F3 Y/ J, t) R
! {1 }0 Q/ N, h& D: g) Y
output mcasp_afsr,! R& {& I: s0 I
output mcasp_ahclkr,
2 `9 H9 ^- v% X2 b0 t' r9 u# toutput mcasp_aclkr, i5 L9 D+ m4 \% |8 u" Z
output axr1,, W! \. m0 V' m2 J# f
assign mcasp_afsr = mcasp_afsx;
2 \4 T' ], G# v8 ?1 P/ rassign mcasp_aclkr = mcasp_aclkx;, G; B5 U, u4 Y8 \& F
assign mcasp_ahclkr = mcasp_ahclkx;
" v+ O+ F0 @$ q# t1 @assign axr1 = axr0;
' ?( w8 Q/ W1 R% d2 v% i
( c4 c! T; C6 ~" A" H2 O& m8 T
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
; _$ O8 k1 P0 E( y9 Y/ j( d
static void McASPI2SConfigure(void)
2 Z+ o- a+ n# h3 F; f{
/ G% k1 V' h$ J+ E8 i. l# dMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
) @; {' l1 \. E0 T) L, lMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
8 R4 w4 ]& A8 T. @% t; ~1 n; v$ dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& W9 I1 G$ [) [! s6 d- u
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
D0 V- S3 Y9 {# `' W4 [/ ]; j: x' m n4 hMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: p- `5 `1 y: w: V% |! C% l( d# F
MCASP_RX_MODE_DMA);
* @, P _6 S" t. h* A$ {" dMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," v1 ?6 v& |7 {7 M1 g
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 { F4 S2 U" [9 v+ g; c* F7 oMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, F& X* c9 p3 x6 R- c
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: F0 a% `7 _1 q; A/ Q, lMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
9 R) F J; s0 W- S* y, W {MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
6 e+ P) B# M: TMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
% L; `% |# H! `5 BMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
9 O5 ^4 {# H- N) [3 l0 |McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32," F7 _! D: E$ p$ P' q; {% N. I; }
0x00, 0xFF);
/* configure the clock for transmitter */" O. [ i1 F6 k; o# w
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; u% l$ e, J/ J8 b: D, S+ u; wMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 @# k" s; G" J+ {% S2 { B9 R* ^. w
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, E3 r2 C) N7 v# I! |+ t0x00, 0xFF);% ?: l1 \6 @2 D" c
2 q! v9 U, N% D, h x _6 L6 T/* Enable synchronization of RX and TX sections */
# d, M* t/ x& b' TMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
( k5 f8 a+ K. ~8 n' rMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' Z, Q' \4 v% K# x( e) R4 O
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*0 n3 M* Z+ _5 Q1 i
** Set the serializers, Currently only one serializer is set as! }5 Y1 F& A. A: E" D x6 W) j
** transmitter and one serializer as receiver.1 B' d, o, a0 C5 n0 ]7 W, b
*/
1 q1 H3 y( Z# B; i6 k# B2 a: tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( S9 w* v/ U" m: q, b
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
/ a; ]: ?- {( T6 \$ n** Configure the McASP pins 7 W; |. g: ]' X
** Input - Frame Sync, Clock and Serializer Rx
0 \* r) w; Y( P" o8 S, G** Output - Serializer Tx is connected to the input of the codec
9 h# a3 |4 U, X# g*/! ]3 D8 V& {3 C. T1 t; A6 x* U
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
2 `) K( p4 C w& BMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));/ Y: y$ \( L+ ?0 K2 M3 A' I
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, }. E: G% H4 a$ N
| MCASP_PIN_ACLKX$ i% \ h& }/ h1 d8 M: [
| MCASP_PIN_AHCLKX
+ h" ~% U7 a l* [# H| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */# B9 S6 S) v B
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" K. e. Q7 I- U p| MCASP_TX_CLKFAIL - V1 V* c8 i0 R9 K5 W
| MCASP_TX_SYNCERROR
( [& W; E& D" k8 c) Z, d$ M| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . L; |0 U s) z
| MCASP_RX_CLKFAIL2 J. \" M4 ~& ]& }1 J
| MCASP_RX_SYNCERROR
/ \1 T8 [( C# k, J2 Z" ?: u+ y- H d| MCASP_RX_OVERRUN);
6 H( F2 [$ W2 o+ p}
static void I2SDataTxRxActivate(void)# M" v: q9 u8 t
{ K4 z k( t Q5 [
/* Start the clocks */) A0 [ g* k2 C( E8 l
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);: o' f% K3 O. m+ E# J9 m- T& e6 S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
( J0 [2 }+ J VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 t+ w }9 W% P2 d8 P, {EDMA3_TRIG_MODE_EVENT);
: t% B3 W. S6 S1 Y PEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) y# Q0 k4 b- Z2 V REDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
1 F" Q: c* O: p, S VMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 ?) s6 E2 x: x: N; I
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */" X8 r& C1 s" F' M% d
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */) \. W! ]' A+ G
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
6 \( w- o' ]4 x% ]* dMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 H1 y6 V# ]( i2 e4 d
}
+ b1 K% I4 N5 F* G5 F3 w4 J
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
: p. X* h4 C \+ T/ n8 Z# e
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |