嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
/ l/ s& i! o- M9 j, Vinput mcasp_ahclkx,- W; ?5 ^( z3 g) G
input mcasp_aclkx,
6 S5 G6 f/ w! h( E$ R8 Rinput axr0,2 s8 v  t% T* j& m: M

7 W+ _4 s' p4 c& }9 r: o( A3 C1 voutput mcasp_afsr,
  a1 N: r2 c. Y7 \output mcasp_ahclkr,- d0 A5 d3 W0 [: @0 d6 y& o* |
output mcasp_aclkr,# B. c! }) w6 T6 D4 Q
output axr1,
4 I- C/ I$ f+ b3 M1 H
assign mcasp_afsr = mcasp_afsx;
- a: O. d9 y8 @7 O. k2 z! |assign mcasp_aclkr = mcasp_aclkx;  b! _! ~5 z% |6 b, Y/ z
assign mcasp_ahclkr = mcasp_ahclkx;, S2 w2 h# x4 q: F+ h
assign axr1 = axr0;

3 K8 k* m; o+ }+ H
7 K5 N( \! d4 a
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

( T/ E" }5 F6 T( G$ N! V
static void McASPI2SConfigure(void)* C, T9 W" r! x, h: M& y" i3 P9 T
{! M% [" s7 e$ j7 Q" _$ ?
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; H( l2 @+ k- y8 D9 u- V4 ZMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */& H+ ~* R) r- t+ B  e4 o
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 F; M- L6 o9 D# x) Q; T" m
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */$ Y8 j' K4 ~0 I+ G  X% M1 j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# q; v& _% U3 wMCASP_RX_MODE_DMA);
- y* d. D  f: g, n9 m" NMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) T' Y$ O0 x8 o8 k/ b) e: @- mMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
& V/ _9 i3 V$ S8 F. ~' sMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / n; T( h8 }  Q- F3 n
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
& ~; d5 w; e4 kMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
1 v4 D& Y- N4 B) @7 vMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */' X" h# ?5 f4 R
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);% N9 J" i7 {4 V/ P6 a
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); + ~' W& s+ J$ ~
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,: `# a6 o  b% e" }3 @: Q$ x6 y
0x00, 0xFF);
/* configure the clock for transmitter */
+ j+ ]( u+ d, g" p4 L- uMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
7 j' c+ x. T, y/ z6 d7 H# NMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); $ x8 R2 I$ H  I  ~1 ?
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- E  R8 ?. [! I0 H# p6 Y8 O3 H* q0x00, 0xFF);5 ]: L& _( i: z1 O1 Z

- a, v# G5 |# M4 N/* Enable synchronization of RX and TX sections */ 5 o6 Y. H+ }* A; c* ]  r4 t! R" Q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */  B* n7 h  W3 s" y" p$ R" n
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& u8 G8 k8 o4 S$ @7 n. U
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
5 i) ?. t9 n( c( B7 i** Set the serializers, Currently only one serializer is set as- |) }4 t8 _2 o
** transmitter and one serializer as receiver.$ }" v* K* A) n4 D7 G
*/: {) j: [" k7 y0 v; {7 s7 n; M1 ^
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
0 t) e( L  t2 _McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*9 [$ w8 k& c% i2 K
** Configure the McASP pins
7 L! D" Q  p& |" V6 }& Z. j** Input - Frame Sync, Clock and Serializer Rx
6 G8 F4 t: j9 i' b) d4 }# n! v% _** Output - Serializer Tx is connected to the input of the codec
3 Q) L! p: T2 h0 ]1 @3 W0 b*/
! i. K/ H% `( B9 Y+ h2 RMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- ^0 z  \, U: K7 H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 z, \6 G6 U& e
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 ?! Z( L" o3 q  J9 E
| MCASP_PIN_ACLKX. W8 m* J# n! S
| MCASP_PIN_AHCLKX
5 E' o& d; {: g# w1 D. q" E% `| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
+ A& X) P/ I8 j2 \% ]6 VMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
  l. F  E9 C) q8 t$ n| MCASP_TX_CLKFAIL , o  X) F4 S) g7 Y5 Q& N
| MCASP_TX_SYNCERROR8 E6 a* E; t- P8 P: [& Y
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- H5 d2 O) @/ ~4 b( c8 n0 z| MCASP_RX_CLKFAIL8 V, J- S6 ~" b9 s; H0 f( b1 E
| MCASP_RX_SYNCERROR
/ u; s) g  J- M; ]3 k| MCASP_RX_OVERRUN);
# b% \7 J! }6 v. V/ y+ g}
static void I2SDataTxRxActivate(void)
; N& p) n/ [- e0 ^+ c" F{
" b6 u" ~5 K* D, y3 F  k/* Start the clocks */
7 K: ]9 P4 u) k$ HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# d+ K6 i# u; }& YMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
. I* Y1 s+ h, ?) ^8 `- `* i' ]7 cEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
$ ]* [9 Z! ^, l5 wEDMA3_TRIG_MODE_EVENT);
4 |: G6 y0 Z% R' q7 DEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 L1 V4 {% f6 U  F$ {: W
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
: ~# E7 C. e7 p5 O( m0 Y; uMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: ^. b  q2 ]/ f8 n3 t0 [' u' UMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */  e! W4 N  i, ~& G3 W: G! h! K4 R
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */) @& y7 V; f, b1 x" e" v
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( Q( i* {! d& P% e$ dMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
5 l& ]; L4 S* C9 `, H9 e, s' H}

3 l( {$ p0 l$ N- i% V
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, G3 m0 J4 O. t3 g( P) o, S0 k! n





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