嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,6 G+ Z7 m) `: f( T% \% V
input mcasp_ahclkx,
9 ?" a1 e. D; z& ^2 dinput mcasp_aclkx,
3 M/ W; p) S( kinput axr0,1 C( |* [' Z: B8 [' R1 z
- ?: N# r- {6 ?: P* ~( p0 f
output mcasp_afsr,& `5 s. u3 K  F# I( g
output mcasp_ahclkr,
7 `, l  \2 ^( G2 m2 ?, I, ], eoutput mcasp_aclkr,9 v- f. V6 W* ]; h
output axr1,
6 ^% ]* j  |! M- O
assign mcasp_afsr = mcasp_afsx;
9 j& j/ l# }' u8 @7 O: Yassign mcasp_aclkr = mcasp_aclkx;9 e, w* i7 z4 Z
assign mcasp_ahclkr = mcasp_ahclkx;3 u% D  n% k: ~4 g! N
assign axr1 = axr0;
' L$ |7 y. J! A: l3 G

/ h) N, y( M; H" R
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 k# V8 M: K8 e2 p, {9 W; y0 [
static void McASPI2SConfigure(void)
5 O! F4 w, E& `! v$ v/ w{$ O) X- N+ t  v+ O1 A: W. v
McASPRxReset(SOC_MCASP_0_CTRL_REGS);/ m, f! x2 R, M' S/ P0 }' s2 e
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */; A( u' J' a0 m  S1 Z/ w
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; X; ~& s+ |8 ]( NMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 \1 i1 u8 [, e
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' m+ G/ K6 H. E7 ?7 rMCASP_RX_MODE_DMA);
1 g3 m- R; Q' gMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; e. N7 H+ r' d6 H* y: A
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 T4 A( ~4 ]5 ~0 K# C+ I2 y% x+ F7 p) ~
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
# q2 I9 o3 K* U3 j( W8 IMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
  Y/ M7 j( _: x5 Y. A9 m$ N2 `& }( o0 Z) }1 lMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
9 x  ~& s- @. G' N) y$ l7 [+ }MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
+ o. d$ v/ D$ S2 gMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);) a5 D2 v9 {3 O9 d/ r& T; S& F' ~& B
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 0 ^- `& |1 R& [) Z+ Y* X- W7 R* R
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,% w6 ~6 Q( l6 _# t" E' H
0x00, 0xFF);
/* configure the clock for transmitter *// A& c' L, L3 P9 r
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( g+ b# d! j4 h9 [) A' Z- Y) x
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % H( S8 k3 y+ f! @
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,: h  S: t6 A  c/ e( H. u- B
0x00, 0xFF);4 b" j* z% ~% M% z

. I. l" k* R. e2 T- t; s( \$ p/* Enable synchronization of RX and TX sections */ 6 [- g8 n7 J) P) Y* m
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, M7 y9 ^& i* z$ G) _8 p2 {
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
& H3 ~8 c- U0 i: g0 k% M; m2 `McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*% t' }% z. C$ I( w( T
** Set the serializers, Currently only one serializer is set as- }2 n# _2 w7 P) n/ u7 s
** transmitter and one serializer as receiver.6 m: X9 A7 B7 p$ D2 h
*/0 C% e& Z* P6 h+ \: c) K& {
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);9 m7 E+ R! z1 `1 w# n
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
; J* @% M4 ^; n* n2 _- {4 H) A** Configure the McASP pins + W/ i# \1 M9 s9 l% g4 W5 s) D
** Input - Frame Sync, Clock and Serializer Rx: C. y/ u" m- O% x3 m. Z# p& q
** Output - Serializer Tx is connected to the input of the codec
! G/ c; C: s: T*/) S7 i% Z- q7 B7 F6 d  a8 ^
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
7 _. [2 R* U6 q9 M. ?McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));* Q+ b3 w) J. V4 Z# P; t9 U2 m
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 \% n/ ^9 X7 b0 L8 V5 H| MCASP_PIN_ACLKX' F0 g3 ^7 y4 O% W4 O
| MCASP_PIN_AHCLKX
8 c/ m+ g1 A; C1 k0 S* |+ f| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */; V" D. m/ x0 |& ?
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 1 b! C( x, m$ j, w
| MCASP_TX_CLKFAIL " }0 Y( f' \% a2 A! c6 E
| MCASP_TX_SYNCERROR& w! |' c$ \3 T
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& f7 k+ \5 H# w: L& i' j% ?| MCASP_RX_CLKFAIL
: T; N" G7 I' _$ Q| MCASP_RX_SYNCERROR 5 L5 q  v; F/ n/ M' l6 Q
| MCASP_RX_OVERRUN);5 {$ e; {( K  y1 ^, a; X
}
static void I2SDataTxRxActivate(void): i. {) B( |, [( [1 A2 e
{
1 K& k9 A# K- N/* Start the clocks */. X# E1 t+ N  x+ f
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 w9 W. Q: T- q  b
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
0 X5 `% ^5 ]7 M+ n0 }8 UEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 O! @( x6 G5 A' x
EDMA3_TRIG_MODE_EVENT);
9 A% K" r% B( R: `2 T5 X/ ]9 tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ W* Z* N" l; I/ k7 h
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
6 R- X- J: N+ I) l- f* ?McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);% V7 W9 P( _; {( u( \
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero *// F% o6 ~5 p: k. [
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
3 B. n% l' x4 t' ]McASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 Z! d/ m1 f9 i1 T- E
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 l9 V! K* S" x" Z
}
# [- \- `+ `/ B6 b$ m/ o
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

9 I8 W" ^0 c6 R' u" U+ U




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