嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
; M7 z: z) [. N; oinput mcasp_ahclkx,% z; f# l: e; T! ~1 l+ Y; ]
input mcasp_aclkx,1 M- u) c- f) G# ]+ ~
input axr0,! t8 Z- A! C0 J& T
, H& F) R; w# ?, i* K1 woutput mcasp_afsr,
, [, `% m/ E l7 K7 c# U: ooutput mcasp_ahclkr,
! `& B3 n5 v( T* b A# Y0 J* n9 Zoutput mcasp_aclkr,
- D* F( R. v8 }0 }0 F# r9 L; eoutput axr1,1 c1 O5 R2 a3 O5 m; l @, s
assign mcasp_afsr = mcasp_afsx;! C% G% w) x. @* f9 ?8 F. l
assign mcasp_aclkr = mcasp_aclkx;5 T {) Q/ b5 C: p2 O
assign mcasp_ahclkr = mcasp_ahclkx;
4 Y. ?# b# C( k# G; b4 bassign axr1 = axr0;
4 W6 D3 ^1 v7 q6 [% J2 T6 m" r0 O, m: y# H0 x% R7 A) R
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
I( j, Y/ M+ h
static void McASPI2SConfigure(void)
$ |3 g3 ?6 C: Z6 U{* z: k1 m4 _6 P
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( F$ t1 O& B9 kMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
1 h# x1 l$ F- \" RMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);0 r" ~" I4 W, H3 X' F+ I
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */8 j Z' ?" R' x5 B+ I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 i3 e5 p* b6 M
MCASP_RX_MODE_DMA);
0 k! j) L! x" w/ K, }% r8 h! Q$ jMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' l& e- g( Y% B: J
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 G& Y) V& d" I4 ~& \, JMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 G5 r& K' S5 k9 c% ~- m9 g+ O
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 k4 w& ]/ Z: ?, X( ^* i, UMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ Y* H: z4 U# m% ^" N2 X/ l
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */& V9 i/ v* |8 h, w) r; K
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- X, v: n) h" p: j+ u* N' W+ A& xMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
, j( W- h0 `/ g* b% H! P) MMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: D; I8 f8 T! A7 N% B7 u
0x00, 0xFF);
/* configure the clock for transmitter */- F/ F/ `" W. G/ X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);, l C7 l: G6 E4 s) v6 C5 J) }# F0 M
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : P1 ?" K2 M. t) v/ L
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# d9 A! j6 J D g/ k3 _! G( [2 L1 ~0x00, 0xFF);" l( u) P" E S" x! ~3 T
d1 W/ ~0 B# _: x8 r+ h
/* Enable synchronization of RX and TX sections */
4 G- h |0 g2 h+ EMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
; l1 }$ x O# k! V/ SMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
, f3 ~3 @# j V2 y8 M6 EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( S3 R' @1 `: b4 \** Set the serializers, Currently only one serializer is set as) V. r; y0 s0 h& U$ m
** transmitter and one serializer as receiver.* Q; x9 I$ ?5 {0 p! {
*/
c E5 e" \, C! L" ^) cMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); Y. [8 P$ Q1 u' l7 i u+ E
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
3 n, I$ F7 G- m/ P; p& {7 x/ p4 C: u** Configure the McASP pins - N; y1 B, C. v0 y: R) J' j8 M
** Input - Frame Sync, Clock and Serializer Rx
2 _) V- U7 i% B% P4 s3 o** Output - Serializer Tx is connected to the input of the codec ! y5 `+ T2 T+ S0 X+ w
*/
2 y8 j5 |* z0 V7 h7 ] UMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 O5 X. K( X! Q ]* O
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));, Z6 R; f ]" y3 C g9 X. z$ H
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( l3 @4 E8 l* E/ z
| MCASP_PIN_ACLKX
$ R* h4 Q! R4 k- a. p| MCASP_PIN_AHCLKX8 C: b; @; ? }. c- A) `) z. d" O
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */& k$ L& i9 k( F5 ]1 S
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 h" N. W; u8 |: m( x- Y+ @' E
| MCASP_TX_CLKFAIL
# a( N7 q" \8 L2 v- X| MCASP_TX_SYNCERROR7 A, x5 L- {: ?/ h4 C' d) s
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! h6 b: }$ c0 F% v2 D0 p0 A| MCASP_RX_CLKFAIL
) f* x6 B" R( I0 K5 D4 e| MCASP_RX_SYNCERROR 2 d0 L m+ l9 T3 u6 O" }
| MCASP_RX_OVERRUN);
8 M S1 [/ I8 C( e7 B: [6 v}
static void I2SDataTxRxActivate(void)
4 j- }1 a3 @, x% _1 K& i{
: N* K1 F/ V& ?/* Start the clocks */9 ~" i% c( Y) F8 Q, G* @
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ {6 Z4 E' y0 k3 H) G" U/ m
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
0 T2 d5 G P. D+ N: [* ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! b# m. {8 p4 N# REDMA3_TRIG_MODE_EVENT);) {% o& m7 W, I5 G) Z. ]3 {; _9 R+ ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 v. Y9 d+ i7 H. Y, t$ w6 U; x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */) L. I/ k( Q& K
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 \$ h7 V; G6 U4 n! f' [7 x7 P
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
. i3 [, [) C* v+ N* pwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */; j3 h$ A2 [4 l7 a$ u
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, q+ E4 x8 q* J1 s( d5 G. kMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
" m& F% q7 N8 u2 E' W/ F}
( K. V! |" R; m' y请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& q/ a& m% e# n: ?& j
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |