嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,5 V3 _2 Z* W* w  e* M4 \( `# [3 a
input mcasp_ahclkx,
6 o/ h: J* c7 R. k- |! Linput mcasp_aclkx,
/ P% {5 C) w% W5 ]( [. pinput axr0,3 }' C9 D3 c, m) j

! N0 X) S: E6 B7 p/ O- g6 C; c3 Xoutput mcasp_afsr,0 k0 O0 L& [  }  B
output mcasp_ahclkr,; v% c( h: b! b1 P
output mcasp_aclkr,
* s0 \8 U% D) ooutput axr1,
. E6 J9 l/ N$ [( z& g/ q
assign mcasp_afsr = mcasp_afsx;, o6 F! ]2 h7 Y+ ?3 B* }
assign mcasp_aclkr = mcasp_aclkx;7 g7 [' i* ]/ a: j0 e0 h# y
assign mcasp_ahclkr = mcasp_ahclkx;& p, M; F8 T# Q$ v
assign axr1 = axr0;

0 ^# S# v, X) _8 L
) Y$ ?' i, Q, n
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

) ~! A0 j" d. N$ t; f8 [( B
static void McASPI2SConfigure(void): S4 k- b# [  x
{
, x0 X% T! L, n' ^/ VMcASPRxReset(SOC_MCASP_0_CTRL_REGS);6 z4 n+ L* G+ H4 Z
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
  ~% w. M. K9 o' a. ]McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" [9 ?6 }8 c9 i6 n; s: S8 F" M0 L+ y! ]
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
( k9 U5 S  l; k6 sMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,' `& }+ n2 t5 L' o, Y* L  Q* A
MCASP_RX_MODE_DMA);0 j4 f6 H) i( w3 S
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 Z. x/ x% ~7 u( ^6 h3 a
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots *// F6 |1 s; }: c. Y9 [2 P5 t
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
( ^  j7 t8 B4 L- v% bMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
, D+ [- g$ W" M2 H  `! PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- @' Q7 w" b5 L' {( fMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */" _" K4 F& i' }' j0 i9 y. K
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( B; {$ p5 p* \5 a0 k
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
. a: a3 o- ?  Q2 r( Y7 x- e. dMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 E; d) T" p' h
0x00, 0xFF);
/* configure the clock for transmitter */) u0 d" v: M2 m8 F' n6 y$ C% U
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 H( p8 m+ {2 [, [$ H/ ~McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
  l) M# u( Q/ h  ?McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,' f. w/ b9 I' Y  x, {3 d
0x00, 0xFF);/ V/ n6 o. O* e+ a6 z( ]! d

8 z& X$ G% D* n/* Enable synchronization of RX and TX sections */ 7 G" u* y* \4 P8 t7 g/ ^0 V
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
' d9 s: w* S; J$ B* nMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
* I0 L. Q& `8 C9 W2 q6 t" X2 bMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
* ?" H! [4 x! B* @; v** Set the serializers, Currently only one serializer is set as7 ~2 F  W' o0 F. _. p4 I
** transmitter and one serializer as receiver.
6 |" W4 F# Q! q! Z# C/ q% ]/ T0 r*/- x- K7 k! L6 i1 h
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
8 @+ S) f- c3 z, f1 |4 U! ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
4 @# d7 Y- H9 r- Z  X8 a** Configure the McASP pins
* |, \% P; Q* s% w( B** Input - Frame Sync, Clock and Serializer Rx7 L$ O5 y1 v8 S/ x& v
** Output - Serializer Tx is connected to the input of the codec # L1 e2 g/ z+ x+ R1 X8 W+ [; b
*/
, q7 q. X8 E% ?) ]5 b& V" GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 z  G: ^3 p- V5 A, O1 v
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 ]6 G! R! v6 C) W' T+ I6 _/ _McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 E4 n; \  f) v$ \* w| MCASP_PIN_ACLKX% A/ m* d3 d2 E" F2 m! O2 y- `
| MCASP_PIN_AHCLKX
( B# F: F2 `  S; B* u  w2 {| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
0 r6 B# H+ Q- q! dMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
5 E" P! u: R% u9 z( h| MCASP_TX_CLKFAIL 4 D# B' p7 i- K7 q( k
| MCASP_TX_SYNCERROR# H' X: @: D- `- E* e, i3 _- l+ ]
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 \+ U& _- Z& q| MCASP_RX_CLKFAIL
. c" y0 D0 L+ m$ y: W7 x% S| MCASP_RX_SYNCERROR + f; o0 C( p6 d# g* a* B
| MCASP_RX_OVERRUN);6 Y6 n8 p% S" z8 j
}
static void I2SDataTxRxActivate(void)
$ D) r# h6 U; e$ ~+ T" p/ u{
8 T4 O# _( Z4 }$ D/* Start the clocks */
2 }" }! C$ X; n. pMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- S& H, }0 u8 c0 g9 J! oMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */; s. N& R4 e8 x; {5 m2 i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% N4 x. U) S8 V5 X
EDMA3_TRIG_MODE_EVENT);
0 K8 V# ~/ Z9 a# R4 }% ^  NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, . B  {; v, X: {. l* \1 }
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
( x% V+ r8 Q) Q& PMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! Z# y/ ~, G, P% vMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */+ g% S6 }- ^4 a
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
5 i7 i  e4 O6 G/ K2 L, N* |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);+ ?$ n& p4 c. U
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 B) b# N8 o- F' y) g* G- t
}

1 K+ r( S8 k; n* c4 }
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

, |7 {) O) T. x/ A: t7 F2 ~& }7 R6 y




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