嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,- v7 s' l8 x/ l* m: C
input mcasp_ahclkx,7 G# z  p/ B. Z) v3 }8 g; I* p9 z
input mcasp_aclkx,4 Q$ r+ a! N  g& P
input axr0,
$ w3 o4 d$ j% b8 z6 Q% Z. c6 a% P" [( @9 h) B" b( t  M  S
output mcasp_afsr,
2 x  D4 E$ ?% O3 koutput mcasp_ahclkr,
& E. A4 a+ ?8 boutput mcasp_aclkr,1 a9 y, C& Y8 H2 a& A. q% f
output axr1,% W3 x1 F6 c, M4 l4 ~0 z. Y9 @
assign mcasp_afsr = mcasp_afsx;2 f* f" Q- I( G  @- j* J
assign mcasp_aclkr = mcasp_aclkx;, \$ ]" U( u9 s! j- i; |4 |
assign mcasp_ahclkr = mcasp_ahclkx;
4 V. K2 T% r& |1 b$ L3 v5 tassign axr1 = axr0;

. c+ [, l( Q( s( z- r5 h) `; d
- g/ h5 f4 v2 r
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
$ F. O7 ?, L: T2 M3 G3 B9 y
static void McASPI2SConfigure(void)
1 |0 G4 a3 R0 J& y9 i{
9 F$ m0 t, B: U8 k0 p' v" UMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
  L8 g+ E! ^& m' Q( t. N+ \McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */" ?0 S5 H( I/ p' i
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
. p) M" R$ Q+ Y! _' IMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
  M2 _: e0 N: j* r6 p4 cMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: L: f6 e* M! @6 iMCASP_RX_MODE_DMA);) I: O; `2 G; m2 W4 P
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( w# G2 w9 M' w  S4 rMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */. g! p: ]$ m% S$ ?
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; j3 n- y( _$ D, H" v; eMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 Z2 J, k- E- B# LMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
5 ^/ t8 ^! Z# j0 _; ]MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
" u, M+ f: \7 C& EMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 |' L/ J, P8 \" G# P2 _
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
7 x- c- C6 H6 FMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# t2 s# V" v$ j
0x00, 0xFF);
/* configure the clock for transmitter */
) {+ t  q$ j9 ~McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: C4 U: g, W* N. eMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( P$ n  e' r  p  V8 l/ d1 D
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
% {2 y, y6 R. y5 H. p3 X0x00, 0xFF);
$ Z# Y, t) c6 M& O% M" [  I' C
- Y' T; Z/ l# C  W7 J/* Enable synchronization of RX and TX sections */ 6 K* N; R! v8 ]% h9 D7 w6 E; l5 J; `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
! d/ p% S% d2 CMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& j0 h" J& m# Q! o
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*% e, d6 T: g  ^5 K
** Set the serializers, Currently only one serializer is set as7 W8 g! ~% t2 r$ r0 q0 N
** transmitter and one serializer as receiver.
7 J6 [9 f8 m2 K: X) U8 l*/
$ o1 E2 B$ V* L6 _- J- f4 ?9 eMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! B2 Z6 Y. L- C/ z9 v$ ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*; Q) W. }: o% y/ }
** Configure the McASP pins - ~' |' x) c/ Y0 r
** Input - Frame Sync, Clock and Serializer Rx2 U0 h& d0 ?0 f' q
** Output - Serializer Tx is connected to the input of the codec
! S% c% U8 P* A4 e3 h5 d& ^*/$ Z' F; c" k1 p, @
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);  t1 _" W8 Q2 M- y( p2 j$ V+ x$ c* D
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! L' L+ [- ?& H( d
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 K$ _* U2 w. f( ?' Z# [7 N| MCASP_PIN_ACLKX' G2 D: I/ N  k$ A: a9 z
| MCASP_PIN_AHCLKX$ n  q8 d1 }3 s. \* C: e
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
( L2 l: ]7 ^% l7 \McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
( S( b& S. Z3 z" C. y  @; O% u| MCASP_TX_CLKFAIL
5 f; M* E8 r* g; ^; W1 r9 p) ]1 L| MCASP_TX_SYNCERROR
# i4 D+ X2 v$ A( s7 l| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* J, U5 v* @/ X0 L1 ], U* t| MCASP_RX_CLKFAIL
* x" o  S( H* q( l| MCASP_RX_SYNCERROR
6 N# b0 V0 k  h# {# x3 ^| MCASP_RX_OVERRUN);1 x+ x1 _, H' ~) f- ~( \8 _
}
static void I2SDataTxRxActivate(void)
1 J' f- `1 E4 p; ?) V' E{9 J" A) ^# X! W
/* Start the clocks */% D4 X: D  W1 Q# q" s* J# I4 [
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ W& t# Y' S- e( i5 U
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
! m8 C! F4 f0 a3 cEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 Q9 Q' f6 r- w) c  M6 a0 t
EDMA3_TRIG_MODE_EVENT);1 |0 J9 I8 n. z4 t+ q/ p4 p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " l& z) F4 v+ _( b1 v5 A
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
* s0 v/ g3 A( sMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);6 x6 [5 G: V# L) c5 g8 b, A) P
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */2 r, j8 _0 Y* X
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */: D7 @" R# M8 y4 n
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
& a$ t  f6 V5 w. \  x5 l6 B) LMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);, x" m5 E) o8 p& b7 ^) U9 T/ l4 E
}

# k. Q1 X# c$ q5 `! }9 ^% G; G
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
6 S$ |8 q4 }, z9 g' ]





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