嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
6 S- x( b. q) Vinput mcasp_ahclkx,
& _8 w8 f" N" m2 ginput mcasp_aclkx,9 a3 h7 V9 g1 F; A
input axr0,8 B8 ?4 w/ [8 ]- C

7 W2 g* f6 j3 woutput mcasp_afsr,
' Z* c% @/ t* d/ Moutput mcasp_ahclkr,! _9 R/ z9 U1 D+ @& @' r+ J7 ]
output mcasp_aclkr,
& {4 p( s1 o# ooutput axr1,
0 M) f  I7 Y+ F8 t0 o# A
assign mcasp_afsr = mcasp_afsx;5 Y- j8 m, m2 P
assign mcasp_aclkr = mcasp_aclkx;
- S4 ^% B# n+ g, b+ {8 N4 Yassign mcasp_ahclkr = mcasp_ahclkx;
9 e" s7 c  y% J' H7 Uassign axr1 = axr0;
. J" x1 x) |7 T

: t6 c: {1 m6 k
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
1 z; p: `* l# s; J& C, R
static void McASPI2SConfigure(void)
5 R' O" I( C# [7 j  t3 Q, B/ t{5 p3 l% o% D  ]
McASPRxReset(SOC_MCASP_0_CTRL_REGS);6 F3 K- c  t' y5 [  J
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
2 q9 v- k0 l( C! n7 i# [. k7 U: rMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* O7 S$ g' Z3 D2 T# n8 M: CMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */3 P3 e4 N; d! w. `0 h
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& ?' u' r+ f& I: d& ^MCASP_RX_MODE_DMA);0 r) B! x+ H& K7 D. I4 x* Q0 w% w
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 W6 G5 c: C4 P9 w9 c# `- h, q
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
  G7 ~4 I3 D4 M. z( W* r: `; a3 dMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 v# m/ e8 e6 B
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);" H. Q2 }: V; {6 g! j, F
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * S3 {4 I! C1 d" v: @) g/ B7 @% E
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */) n; D, {8 Z7 o: b- ?
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);5 L( o9 }: ^9 G7 {0 ]
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
+ X* f& z2 G( u( q3 x  xMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# L: i- }6 y4 C3 y  ?2 O9 I
0x00, 0xFF);
/* configure the clock for transmitter */. o% k5 U* v6 @- ~
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
7 U0 z+ N* k' qMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, W7 I* ~# J: K. l4 n2 k* HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, f2 y% r# h# a; h6 k' }: T- X0x00, 0xFF);
8 j. f+ T( A  {
7 p( E1 D4 _5 O6 Q/* Enable synchronization of RX and TX sections */
) D, ^( i8 B  S/ s- \McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */$ f; R% |0 [1 g8 ~) S* w4 t- j
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' U* W5 l; }' I& q, A% V5 T7 oMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
+ D: B2 C+ ?1 a7 _* M) P** Set the serializers, Currently only one serializer is set as3 ^2 b8 _4 A1 a# |+ J9 `0 ^# z
** transmitter and one serializer as receiver.
9 D  s4 V$ h5 V  _3 N: B*/
; \7 Y: N; m- B( w# H! YMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 a7 r9 G" z' E# }! F2 n4 T/ j- UMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*4 O5 w; f( L4 A. `
** Configure the McASP pins ) S+ k- U( Y. a7 E# y
** Input - Frame Sync, Clock and Serializer Rx6 l1 ]' }* b; |( Q2 A5 z0 k0 j
** Output - Serializer Tx is connected to the input of the codec
2 I) Z: ~6 g+ Y5 y7 X*/
! X* X7 S( J% m7 Z9 D2 M) UMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. c# `8 k6 k; VMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
& H8 L1 Y) {  g# l4 O4 T  E3 gMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* Z2 H( W% e2 ?, u, d
| MCASP_PIN_ACLKX. e( ^+ N1 ^! a
| MCASP_PIN_AHCLKX
0 `# H1 _  o1 l5 f2 n7 o) S* r/ G) I| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
7 X( |/ p8 C0 {, C: I; e. `McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 u) [2 g4 ~9 b8 L) d1 c
| MCASP_TX_CLKFAIL
5 S; `& Y- D4 F; V3 A* y1 d% `; E: R. L| MCASP_TX_SYNCERROR
1 O+ ?0 m2 v5 ?9 E1 L: `| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! k$ x" K% Z6 U; X* U, A
| MCASP_RX_CLKFAIL1 L2 {. {; V$ E- G6 M$ Q
| MCASP_RX_SYNCERROR
! E; [# v8 Y( g0 w| MCASP_RX_OVERRUN);
: Q; c6 w; t/ w3 b$ ]}
static void I2SDataTxRxActivate(void); _% V7 m$ X, {0 ~/ ^6 s
{
1 a! ?$ S; @: x% C$ [/* Start the clocks */
' H. a- T" D0 G. SMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* F) X+ b6 a1 b0 R  R
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
" i' h0 L; J9 }6 A- b0 l! jEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: q0 p: H8 @7 ?4 X* |8 f
EDMA3_TRIG_MODE_EVENT);
8 s' m# C, x  m/ m& BEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / `5 T$ {3 U9 G. B) Q$ ^4 S8 Y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */  g* K* T2 ~9 q" F. ~
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 h2 O9 [) C8 r0 h- XMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
+ Q+ l: w8 S0 j. Hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */$ F  N2 |& }$ t
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 _0 P! }0 q# s6 V. W
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);( J, E: t- e& L7 k- f. n
}

  j$ Q" E8 Q/ @! c* E7 o
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

  ^/ G& i! f7 E; k0 n. B




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