嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
0 f( R- v( \/ }1 jinput mcasp_ahclkx,' x/ y. G% e$ f) {7 g7 d# ^
input mcasp_aclkx,
: M& E% P$ A, ^- b; U# s6 t/ pinput axr0,
/ z) d1 [2 F4 V, x! R$ D. Q# }9 n8 v, }8 q* w. z
output mcasp_afsr,* D) d/ w2 K6 P; B7 V6 c6 l
output mcasp_ahclkr,
' Y$ R' \& \5 S2 I. u( J2 E$ ~output mcasp_aclkr,
5 J% R% R& b$ ?9 z2 Uoutput axr1,
6 R# d: m5 _  c+ X6 f
assign mcasp_afsr = mcasp_afsx;6 g& m% X/ U0 ^: ?& H; \
assign mcasp_aclkr = mcasp_aclkx;3 Z/ |3 W7 u3 n! p+ u
assign mcasp_ahclkr = mcasp_ahclkx;* ^" W4 O5 J1 f" t: N2 G' _
assign axr1 = axr0;
! v0 ?( k. W+ r4 A. k! {" x$ l

6 a+ z8 C, I- w/ y! E2 j3 S
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: I# U6 d6 w8 M: T, }
static void McASPI2SConfigure(void)
( ~  n3 m3 G9 f  U% r: F) _{4 E% M( l- h8 y( @' j
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, b$ ^6 m4 w: V7 wMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
2 @- q8 R6 h- k6 `: x: wMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
0 y/ y% v; h8 w& j3 UMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
5 t6 D- b  X& Q$ xMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% S& r6 K4 G! G7 z" ^& P+ \MCASP_RX_MODE_DMA);, _" @/ ^1 f2 s' Y: p, a
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 x; ^* [; k. \; p9 O- L: N
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
2 j: [. Q7 g* j( V. GMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,   T/ ?& d2 _& j' b  t
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);0 C' _; L; y4 P- \, `3 N
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 U& l) X9 q9 p
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
) E$ Q5 d2 _- @& OMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 j8 L9 `3 Z& h# i3 g
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
1 i- r* `3 w& f5 g0 l% L9 YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
3 |8 \1 u6 P! w" q) c0x00, 0xFF);
/* configure the clock for transmitter */
% f: |3 F$ ]( [% |McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);% Z2 h( u, s/ }
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : E! n" w6 O3 s% e) F
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
) a" V2 ]" l( O3 V0x00, 0xFF);
5 g" S. V( \; f: J
& a+ h- }% t8 @0 q5 @5 {* L6 \/* Enable synchronization of RX and TX sections */
& E# S5 U2 A# f( T8 l; O% jMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
/ p; G% h: e" ^, v6 y8 i5 gMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 S) S$ v/ u9 x( w# K6 q0 ?5 Z1 {
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*5 H" F6 _+ `5 n; w; J
** Set the serializers, Currently only one serializer is set as
& H! \  J9 n! X** transmitter and one serializer as receiver.
' v1 a! k, _7 v*/
) q; S0 K! C5 X3 |" XMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
( \) n% ]& Y0 K7 lMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
- F5 W. b9 x1 B& r* Q! I** Configure the McASP pins ! d9 k& Y3 D8 i; k  y8 U1 @
** Input - Frame Sync, Clock and Serializer Rx
8 e- C- _5 b' X6 ]# J** Output - Serializer Tx is connected to the input of the codec
$ Y( b' @. t! L+ d3 k2 W*/
8 _+ U' ^* ]6 x" b) u$ e0 ^McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ C0 l. V, p. p2 B4 `; S, xMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! [% G, Q. k$ v! |' A
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX$ t" J- u" h( I  `& L
| MCASP_PIN_ACLKX/ D7 ^3 H3 n: w
| MCASP_PIN_AHCLKX
8 X% s" R. M; w  I) p| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
# f$ i2 q" u! W  |8 K: Q) qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 r9 u; z2 W1 I
| MCASP_TX_CLKFAIL 6 }# B2 D3 D: }+ Z% y0 c; H
| MCASP_TX_SYNCERROR' ^' T2 F! J0 C
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ P8 W% I. ^' _% X; `% G| MCASP_RX_CLKFAIL
& Y1 m6 ^( U! n7 U" ?| MCASP_RX_SYNCERROR " P0 v( _: z" ]9 L* N* H6 F# k3 I
| MCASP_RX_OVERRUN);$ Y( B! V1 n1 R) m% {
}
static void I2SDataTxRxActivate(void)! E! W, r8 w! b# C! b! r/ h- S
{
- p! V2 x9 Y2 M6 R& ~/* Start the clocks */( p$ {" n  m% |  h6 ^: E0 L; y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# z- X6 g! I4 d+ P. E  d* T$ EMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */) s* o& L, P. l8 r& D
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,2 j1 R: @' k, l9 W
EDMA3_TRIG_MODE_EVENT);6 d. ^3 `( z7 J7 X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ u7 O0 ~  d6 D. T6 j3 ]8 _
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */* T6 s( H4 }; K+ s9 ?
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
* g' l3 o( {0 j! \& z4 eMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
3 v1 P' b+ N2 O6 Jwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */0 A: P7 A$ S1 R
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 H# D5 y6 L- Q5 S6 f3 h: q7 G
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) g# S( {6 D) C$ U- |, E$ |}

" `" ?. L& I4 G* H4 v- B. x& q
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

6 F$ Y' N7 a! l2 G  e0 M




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