嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,. T9 a. Q4 f% ]; u$ _6 |
input mcasp_ahclkx,# T5 j& T7 G6 |4 l
input mcasp_aclkx,( ~# _2 b+ j- k2 I1 ?
input axr0,
* ^; j K! z) {" ]0 N
$ \8 }( O; a! R/ V: m4 D' Zoutput mcasp_afsr,
$ u; S+ d+ @1 Z: L4 ^output mcasp_ahclkr,2 N. G I4 i9 o: r+ [" o& x6 |
output mcasp_aclkr,
6 B1 y! Q2 w& ^, ~output axr1,
6 u+ X7 `) D" L5 O
assign mcasp_afsr = mcasp_afsx;
( H0 {/ j3 z9 ?0 a& h, kassign mcasp_aclkr = mcasp_aclkx;/ ^' r( g% ]8 Z
assign mcasp_ahclkr = mcasp_ahclkx;
. P; b" w/ V5 J! Q6 _assign axr1 = axr0;
4 q A+ A1 G$ X' C" e/ C. J3 X- k+ a* U. Y( R1 v2 u' _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
8 i$ S/ I( K' F$ n1 B: j( l0 }$ L
static void McASPI2SConfigure(void)
- B6 @, N* @2 z1 b5 L: X$ h{# ? v% w" r0 G" q$ V
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* L: }2 z! t* ?! V7 _McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* f ^7 R' ~3 w$ L. X! L* |McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* r) ]+ A# c( l9 }& }McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
4 _; [( H u) u6 C; ~/ E% oMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 I* N. U2 X; @ X U2 j9 ]# z9 F
MCASP_RX_MODE_DMA);4 P; B1 s. K2 O$ S
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 _/ p" k; O: r- V$ O6 F- V- n9 D" YMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 h5 l# K( m, {McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, & _" [' ^: l; T: k
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( q8 T' L: W, M" s2 [+ C/ ^" LMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + @# H# i$ u9 z- p
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
6 `- _$ P9 W: Y. P/ k: ]7 \McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ q! r0 F6 ^$ d* |McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
L2 [, T* w$ M5 l1 zMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 ~# R# t5 S( h* o. m! l0x00, 0xFF);
/* configure the clock for transmitter */) o8 D% q4 N1 k( I" D2 J8 V6 t
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
8 T- H/ ?" ~ `1 L0 P. _ D" bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 c3 O/ F# u0 v7 t$ ~" mMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
' g( S" {4 H! q0x00, 0xFF);5 \; f& _* j6 P2 y" w0 ^
/ g7 [. n$ M2 p/ @3 {" E/* Enable synchronization of RX and TX sections */
' r6 }! u% u/ j& m4 L A/ \; L* gMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */+ y Y( `6 s- L% {
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 [% k4 z+ d. C7 j4 s; M- iMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
% [+ l9 l8 t9 N0 f: t# ?( L9 z** Set the serializers, Currently only one serializer is set as$ Z" b' o( B! w5 b8 W7 N& f' A \
** transmitter and one serializer as receiver.3 e2 k; Y" a* ~' c
*/
3 o0 @+ J7 c4 F( t: J6 PMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
# D% i, r) e! p+ @. R* N- EMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
( H; c" i2 G, q! ?- \ D2 L** Configure the McASP pins
4 ]" J$ m/ A( T/ j" X) J** Input - Frame Sync, Clock and Serializer Rx
& u" k+ O- `/ o1 }- @" B** Output - Serializer Tx is connected to the input of the codec
' r4 S/ L Y0 W. T*/9 ]/ Z$ I4 L, m
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
2 p) m2 p9 j) cMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 u4 b* |1 S) ^( ]2 U
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
: s1 s. [0 ~5 b" X$ O( M| MCASP_PIN_ACLKX9 ?7 L; [" r2 ]/ z- k0 s
| MCASP_PIN_AHCLKX
9 \( |# k+ Z6 o8 D) v| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */* F2 {& I; a, A1 F. q4 U5 b6 `# H: |5 K
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 ?6 J" c4 f: H3 `* A( y2 C
| MCASP_TX_CLKFAIL ( h3 y' U- c: ^9 h& K) j
| MCASP_TX_SYNCERROR7 m$ J l9 P% s# W# C4 H
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. x% `* p: h; V% E0 ~| MCASP_RX_CLKFAIL: X( b8 J7 I9 c g1 v K
| MCASP_RX_SYNCERROR
+ Y( o% O9 m" ~8 x% I| MCASP_RX_OVERRUN);5 q% X0 S6 D7 M" x# S
}
static void I2SDataTxRxActivate(void)5 \, I+ [- D0 H% p' x
{
; W% L4 l( `! W# T0 z/* Start the clocks */4 _; w1 A v: e" G x+ t2 B9 d
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
# {; K% w4 l2 L5 B2 ^# JMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
/ _+ G" J9 L& `4 E: W( WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
0 J0 T3 t; |: E7 `% O# ~$ Q7 c4 r0 [EDMA3_TRIG_MODE_EVENT);
% \& ~: R# C. F( `! ^0 ?EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! ^. D: X5 f2 S. l6 L) M
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
2 b( y5 N3 k; i: {. z |0 }- D0 u& NMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! I; N3 H1 \' o- L$ yMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
9 H- N& m' h/ I8 r) r5 q1 J8 rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */. L2 n; H& j7 x$ L& O. {
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' B& Z; ]9 o* }3 T/ L
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
$ G W1 H d1 u% r* z5 w) D8 Y}
1 J- l* R) G; W3 i3 y) {请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 f; T; H- S U# R
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |