嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
- a, i+ \- o# xinput mcasp_ahclkx,
_$ ]7 D$ Y; `4 L" @% h* |input mcasp_aclkx,
/ c% s% F+ u$ t& w# ^8 Binput axr0,
7 `/ x& @2 x( M! j+ l3 S* N" w
; j* u5 L8 Q, soutput mcasp_afsr,5 H& L7 K, ^, i6 P2 t8 H' d
output mcasp_ahclkr,
5 ^0 C) e. E% k; foutput mcasp_aclkr, c0 S S, ^& h9 @, C( ]& I
output axr1," v& B& L) M4 W3 `4 E
assign mcasp_afsr = mcasp_afsx;
- x" s' v: [+ N5 ?assign mcasp_aclkr = mcasp_aclkx;/ K m1 }' |! |# d
assign mcasp_ahclkr = mcasp_ahclkx;
m) v; w3 {' g0 iassign axr1 = axr0;
2 D, s, b' x3 E3 S4 K. n& K) a- J
`; s: ~7 N e* b9 ?2 V在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
1 j( n( C- @. b Tstatic void McASPI2SConfigure(void)2 t) x0 I( _- C& t3 F% I
{1 Q; v. S( l6 D, n: o; B) Y% s
McASPRxReset(SOC_MCASP_0_CTRL_REGS);0 |7 o( S$ F3 c6 K$ ^
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// j! d! S: P' g+ [$ [
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, V* `' [6 @! S d3 A. x
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
/ p$ W2 I4 H6 _2 B0 y$ R/ s nMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 T* p4 B' \4 C/ }1 D Z1 Q1 N. j
MCASP_RX_MODE_DMA);
; @; h9 b# v4 ?( t( g8 V$ ?McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, E. |$ H; P0 s- L* MMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 Y2 R T( V* W$ A3 h3 V4 y+ MMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + W) P+ g( X- F1 d' t$ b
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* Y( m- H. f$ u! n: c2 W9 eMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
J7 G2 x$ ]: b2 y: ^( M+ kMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */6 c) X4 H3 t8 E# _9 v
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
! {$ k1 \, k5 B! @McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( i* z6 h" C3 D6 c9 MMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. h# ~# U1 Q, b# x7 u0x00, 0xFF);
/* configure the clock for transmitter */
F( r) g- ~' w% e% KMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; h4 d' }+ g, R; O. ^. y
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- M& V k- D; u& k! `4 ~McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# u3 e, K! R$ i) D0x00, 0xFF);8 v6 N( M2 J( `( ^$ K; |. }/ j
4 n' T( `( b) F7 V. T( ^8 h' R/* Enable synchronization of RX and TX sections */ " @6 N. a1 @6 |9 N2 O. n4 {4 i
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */8 D; ]) [! _& E
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 O" h B* a1 K6 A! o4 m T7 U5 NMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/** H# M$ X N/ L2 L
** Set the serializers, Currently only one serializer is set as
# B9 w# h! c% v** transmitter and one serializer as receiver.
* ^1 |( z; V! H% d; p! v, y*/
& ]* o2 i, n( E$ VMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 q$ o; h" X% i5 `/ H& L0 f3 W6 O
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
7 t' N" A5 ^4 t9 P# _8 [** Configure the McASP pins 7 m6 D8 y( f6 G1 y2 G/ k: j; {
** Input - Frame Sync, Clock and Serializer Rx6 v! N9 {( R) f+ D! W# k
** Output - Serializer Tx is connected to the input of the codec
2 _- b4 s3 u) q3 h' V7 a% j*/
1 D N9 H' I* U3 r. M; G" AMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);3 V# K) @9 o0 C2 I* H; v5 a( L
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));1 Y# s1 ^1 T; A, ^6 H; f9 Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX" { `+ w( B1 r0 b
| MCASP_PIN_ACLKX
. b( S& k3 ` l7 \8 k1 E| MCASP_PIN_AHCLKX; j9 n4 X+ @ [
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */; I5 K9 o0 ]) r* O: F P$ L
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 5 D( J; c( p7 `. ?9 Y5 h0 C
| MCASP_TX_CLKFAIL 1 Q% \1 o% b: y
| MCASP_TX_SYNCERROR. |3 w7 x+ b! n$ }
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 B! z1 m1 i1 o K1 `% Y+ D! O
| MCASP_RX_CLKFAIL4 {2 A9 f1 u/ B! A# c/ n2 h
| MCASP_RX_SYNCERROR $ k9 B. U7 k# X& }% s' M
| MCASP_RX_OVERRUN);5 a# \# q; O2 }
}
static void I2SDataTxRxActivate(void)
6 e/ a; ^& W- t* z6 C" S9 n! E0 O{4 ]. r/ y2 `& A& C
/* Start the clocks */
( a" T- u8 w* B1 SMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
+ n# w6 r8 [& lMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
" }' o: V6 k, `8 E3 J# VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 q3 \) [2 C- f# o5 ^, ]9 Y( Q
EDMA3_TRIG_MODE_EVENT);9 c4 q- L. e- m& f, f h% E
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
/ @( r% Q$ s& I+ X; `8 p! ?EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
) ^2 T6 e# }' mMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* y. u* K: l t/ @
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
- v: X' G* U+ twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */( B4 l: c Y, J( c
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);* V2 J1 I/ M6 [2 j- g; z
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) t& M- _' h# X9 p9 l/ `* M}
% E3 f @5 B8 d! t4 Y4 K# {2 j; k, P
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. ], T; g+ w& \; A: y% \- {5 {
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |