嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,( G" p3 J& S! x' {" `
input mcasp_ahclkx,2 M) r- Y1 S3 ]) m2 `; s
input mcasp_aclkx, M# [) `- E. n$ a
input axr0,0 f) I) u# o: {" ?. s" d# L; h) L' [
1 P4 b6 u. H/ Y! J2 V
output mcasp_afsr,
" F7 c% l! q' E6 T1 Y. `( ioutput mcasp_ahclkr, B- S, t" v. B
output mcasp_aclkr,: v$ f3 W& T6 v3 \' W& {8 q- R7 o
output axr1,' u: f: G( G! B6 g }6 n
assign mcasp_afsr = mcasp_afsx;
( M- N+ L5 `+ z0 g8 I) ^6 hassign mcasp_aclkr = mcasp_aclkx;# C$ v4 I$ Z' U4 ^2 {4 D
assign mcasp_ahclkr = mcasp_ahclkx;7 |8 I1 e+ t; L
assign axr1 = axr0;
6 @7 P0 |$ l0 Q( r5 N2 v
3 h' I9 k2 h2 n+ K2 w \在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! K8 F0 }$ p# o2 C
static void McASPI2SConfigure(void)
: @6 B% E) ]% W4 e{
6 q" i( E, p3 y; k1 gMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
& E* V+ v+ z7 p; NMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */4 M9 q% y. v' l
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);4 O N+ D, y6 E z; k
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
8 G' G7 P/ s# S* K( k8 kMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
7 Z3 m$ O5 U+ D4 ~MCASP_RX_MODE_DMA);4 a. b+ j! Q1 V6 o. M- w
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( o2 W* \: t% k5 Q6 c; ?MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
0 y0 }" c! u0 Z( @ kMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; J' V7 P" {; A* m% b! z4 L7 Z+ YMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 l! l; y2 l4 T
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& ~" R0 X( n- q( }% JMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
) Q" ?# M. U; U$ ?" UMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 y9 E4 ] R# L @( N; WMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 r/ _! U" B0 n5 Z# p6 U, @
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; R T: t3 {0 W2 \
0x00, 0xFF);
/* configure the clock for transmitter */
; j6 K% i- X2 ^: w- r( M0 }! D$ {5 mMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 t4 ]' S1 y" |
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
( b' i& s' }* d2 T q( KMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( M& A+ O$ W) g8 L
0x00, 0xFF);
2 Y z1 N/ B% M1 `: Z' [! _2 e! P1 b
/* Enable synchronization of RX and TX sections */
* `0 n6 n$ }3 q6 K8 `; L4 CMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */* V" d" R! Q& V( ~* Q, ^# m) [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; R2 Z3 o, z* y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
) q' Z! p" t: [4 \- a** Set the serializers, Currently only one serializer is set as9 k) O6 ~! G, p4 I' l
** transmitter and one serializer as receiver.
+ M- r( h8 j! W5 L*/5 `1 w# B5 K# t+ q
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);, f& ~7 {+ t @2 {, a! z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
0 x$ U4 p, o) Q% _9 z** Configure the McASP pins
2 x. G) D" E% v9 j** Input - Frame Sync, Clock and Serializer Rx/ c& U: W7 N; Y* ]' V E5 F
** Output - Serializer Tx is connected to the input of the codec ! H7 x a8 |5 d3 F( G$ Y- g
*/) l$ ^5 A# b" P( w
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. B5 Q) A( j& X* i- hMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 R+ W4 i7 r) N% f. `- j' _McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
$ _% t. Q# ^3 {9 j, B7 S| MCASP_PIN_ACLKX( _! f9 _ r4 j* f+ ]
| MCASP_PIN_AHCLKX* ^, R, n/ e/ ^! H
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
2 z3 A* i0 q& k$ M) y# o9 I5 e) oMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( [; e; b/ j5 M# N- [4 k4 C' e| MCASP_TX_CLKFAIL
1 B2 F& F+ B" \' i| MCASP_TX_SYNCERROR2 Z2 l9 D1 L- Z" r- ]& W$ m6 C* o& J
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) _( }% t1 g" p5 m| MCASP_RX_CLKFAIL
+ s+ [- g7 `. n. A6 G| MCASP_RX_SYNCERROR
6 D- z5 F3 A3 L4 w; o& u, t% P| MCASP_RX_OVERRUN);
: b' {2 C& h8 Z) e B) u' T}
static void I2SDataTxRxActivate(void)
- ]# c+ G1 w* o q/ p3 y{$ M; D; d* W: S' `; d5 W
/* Start the clocks */; T5 a! J6 l: c3 }2 k
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);% d! a; W, c/ y% {1 f
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer *// U! X# a& O" `, n
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,* y3 X0 Q: Z/ B: P+ j
EDMA3_TRIG_MODE_EVENT);* F0 g3 f3 `# j, p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / T" W) W$ K& @" o7 `3 R
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
, a* y# `3 R: X% GMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 d/ l) s+ M; V6 L/ i9 PMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero *// ~. ^! R& n6 ~! w( P( o
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
5 W0 d+ `* p! D: w* gMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 ~5 h/ N5 X R3 \6 E! t
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
2 {0 z( o) X: |8 u}
4 f: p3 ?0 Y) A: I+ _: ]7 `请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
. J' c I) j+ y: E! H
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |