嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
# D! b$ z5 v) b3 minput mcasp_ahclkx,
& U2 Q; a, j  k" u8 ^7 j6 S, ]  Winput mcasp_aclkx,
5 d  e6 x/ [. o) {1 yinput axr0,$ a0 K9 j3 e" M  |4 b* u

! P7 G1 V0 w! v7 v2 [+ Toutput mcasp_afsr,
3 x& |6 }3 H) Poutput mcasp_ahclkr,; F/ U$ M7 o" w  S) a4 T
output mcasp_aclkr,3 Q7 `: U, c4 e% C6 x3 @5 ?
output axr1,
/ z2 A3 Y7 B3 _3 H, H+ C+ z* E5 I
assign mcasp_afsr = mcasp_afsx;
' N4 z' G3 y/ w3 D& e  [: gassign mcasp_aclkr = mcasp_aclkx;( [4 H- j* S. a4 U% D# |9 f
assign mcasp_ahclkr = mcasp_ahclkx;
9 @4 W$ f4 T: ~% {  ~8 |assign axr1 = axr0;

3 T' L/ h3 g/ u* O1 M/ Y
+ d- \2 l9 k2 Q% E1 U
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 f* q3 Q$ y9 H+ l2 A
static void McASPI2SConfigure(void)
5 ~6 H7 o$ {: @' Y+ l; A{/ Q, v: [1 X9 _9 |
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
# c, S: }0 C% x6 v1 m: J/ r( s* x  }9 kMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */" r4 Z0 X: W  C
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. y9 e+ \. @+ W9 ^9 M  y! L
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */( u7 C* b( l' D. }
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( l7 X- V. Z: k+ A) fMCASP_RX_MODE_DMA);
( d" r, o* }% ^* U+ N' G% {5 ]2 sMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; K! q" o3 j0 n/ h5 f+ y* P$ X
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
+ O3 _4 R4 I" ^. m/ jMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: H+ z2 \  f9 B: i' x2 r- LMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
# B3 G+ o5 {( l3 j8 S& |McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - X% E, ?7 D+ Z: {- j3 i
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
9 M* Q. T7 `# S! X% rMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);. @; W) z8 `% E  o* A9 d: }
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % E, x6 l/ k1 T$ @" i  d
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
, e0 ~! c! r9 g0 O0x00, 0xFF);
/* configure the clock for transmitter */
  F- `* C3 h) z8 ]$ nMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) X0 |' a* ?8 @" p. h
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 6 d) E1 u$ b5 ]" c8 F6 [
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 x; t2 F, g3 }5 q0x00, 0xFF);
( U: D+ M% c! e) w# \; B
6 j% R* W: u+ {: z" {9 V. d2 ^/* Enable synchronization of RX and TX sections */
, H0 r( w0 p, ~' W* CMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */" h( X& ?# |' F$ ^
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ M( f" @; ?% t
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
$ @8 ?  O: y- R, I5 k( {** Set the serializers, Currently only one serializer is set as0 V0 h* {# ~8 E5 ~
** transmitter and one serializer as receiver.9 d9 O; V' o5 `0 W) u2 |3 s
*/
/ Q. V5 F: a7 g  \& c" M7 eMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 R6 e2 w3 v, n/ m- ?& `# i# r* V; a1 QMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
; {. m3 J4 W0 S2 a! o** Configure the McASP pins
& G( d6 b& G/ c. |: c; s; u** Input - Frame Sync, Clock and Serializer Rx
, q6 _1 z) O9 t6 C3 q! B# O) q** Output - Serializer Tx is connected to the input of the codec 1 q+ z) y5 M: u' p" t9 v# j8 K
*/" q# T: ]: G7 h
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
9 N4 Y" P, K6 T- J2 G5 S  aMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& T$ @, G% D$ i- g' v$ LMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# ^7 v1 G4 V; M$ c5 |2 ^) _5 ?
| MCASP_PIN_ACLKX
0 u- ?0 C+ [3 Q| MCASP_PIN_AHCLKX
: p' T1 h% X8 e( w; b& V: j5 B* x| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */6 y. A3 p: d; }1 `0 e. P& I
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
: I3 i' }) l; o1 U) Z) E- h' g1 F| MCASP_TX_CLKFAIL
, V6 |' A* C7 l$ H9 Z| MCASP_TX_SYNCERROR
+ K1 Y5 m. u0 K5 b  R+ ^" a| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 E$ `; _( d1 x% N9 L
| MCASP_RX_CLKFAIL
. ?1 N3 a4 t5 ^" G- v6 X| MCASP_RX_SYNCERROR
4 A& u) Q) k- k( t9 c9 @1 G+ O- }| MCASP_RX_OVERRUN);/ c+ ?* {& c" E
}
static void I2SDataTxRxActivate(void)
9 ?* P) _% C2 \! h9 l{5 e, W5 \. y/ z1 }) `5 P
/* Start the clocks */( |' ~7 [. A6 D- V" A) {
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 @. _7 ]. e, t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
! E6 \, R8 N/ f) S6 L8 cEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& Q% e$ P; h- F. k2 I- IEDMA3_TRIG_MODE_EVENT);! r2 S7 [$ |# P/ g8 _- }# H1 w9 O' _0 o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 I: E2 K# l; u9 M) [
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
; ?! N) B$ w0 |; i* M( zMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 V4 X! o# C* m( q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */0 O' S. O7 }8 z, L9 i( y9 r
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
0 p6 T4 b  `* r) EMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! Z# Q$ w; J) O9 E. g2 m" l! u  UMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 q% B" m4 U, d4 I- |}
; f5 a6 V& n, j; T& I
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- ?+ i# K- i& C! l* Z; m! B





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