嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
5 B. a* b' _+ w% u% Ninput mcasp_ahclkx,
7 v- V8 q7 @+ C1 q1 j& C$ Cinput mcasp_aclkx,
% D9 V6 B- h: e7 Y3 Q8 A- Einput axr0,
9 L) l4 B6 x* Y' ^/ F& g
2 m4 l" G& q. H: C5 E8 g/ g3 soutput mcasp_afsr,
9 L/ P% N; m- ^$ Z2 v0 ioutput mcasp_ahclkr,
/ u4 R' s  B' D9 n$ voutput mcasp_aclkr," j9 ~% z& q: j& N0 W2 j, _
output axr1,: D: N- ?+ d4 J9 ^) H; W/ P
assign mcasp_afsr = mcasp_afsx;0 t9 L1 w! f( r6 M; ?* Q  r! i
assign mcasp_aclkr = mcasp_aclkx;8 m1 Y% y- @- q/ ^) `
assign mcasp_ahclkr = mcasp_ahclkx;
; l& T& f7 Y, p4 V1 tassign axr1 = axr0;

6 S; @9 r$ P* I; P! V% X$ X, {" j4 Y; B- `; y! L+ n, ?* j
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. j5 y' i& H6 H8 ]" a! G& {
static void McASPI2SConfigure(void)
8 n" O5 i- V& m% I3 K+ {{9 o: A8 s; {( t* l$ Z) s7 l- L7 K' r
McASPRxReset(SOC_MCASP_0_CTRL_REGS);9 m0 }, N+ p/ L& D
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */8 h9 G& M" o0 e7 m
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: Y' f8 Z" X! o' @5 B3 d. @McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
: G. P. e: g8 W' l7 lMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 d6 x+ `2 @2 R3 b+ K! PMCASP_RX_MODE_DMA);
% ]5 I2 V! I! ^" s3 i2 XMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( s/ N0 g7 m! [
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 h; E2 B9 F/ ?4 B8 c! A% B2 cMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' _6 E, E" D1 ^& c5 b
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);' h8 ], `* w$ m3 `" o
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 G( I# L( _& r& B% K, |" g3 _1 {MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */- q1 d/ Z6 E7 i- Y  H3 p, b
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
8 Z5 h4 D5 Z6 _8 E' Q7 B0 }McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 O- }* `: S; b8 p
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& n) O7 ?, K; J5 E* {0x00, 0xFF);
/* configure the clock for transmitter */( S; E4 c  ^! }
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);! @, R. X% E) e
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 O, r  ]. t2 r
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 h& B- M; Q" K/ C) O6 ?: b0x00, 0xFF);
8 M) P: o; V' x/ a  ]% j& u, [2 M9 J& n# c$ J, R+ {# T
/* Enable synchronization of RX and TX sections */ . v, F2 A  t  D8 O' i% Z9 p
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
" Z; M8 d- Q- t: P! WMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; `, A8 |1 b6 B1 _+ j
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
9 F7 \; C( i% o! _, B3 x! F1 T# b/ E** Set the serializers, Currently only one serializer is set as: K4 ]- Y, B1 L9 z- D3 Y3 r/ }/ F
** transmitter and one serializer as receiver.& h- `. C9 \0 y$ _) F
*/: W2 N% t+ H; |
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
/ D& u9 j% u+ g0 l. kMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
) A- U. A, |2 i) b- O7 P** Configure the McASP pins ; }: z) [; t( \) ]2 l
** Input - Frame Sync, Clock and Serializer Rx
0 @5 m" S) P' s2 D) J* r** Output - Serializer Tx is connected to the input of the codec - ]7 g$ I* C$ @$ i- P: o
*/) J0 `) O( A# v( B# e" o
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 |+ y7 ~( p: s+ z6 x' RMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));) ?" b2 w; Z; c
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& ^# ]$ X5 N0 C6 X; f
| MCASP_PIN_ACLKX
/ f- Z! |/ B# z| MCASP_PIN_AHCLKX2 D) a6 h1 r3 C5 Y9 v) b% D. B
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */( @: I; u1 V6 W$ x
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 q3 }6 B2 G! `/ F
| MCASP_TX_CLKFAIL
$ n" V8 x6 h6 p( E' || MCASP_TX_SYNCERROR8 u7 {: V1 t9 ?* q2 ~8 F
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ `5 e& H: r% s" e7 Q| MCASP_RX_CLKFAIL
/ U! \% f; W3 G| MCASP_RX_SYNCERROR
8 V3 ~: ~2 T% i' T| MCASP_RX_OVERRUN);: J+ Q+ A1 p% h: Q" {/ G' t9 d
}
static void I2SDataTxRxActivate(void)
% K  a# K8 N! r6 `{5 W9 }& E9 `# F2 U
/* Start the clocks */
- a2 B) ~4 y* a. l2 H$ f2 [McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" o* U" I" {6 g' H; C1 VMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
8 Y  \8 R8 b; U2 B7 jEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 \& P$ @0 T; V. |
EDMA3_TRIG_MODE_EVENT);; Q( }6 z/ s: w, Y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, * F/ w' O, X' v% }0 ?. b
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
$ @! x% M! G2 [% F* QMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 H8 n2 ~. [. p' vMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
* |. z# |! n( ywhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */) p6 A( R+ ?2 q; z, |, `9 W: t5 F
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ i4 x. R! Q: I! |6 s6 ]! ~McASPTxEnable(SOC_MCASP_0_CTRL_REGS);" T: `: \9 m8 p. N  Q2 H8 B
}

9 L  m0 Y6 T/ C, x; W% d
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) s/ Z& l; K" N% [# A





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4