嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,; V* Q% g6 f# b' d, l! H
input mcasp_ahclkx,
& n, R+ ]/ I% winput mcasp_aclkx,) ^8 ~! A6 O" X5 {; p2 b' _
input axr0,
/ F f" `0 [ c! Z: u
! }9 b4 j( U3 g/ N0 P' aoutput mcasp_afsr,
$ Y' M" o7 X/ r6 r( foutput mcasp_ahclkr,
9 a* D4 z# S1 v! N" aoutput mcasp_aclkr,
7 X U0 y$ g0 m+ Joutput axr1,. D8 Y; s! ]. ?; b0 c: E
assign mcasp_afsr = mcasp_afsx;: _+ c9 E4 k$ h; @ r
assign mcasp_aclkr = mcasp_aclkx;
0 E) x9 W2 ?7 T& }assign mcasp_ahclkr = mcasp_ahclkx;4 _6 X6 z3 Z& i2 Q# ~* i f
assign axr1 = axr0;
# V8 ]; ^: L: e7 l2 R0 B0 x) `' ~; U2 A+ y I3 J: t9 y2 b( J Z6 c4 c5 l R
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
% ~- s" [1 F/ U. C7 c c. qstatic void McASPI2SConfigure(void)" @- o. Q8 Z# _" E
{) D# ]% D. z$ i) u- H7 d
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 _2 {5 a+ }; N4 t: t eMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */- d! ?% @$ R1 V: ?2 a( N+ e
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 N9 A; I: w$ J4 V9 @& B$ i% M
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */) _. h. P7 q* d1 q1 U
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! S, W; e7 I; ?( m& K
MCASP_RX_MODE_DMA);+ y# c" p5 p9 V; b% m P
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, _* y7 r3 k) Q3 T2 _ C7 ]MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; g( D+ v4 z; m% J
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
( ]# R. b K4 t% `/ l# `8 W0 A LMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) W' Q& S2 {% e+ AMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
5 h% t: ]9 u2 ~* G! K5 x: ^& [MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
8 A0 c0 B! l4 b% p' OMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 s( _; s6 E4 r* t0 n
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% d, ~- _# d$ Y" tMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) M; V5 \6 Q, d6 W0x00, 0xFF);
/* configure the clock for transmitter */5 s' m$ y! x/ @! ^
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! X: L/ ^' B1 v% \9 yMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( k0 S- j3 g+ b8 b, S3 a' Q
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
1 H9 B+ _; Z- D: v3 g1 @3 d& T0x00, 0xFF);
6 _( w( @3 `7 z/ N5 W+ b) H, G
# F7 ^: a7 v; i1 j* G, G4 F/* Enable synchronization of RX and TX sections */ 8 P3 s9 ~* c0 ] P! ]+ z
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */6 ~+ `# `& Q: l, ]$ ^0 d5 V
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. f& Z$ m5 I; Q0 y' cMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*' o" f$ T3 }9 i, U i2 X
** Set the serializers, Currently only one serializer is set as: X7 K$ D* R; k- {, m0 a$ X
** transmitter and one serializer as receiver.
8 Z( \ Q1 S5 o* t5 D- r( O# z! N8 V*/ |& l6 \; I% r) ~! I' ~4 q6 w
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ I6 U& l; y' m1 d: `
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*7 S% l8 O# b$ Z; Z. _) ?
** Configure the McASP pins
# s+ N8 S7 t+ W5 w* U** Input - Frame Sync, Clock and Serializer Rx1 I: F5 e% z2 R9 |" F
** Output - Serializer Tx is connected to the input of the codec [" y. @. v5 Q6 C7 h
*// Z0 c }) O3 y3 [7 b& H6 W' k
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ ?) l7 q5 D; J4 ?McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% Z6 R. F4 ], P9 A+ W, NMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
" B* I+ z' ~" g4 G/ s _& J0 S| MCASP_PIN_ACLKX5 G7 D; ]& v3 U1 u: K
| MCASP_PIN_AHCLKX2 W5 i, s% S* c
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 Q4 [* v; ?0 p0 t- i4 L8 j7 VMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
; A1 ]" R* o( }& x| MCASP_TX_CLKFAIL
y1 X. b! S& x5 A| MCASP_TX_SYNCERROR
4 m9 o6 F4 Z# O3 D1 y" C| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: y9 u3 [) }( d! D" G$ k$ ~& C| MCASP_RX_CLKFAIL
0 S$ j# A1 o# Y; [6 ~# f| MCASP_RX_SYNCERROR 9 n; O( y% G# g& g" I Y0 k
| MCASP_RX_OVERRUN);
2 A( W& [3 [) A6 e3 M! [1 E9 @# P% m}
static void I2SDataTxRxActivate(void)6 Y- R8 i& f, E* C
{/ Y3 N8 G2 l" _
/* Start the clocks */
Z7 l. x$ S) i' iMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 t- C6 D2 H0 K4 ?# PMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
0 R/ Q- W: o" d* {EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! _" E$ W! ^! |" AEDMA3_TRIG_MODE_EVENT);
8 ], J3 Y5 v" G' REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ c. Q- R3 L4 j m$ x. aEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */: ]: w& d- S) ]7 \/ u6 [
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! [ F8 U& u& O! U" b# K i/ z8 iMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
|3 Y6 c% W/ T' k4 | vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
, Y9 q* P/ }; t1 QMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);( P$ `, K" Q3 M, o" m, F
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);, u2 [/ E; W* b; W; X& o. ^) @/ a
}
9 @$ I! _" _$ g+ `6 V4 _请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 l8 C; D& i# R, `7 E
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |