嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,/ F4 t7 D8 m& A7 C& I
input mcasp_ahclkx,
# _8 t% }- X! _) f ~input mcasp_aclkx,: c5 M: x9 |+ ]* E% z: z
input axr0,
) k, D4 g9 c+ \7 z' c* F* E1 l& g& T$ D/ F! b2 h
output mcasp_afsr,
5 s; C9 Q! a4 J+ ^( M zoutput mcasp_ahclkr,
) E/ V" m2 @* W4 W, P( F/ n4 U toutput mcasp_aclkr,
4 _( y8 ^- N r& Koutput axr1,
- y" Y* z6 K5 t: t; h
assign mcasp_afsr = mcasp_afsx;
0 I4 C8 M6 P& c) P, Q, U9 R: Zassign mcasp_aclkr = mcasp_aclkx;
+ T+ M2 b; ?+ eassign mcasp_ahclkr = mcasp_ahclkx;' y7 W6 e( b' I
assign axr1 = axr0;
. H* H! _0 Y6 S: A8 H4 _3 g; f# Y0 J1 \. o0 n! F
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
* W. J5 u: T" ~7 G* A3 ]
static void McASPI2SConfigure(void)8 Z* X* c( M# g! ~; A+ {
{6 c, E! J0 N/ l# [. G a; {
McASPRxReset(SOC_MCASP_0_CTRL_REGS);, P/ b% M1 n8 i! j8 b
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
- q' r8 i7 H. p) ]( d a( x& P; eMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# x$ _: }0 }, k0 H" w: J, T
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
! y# n% F' o1 m/ `McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; l+ @% I) Z" j7 o* }2 CMCASP_RX_MODE_DMA);% `% P9 C- ?7 H$ a9 A* \5 p: D
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 k" n" x2 @; }4 Y- K( l0 ~. QMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 _$ V6 c. W9 |
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 a& B3 k& Y' U9 M$ g$ V1 p5 i2 D
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 X- x* M( \! `" t! g8 v1 eMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) E& W8 R& H0 Z+ G9 u
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver *// A8 z- x0 ]& G& _! f7 s# T3 K
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, n* @$ ^4 @# W& DMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
( x1 ]6 o3 K j1 kMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32," E1 ]) N. S/ E, J
0x00, 0xFF);
/* configure the clock for transmitter */
2 ~2 [5 C7 P- m5 W6 DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 _5 w$ n5 D. oMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; z r; ]5 x# s
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ b; ~3 u4 V6 k- M$ ^$ |0x00, 0xFF);( y5 Y: u6 H7 @, e0 K
+ u' n- @ ]; o( C- a/* Enable synchronization of RX and TX sections */
* P5 J+ |. j! k( h' q1 XMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 F' l; x2 x, K( a9 \6 I" JMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
1 b8 }2 W1 y- |( q# p5 {McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
5 x" R$ e p0 m# l, S/ l) }* f: n* ^; D** Set the serializers, Currently only one serializer is set as
, O, L5 d* M( K6 d8 V9 c+ j** transmitter and one serializer as receiver.* A, a# A# _2 Y4 D' ^9 D" R
*/
+ z }7 |- b% G/ Y# g; d5 ZMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 E# \' q5 a# WMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
9 \: c6 `$ S$ {0 K" d3 b** Configure the McASP pins - ^' c1 b. d3 U
** Input - Frame Sync, Clock and Serializer Rx
4 i0 n, \- J6 ?( Z' ~ J9 `0 @/ @** Output - Serializer Tx is connected to the input of the codec 2 I2 B4 o* z3 [" F4 s
*/
7 l8 F$ \; h8 n" cMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( u# P* O! k/ L- G7 f) {- b% g4 yMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 x% x3 x# B7 n8 Y5 v0 YMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 W- s2 r, C( W
| MCASP_PIN_ACLKX" i3 k( [0 r( l7 C2 g, l
| MCASP_PIN_AHCLKX- s) t* T: l* @( n; d, ~
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */) a+ J$ a$ [ m! {: I0 A
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ ^1 u/ B# A5 i| MCASP_TX_CLKFAIL
) ^- h: ]7 S5 {/ z9 D0 ~4 m| MCASP_TX_SYNCERROR5 D: Q, l, P+ m" Z$ j
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR / l* U2 F+ ~/ P
| MCASP_RX_CLKFAIL3 M4 O, e h$ E' X0 y
| MCASP_RX_SYNCERROR
u( S: ?9 r+ } g| MCASP_RX_OVERRUN);$ [6 }: D/ \, L: K
}
static void I2SDataTxRxActivate(void)
/ s2 {8 A$ h6 k; g{+ m4 T: \2 C* ~3 K$ ]
/* Start the clocks */
0 i0 B+ D% u1 c1 @5 ]McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 w" }7 ]$ D5 Z1 e, }
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
1 a( l" t6 D7 ^ \EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
: K2 o0 e w7 cEDMA3_TRIG_MODE_EVENT);
* @$ i' P& ~0 {3 o j6 L% D! |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 S* V! Y7 D0 @1 d$ T9 b
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */8 V( R+ e9 ~5 I" K: D# F; ~
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ q) w: v8 W# w) W/ yMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
2 l' r, I) v2 Y zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */" M# }" }0 _( R5 ^
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 u! r/ s4 A! J' v
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
& o, j8 w6 E$ \1 R}
* H$ i# m) \) H/ P
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& t5 m! i: x2 w% o' o
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |