嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
9 L! f# C4 f u0 [0 o) {input mcasp_ahclkx,
) B! a$ b) j3 Vinput mcasp_aclkx,
7 w& d N! ~5 a) i8 X8 ~ X: Linput axr0,
0 i' k1 ^1 y# V( u( Y4 B
, g% s4 W: a0 m; \( h% n- Boutput mcasp_afsr, s9 Y" ^6 D) @
output mcasp_ahclkr,. n+ S5 y8 l' Q7 P
output mcasp_aclkr,/ b9 A2 j! P8 k. T4 p ?; Z9 e
output axr1,4 o, x% d: ^0 P
assign mcasp_afsr = mcasp_afsx;
1 w" f# X: T/ ~9 d E8 Xassign mcasp_aclkr = mcasp_aclkx;
0 }; d" h. X+ R3 p. {, q# I% u# M% Xassign mcasp_ahclkr = mcasp_ahclkx;7 F, F7 c# _: ]6 p7 H# B
assign axr1 = axr0;
0 p2 f& c% V1 k
6 d+ S* ~; S3 w8 |7 | f在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. x' t$ _2 K8 G* S
static void McASPI2SConfigure(void)
4 |& j7 Y3 ^; {" {{0 u8 T. o/ \4 h4 ]. h' B
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
# J% ~1 A5 V) ]McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
5 A7 Y5 j: L& B6 r; n. e# H) e6 V2 dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); v0 Z9 j. Z5 O9 y1 J& i
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
+ T9 ]# @: `6 Y* wMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- m* C. W+ _, g7 {; X! ?# d6 H1 g
MCASP_RX_MODE_DMA);
# E1 w! E) m7 ~: vMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 Z+ g! O3 P$ a2 I$ ?
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 T! m" U) T6 I U, |/ _: s6 k* DMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; Z5 Q& Q( c! a3 N
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( k3 F; \( K" B# N* p j. Y1 Q: h4 iMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 m- S" m5 X9 B5 \1 ~MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
8 U! r+ p6 {. p1 tMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 ^% C/ _; l6 L4 d# G, ]McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 1 a! f0 ?9 R, p* v
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
* x6 E, J+ X, c* J% _: ~0x00, 0xFF);
/* configure the clock for transmitter */+ s$ d# A" \5 Q+ j9 W
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 a4 N& y$ t' M6 j4 u" |# ^+ R3 qMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( N0 p; ~$ }! K
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: s! G6 I# L( _+ ^( R3 |0x00, 0xFF);
! G: ]4 a3 V/ p: k! \4 E
# A. h' U" N6 F/* Enable synchronization of RX and TX sections */
) E; |$ G; P% @9 g+ eMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */6 c, j( d" U/ |+ G" w; {& g3 O
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); v: b! }7 E$ Q a% F: w+ z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*" M! C( j4 w& q9 H$ \: y7 ]# g5 X
** Set the serializers, Currently only one serializer is set as
$ Y9 n: M8 A6 Z/ V5 X F. w7 R** transmitter and one serializer as receiver.
5 G# S9 C4 R8 r$ [2 T9 h*/6 I' [5 J6 ]6 Y7 |
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
. u3 b7 t& z( m7 h# T. G, VMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
% U. D% ~: u) u- ?4 b** Configure the McASP pins
1 C# l0 s3 }$ p: J; C# v$ c, D** Input - Frame Sync, Clock and Serializer Rx, _4 T9 E$ m) i4 Z6 v. ]
** Output - Serializer Tx is connected to the input of the codec
/ o: Q9 @1 ]' S8 _0 h5 P*/
% i( s U( _5 T d# _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 @5 I0 m; r& c$ s |McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
v: m; Y9 u/ dMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* u" o$ J. v1 }# m( K4 L+ T
| MCASP_PIN_ACLKX
1 w- T! J$ K# Z+ w6 ?| MCASP_PIN_AHCLKX `4 q) Z/ V& a8 a2 u8 D) W; x
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */5 s6 p4 C5 h; U+ \
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( k& l3 U6 ]: `! l) X( i| MCASP_TX_CLKFAIL
4 X8 p F8 v2 w- \| MCASP_TX_SYNCERROR/ d0 }( B/ D3 l3 x
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 g4 @. l* r) e- R% |2 J| MCASP_RX_CLKFAIL( [6 n7 _) [' C( B) U
| MCASP_RX_SYNCERROR }, J8 B* w( R! d" c# Z
| MCASP_RX_OVERRUN);
# @" X9 {. I# {% `}
static void I2SDataTxRxActivate(void)
3 P0 ^ f2 v% c. [: t; {: V{9 D( L% G& D8 M7 ]" Z
/* Start the clocks */
3 m' y0 O% a# E, F. s; O3 hMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- x9 S* f# k: U0 ^ W- d
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
/ G1 ]% W) h, ]& ~EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 W4 Y/ }# U3 U4 n. f( H# S. T) mEDMA3_TRIG_MODE_EVENT);
8 I/ H4 [9 f2 P; H9 gEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, * x. h; T' O; q; P' x( G5 G p4 {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */5 N% X) V5 c# Y5 q0 q
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
1 g! v$ i% y. O6 }; C7 L$ v2 aMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */7 f8 y( b9 i( e& ~, h/ ?% P
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
7 L* t) g4 V4 E: X# IMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ |8 O. B. P, B1 l; D9 W1 eMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! l2 R3 f% x2 H$ t1 I) b4 @1 }5 h}
2 V Z" ?1 [7 ~' t- h9 v请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
" ^; U, ]2 N5 }. d4 B8 r$ g/ {
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |