嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,6 `( w, W+ a, Y) B0 r% f
input mcasp_ahclkx,
+ I; z; r  ~) n! s$ ainput mcasp_aclkx,9 E" |2 X- R5 B. S. h" c
input axr0,- a) X. y2 W7 h, T+ z/ @

5 h- p8 [$ N' O- n+ S$ O7 o0 D$ routput mcasp_afsr,
; C" C. j4 Z1 Coutput mcasp_ahclkr,
$ R3 @, b9 o, C& c& _$ b2 houtput mcasp_aclkr,+ K9 }; ^/ f  }" ]3 m6 R$ H$ v1 R
output axr1,. Z6 ~/ x; c# G
assign mcasp_afsr = mcasp_afsx;
& N* N; @2 c/ [3 K& g. `assign mcasp_aclkr = mcasp_aclkx;
* \+ P+ F6 |1 [0 x( e8 U' Vassign mcasp_ahclkr = mcasp_ahclkx;" q2 C8 {; E4 G& E8 v; c7 E2 V; e
assign axr1 = axr0;
, V6 b5 G3 |" @& N- b! X8 m

& S. N) [/ F+ F2 J5 @) U7 z* z; }7 I
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

& z6 s+ y7 u+ w3 S2 R4 g; `
static void McASPI2SConfigure(void)! V; x4 B1 ~9 |# L
{
4 c  ~. K+ C3 ]6 Z4 yMcASPRxReset(SOC_MCASP_0_CTRL_REGS);( c* s9 I; [5 z- X0 I* w9 t* r" f
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */( E  l6 T1 E' J3 N1 D
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; ]: R. g8 s1 E) t6 i
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
- Y# H# y1 m. L) o0 s! M3 YMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 D! r+ e% m+ ^  s
MCASP_RX_MODE_DMA);) }1 C# x, B0 Y( q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* i1 k( H3 n9 dMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
; W9 j5 q8 S, ~  }- `- OMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, . K: z6 K! Y- G2 h
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 M6 `# w6 e  o# |$ |McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, $ j* C$ f3 m1 l" g
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */* Z0 O- }& N; c% @9 P: V8 \
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
% i4 P  H  r* q, F1 F& tMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . }  Z( J7 o6 J  \
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 {7 ^: B9 f" l% T# r# K7 E
0x00, 0xFF);
/* configure the clock for transmitter */
; y  P1 Q! b. C  v% ?7 gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* u- k! K4 X0 h, `0 J
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) }9 \: s( o$ r' O' R
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' S4 a: f' }" }6 Q0x00, 0xFF);8 W2 ^& F0 r- d  J: Q! \9 {' X
9 @. o: K( K9 ^+ p; J
/* Enable synchronization of RX and TX sections */ 7 T: t  @  l7 A: D% f
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
4 z2 Z# n: ~& l( N1 E1 |McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 N# h- A  h+ B$ w5 a0 s
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*9 Q  p+ n. A. \0 Z- Y2 R- ]
** Set the serializers, Currently only one serializer is set as
+ T# R6 i* l& G: r** transmitter and one serializer as receiver.
0 L4 j9 v; K; J0 X*/
! Q5 d' e7 Z  k( c/ aMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);0 u# J  b! s. X1 k. _- {, V( f; o: i; ~6 g6 o
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/** G7 N, E  C; M8 Q6 K$ y
** Configure the McASP pins
$ v0 @3 k+ B8 U; Q5 t) t$ [** Input - Frame Sync, Clock and Serializer Rx
* Z2 y3 j9 z) S1 @4 W# I** Output - Serializer Tx is connected to the input of the codec
$ P. |" C3 B' ]1 j5 y! E* V4 \4 G*/- o( R  A. L) T, _
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" d' e4 o" k1 F3 GMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
6 l) m+ g* p, m/ IMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; f7 p, U( f) c: m
| MCASP_PIN_ACLKX
0 N- i8 k7 ^! }. Y" A| MCASP_PIN_AHCLKX% Z7 F3 `! I% I( g
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */9 G  O* _5 m% z  K) O' G
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + [8 [2 A7 F# E  D  ~0 w
| MCASP_TX_CLKFAIL 5 _9 @$ ], L: H3 s
| MCASP_TX_SYNCERROR- T9 H% o: q8 d
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 }  y" e- L2 x+ o# j| MCASP_RX_CLKFAIL
- b0 F0 N7 ~  [0 D' P: n) ^| MCASP_RX_SYNCERROR
* }! J- c- d$ T) e| MCASP_RX_OVERRUN);6 m- [- z. r  z, m. \
}
static void I2SDataTxRxActivate(void)
" ]4 ~: X$ k' H) C: R  g{
% _2 _/ I! S4 ?/* Start the clocks */. O- a( `- U6 K" |. Z7 D; X
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ F+ L$ N+ l1 ~
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
# F' i# h8 g! I0 v0 y" @/ B: LEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
" T4 L2 A+ L# eEDMA3_TRIG_MODE_EVENT);6 c; e% g, z! o4 X& ?" y( T1 ~' s& N" p% b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 h  f' F$ Z+ ]4 w# L( P# V% t& O) `
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
# t; F2 |$ M; }McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);, V  w+ e9 w) O) |4 ~* f0 {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */) @2 C  P" g2 ]( C! a
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
/ t, S7 j4 q: o) n. d% }' j4 ]$ ~McASPRxEnable(SOC_MCASP_0_CTRL_REGS);3 A, l$ k' d7 m! b' Y$ e' _" F8 ?
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
/ }2 R+ m" p* z  U! e}

7 B* N+ V. O) `& y* ?" z/ G
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

2 B0 E" ~6 _4 Z+ P1 {1 J




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