嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,$ s2 F9 H$ m  P: O% ?2 i
input mcasp_ahclkx,5 v4 j* a. \* W8 Z- O* Q) f
input mcasp_aclkx,$ y+ a) V% g- w8 E
input axr0,) G! h9 D- V% x( ?

$ @; p5 Q" e$ }" O8 Y3 Uoutput mcasp_afsr,( O  L/ R0 N) @( y
output mcasp_ahclkr,
+ X& [! k7 s0 X% M9 p: D/ F6 ooutput mcasp_aclkr,
# F; @, w% g6 n& Toutput axr1,3 S( D; O( ~9 u( u9 {, \
assign mcasp_afsr = mcasp_afsx;0 S) f$ l/ w. N" `0 o( d7 w: O4 m3 w( |
assign mcasp_aclkr = mcasp_aclkx;
0 b, t  x- M$ R! }( f* c9 Zassign mcasp_ahclkr = mcasp_ahclkx;
' f. p" C, b. A+ r; _3 j# {assign axr1 = axr0;

. v5 G- W. [1 S8 s- X, W9 S# u! E/ {5 u- y  p$ @; E# _2 X! S
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) s  L8 v. j; Q. @( s( e
static void McASPI2SConfigure(void)8 {0 {; A0 ?' t2 d, o
{6 H0 T$ K( H  H, s% d& ]; G
McASPRxReset(SOC_MCASP_0_CTRL_REGS);% k$ `9 X5 I2 g+ q% d  {. Q) R8 {2 \
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
+ T& {$ ?/ b& [: x) E1 GMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
: {" M6 }+ U' |) ?; OMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
4 b! l" Y# q: y, X5 F: wMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ n$ q  h5 p  x. r' ~. F; KMCASP_RX_MODE_DMA);
' s3 a% p4 L0 q4 }9 BMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 U# p9 k" L, y. P! {! hMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 n; X; T$ U% s% F+ ]McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,   }( c9 M* W# D1 {
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 `8 t( y7 ?- s2 u6 w- g$ PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " s3 y& C8 S, k7 w& m: y8 P
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
4 L3 m* _9 t) W: bMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" R  B2 b2 w+ @8 Y  d) _. P
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
: z# z% G! `& @! {- z4 H$ iMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. b) T. q* \$ p9 H1 r0x00, 0xFF);
/* configure the clock for transmitter */) x) j& m' G+ y1 G5 m+ q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: R% f. Q- X! q# xMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # F  O! n! F, ]6 h5 |0 k
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: q% w& `+ n( ?% Q: k0 u* M0x00, 0xFF);0 i$ }5 M8 l- D0 Y/ K
% r  `: G9 Y, H; B9 F
/* Enable synchronization of RX and TX sections */ 7 E. l1 k. ?" \4 y- d$ ^4 [- N
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ l+ P5 t% O3 s1 @2 y, iMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 z! `- M. U% J9 w8 Q3 H, x" iMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*% n! v7 b9 X4 B2 z* N% i- V1 J
** Set the serializers, Currently only one serializer is set as0 D- W+ P4 B+ a* \- p
** transmitter and one serializer as receiver.
3 @: {7 Q- s) k0 h$ ]% g*/& B1 v/ F! [" h# X( r. D8 f
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# k! T& ?2 r! p/ P
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*1 j6 B' m# n+ D0 F3 d# J
** Configure the McASP pins
1 Q0 D; J- L# }/ n** Input - Frame Sync, Clock and Serializer Rx
! I: b6 _& L" [$ _, B/ B8 x** Output - Serializer Tx is connected to the input of the codec
5 u5 h1 T. c8 E' F. e*/1 }+ Z5 ]. F9 v
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! s) u# b' T; G% [4 w+ O# {McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ P. T3 n/ R! TMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, k6 x! _0 A. R" I
| MCASP_PIN_ACLKX
; k' q# h3 c$ e. S$ q, y) S| MCASP_PIN_AHCLKX/ Z- M/ j6 @* g; W" @/ J, {
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */4 n& t) W1 r  }/ u" Z# d3 N! {# s9 g
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
7 t: M* |2 |- J4 K0 p$ e| MCASP_TX_CLKFAIL 9 A7 }7 z9 K' Y; |7 @, m. r7 \
| MCASP_TX_SYNCERROR
$ S5 C/ ^$ g8 ]' ^( W' ^| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! }, a& b9 B0 E/ b+ t) L
| MCASP_RX_CLKFAIL
& \+ h' n2 \( _8 ?| MCASP_RX_SYNCERROR
/ Q) L4 X  k! W' J# n; M| MCASP_RX_OVERRUN);
4 E7 q% o& `( V/ j5 h) E: {  H}
static void I2SDataTxRxActivate(void)5 q. H0 }6 k9 P/ z& P
{
+ s+ R9 H3 r6 B8 W# G& W% F, V/* Start the clocks */( p1 |2 `+ J2 a
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
1 F# Q& L3 D6 b+ ]/ ~" Q5 Y1 QMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
& K2 j2 x( |# ?3 a2 M4 eEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
+ I4 E2 X' u( \5 l7 UEDMA3_TRIG_MODE_EVENT);
" H; e7 i2 ?2 Z% [EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% d3 X  t0 J; w* |9 r7 jEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */2 x  G( O( l# m9 Q; P8 Z" o+ g3 t
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. y- [" L5 a+ q
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
& t7 Z) J; O" H1 A; \$ ?0 qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */2 a- a$ j5 w5 _8 Z, s( T$ x0 W
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);( z) F8 \. p' ^% Y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);% s6 i. \3 U) Q2 B+ L  I- W
}
# B$ _* ]" L- }/ q; @) l
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

- i" K" L) K! p2 o




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