嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,4 O. c. I( g8 g
input mcasp_ahclkx,
9 r( n, ?8 }* w- ninput mcasp_aclkx,
1 b3 ?2 z/ \, ~0 e  W( j) K/ ninput axr0,0 b! N/ J! r# U  `2 Y8 e$ `

3 P0 O# `+ u8 m6 m. q. v. T, y4 }2 l+ h1 ~output mcasp_afsr,
" t4 Y3 `' G- C9 O1 D  q! ooutput mcasp_ahclkr,
* p7 m1 c( I; W. f* T) Houtput mcasp_aclkr,7 H1 _' l' Z( m* W' w
output axr1,, A% [9 t+ G* V3 c
assign mcasp_afsr = mcasp_afsx;6 K' Z! o" D7 L2 @" Y+ y& g; ?
assign mcasp_aclkr = mcasp_aclkx;5 I# S4 t' }5 H/ Q, p4 ?( W
assign mcasp_ahclkr = mcasp_ahclkx;  N$ O, v8 r+ s& q1 ]
assign axr1 = axr0;
5 Y7 s* S; ?: ~' ^# F8 @# s  W

. J5 C; m+ q4 g
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
, N+ \% ~: W4 K% L+ R. h' w
static void McASPI2SConfigure(void)
, ~1 ]( L' w/ q( V8 ?{
4 `# |! I1 u8 ~0 VMcASPRxReset(SOC_MCASP_0_CTRL_REGS);$ y$ d- S8 r+ |; v. S3 a: I% N
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */% [  Q. o7 I0 u4 [. B+ N, u
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
8 N8 K" g1 f5 F' I( `McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
# i. @& E2 w9 ?4 k, [0 w; xMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ S  U: ~! m2 m& S3 \' oMCASP_RX_MODE_DMA);
8 l9 E6 ~' O, x1 K$ l* eMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ o# I- T; l: q8 ZMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 Z3 [! s2 d- H! @3 A. pMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
5 ^( U5 C2 `/ y3 @( ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* L7 v) V# Y1 G5 n/ U' VMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 g8 ]3 h+ \3 b, Q
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
3 d" R+ ~4 R4 h4 O- oMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 U6 y  e" a$ V; b5 U: u# j. n6 _McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* d% W& d+ o7 x4 u0 U9 F* d. p4 i! u; IMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
7 E1 m! Q3 I) |) C* P0x00, 0xFF);
/* configure the clock for transmitter */& n3 V% I0 ]. }, {! X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 r0 I' j$ P6 {: V; F
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 z% ]+ I/ U- F; W% w  K- [McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! ]& N/ J) _2 w9 \) d+ {% K0x00, 0xFF);; v- W6 S) i% m* M+ R
/ f( T4 A1 J6 i6 e. H  H4 q
/* Enable synchronization of RX and TX sections */
2 C  O+ |( Z  V7 w1 EMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
* T; q  F4 m. ~' j6 Y. c) h4 HMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! p+ K, F( _( L" g8 i* U
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
# I  J' s: m0 t2 e) ]** Set the serializers, Currently only one serializer is set as+ |3 V1 A7 M% x% Z! x
** transmitter and one serializer as receiver.- n/ U8 ]0 d& Y/ C4 q* f
*/
6 V$ U+ ~0 H6 r, d: ^0 qMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);/ J5 v' {) ^% _* i2 A5 F
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
* P) `8 M; e0 l6 o** Configure the McASP pins 0 Y) y6 d# q0 c) S7 s. M; X% t& I3 C
** Input - Frame Sync, Clock and Serializer Rx
5 H6 i/ _3 a0 ]; z5 M9 y, I** Output - Serializer Tx is connected to the input of the codec
, m' g( t. r0 D2 B5 }4 a*/
- A+ T. f0 w9 aMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. t6 ~/ y+ j- _. ]McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));+ b3 ^* o. v! Q! [" o" W
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
+ }( N$ j. {5 C% }| MCASP_PIN_ACLKX9 w" i. F2 @  E+ k; x0 I1 x# z
| MCASP_PIN_AHCLKX* O) n2 |8 S* {- o% J
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */; H2 l! Y! K4 X$ F& _" g, P/ Q  V
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ @. B+ [: U% _3 J, i$ \+ \| MCASP_TX_CLKFAIL
  O4 B/ }/ {1 r' Y  U| MCASP_TX_SYNCERROR
; f$ g0 o4 K: v! I1 n& t| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * _# J% G: D6 o$ r
| MCASP_RX_CLKFAIL
" B; G) d1 Y7 X$ ^7 c| MCASP_RX_SYNCERROR
% E. ^4 }2 J2 \7 l3 n, o- h| MCASP_RX_OVERRUN);
' u2 [5 p2 x' K* Z}
static void I2SDataTxRxActivate(void)
- A7 f5 _6 }, |: y5 i: k1 {{% C! i. A7 U" [3 r
/* Start the clocks */
" V' o3 k2 v/ y. FMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ u7 ^1 e4 t1 j, r& O& W" CMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer *// ?" Y, q* ^8 V
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 D$ e7 ~2 n, T5 }. U/ }
EDMA3_TRIG_MODE_EVENT);
" _2 E0 X9 e% R" O2 cEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, H: J/ L. M! hEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */3 y6 S5 j9 P6 k2 W; h1 y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! F0 B; d8 C- h4 s) i" OMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
' r% m% {  k- kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
3 U. u. q) g+ G. BMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: q: S6 O; f% j- xMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 i( H" N! U2 e3 ~, r6 v
}

1 e& Q& @2 \+ f( A& y. ^
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 M9 }' I* U1 q' t





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