嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
5 f) C3 t9 j* V4 S! F4 cinput mcasp_ahclkx,
7 E7 j+ |8 U; minput mcasp_aclkx,4 |! z2 m$ b, [
input axr0,
S. f* P% _" \2 A4 R m4 `; h
. B& a: M' M2 P0 F" E6 h5 Z( Zoutput mcasp_afsr,6 t$ O9 E- N$ G
output mcasp_ahclkr,
0 h2 P {' R2 I- Q# T& Houtput mcasp_aclkr,
/ x( Z' G& S. y& y2 t' koutput axr1,
# @+ s. ?- b5 s9 r7 C
assign mcasp_afsr = mcasp_afsx;) |5 k3 v0 t" @! } l( j
assign mcasp_aclkr = mcasp_aclkx;5 r2 I+ T7 Q% I' o- y/ _' u/ G2 p
assign mcasp_ahclkr = mcasp_ahclkx;0 o- _# L! M4 {9 D. \) s& N
assign axr1 = axr0;
% P0 b+ j9 I. t+ ^2 C$ q( Y Y
1 `: J6 q4 C) h4 L7 d. `
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. O, K" `. |# k% ?% m
static void McASPI2SConfigure(void)
3 o1 r) O' ?0 c7 \6 S{
+ {0 n% A: h3 ]6 P/ s8 aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
( F) T# U5 b& W4 x& q: xMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
3 T3 k- S) F5 j0 c/ c$ j' uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* D7 B9 R1 x2 G: B$ pMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
* X5 I3 t, O. Q8 B! r6 [* l9 V& UMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* o8 _+ O/ x# `4 x& XMCASP_RX_MODE_DMA);" F" v+ i6 [. I4 T. A' O, W
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# D# H4 O4 B5 O0 p6 }
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" A! y( O2 U1 r" ~9 w% W1 HMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! N- n0 ?5 }: x5 O4 qMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); l: i8 e! r. j- g4 M
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . U+ M" G" ^5 g9 u" g$ v! \; X' H
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */$ M( q, `& H! ?+ Z9 j3 }# l6 G
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);: w% M6 z- N9 h& F2 k
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ D8 `2 ~: t2 oMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 a# D7 E6 c4 H7 p0x00, 0xFF);
/* configure the clock for transmitter */+ g' Y6 V2 e& L% U4 v7 C
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);3 J+ R' a2 `7 y. g7 [! Y* p
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); , S! Z; h1 X; D V0 c' _
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ _. k' a! J+ L- k0 \0x00, 0xFF);6 h, u/ Z7 U/ ^# u
1 p* Z. |! z. x# c
/* Enable synchronization of RX and TX sections */
2 s4 a$ Y" }7 H6 C7 zMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */! @2 `& l$ P. c% n6 @( J) X
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ W8 L/ n' W! P& O
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*& r& L" Z0 Z! i
** Set the serializers, Currently only one serializer is set as
) ]* k4 s2 ^4 o. ?! \, W a** transmitter and one serializer as receiver.
" J0 q3 n: K) H j" w1 g*/# |/ j/ a. r/ f( \, K% n. @/ U
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. f4 U. ^9 r/ w6 b. z* n- i
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*5 c1 J4 ], g) u( a _. |2 L$ L
** Configure the McASP pins
1 L j6 }+ ~0 V** Input - Frame Sync, Clock and Serializer Rx3 b/ _! X' s. a! D5 T* O8 W0 e2 P# ^
** Output - Serializer Tx is connected to the input of the codec
4 T# k8 Z( t* q*/ `' B% @5 P) C: w! \3 |
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);9 y8 R$ a! U: o
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 i5 {1 }+ X, ^3 I: O
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& Z) B3 t5 P" p4 u( T3 x9 z# k. h| MCASP_PIN_ACLKX# W5 e+ y- P' |7 k6 m7 L' v
| MCASP_PIN_AHCLKX. j- r9 l M& g4 }
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */% r5 M6 Y. T8 n1 J. X
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & c6 n2 z4 O) {* S" m9 ]
| MCASP_TX_CLKFAIL
% O8 P0 }* t! ]0 ?& b' I# L, Y. y; K| MCASP_TX_SYNCERROR& s. T% A9 f3 @; f) ^
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ h" V3 c7 g. q+ f0 x| MCASP_RX_CLKFAIL
5 t+ `# v# f, q. @5 l| MCASP_RX_SYNCERROR + C2 A7 Z4 k/ ?, o g' p% v5 V
| MCASP_RX_OVERRUN);: n) z/ i" R: g
}
static void I2SDataTxRxActivate(void)' S: D' Q* k0 x' H
{* V# t3 r) ]8 a; y
/* Start the clocks */' \ V, e) T/ f8 B, r' _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ H7 y0 e; i. ~+ K
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */+ T$ y- V' q6 U9 f8 O A/ ]4 D
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,. `; L: h% F$ G! D, i5 `; |
EDMA3_TRIG_MODE_EVENT);) x' v k! ^5 ~# F$ [/ u
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) r- Z! ^6 G6 { X4 o5 q6 Q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
3 B* Q7 v" x& F" BMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
$ l3 g. ^% @% X/ D% i* \McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */) y O- h5 V/ S4 ~
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
+ Q9 G& p* _: p' X. O! d3 C, P2 SMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 z. ?, z* ^& J7 C
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( c. d. m f# I9 O/ c6 O6 Y}
2 U- m7 R5 I% X* B1 a9 \% k( K
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 p3 U: c& F% D/ i5 V
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |