嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
' y. K6 W: J6 ?1 E6 ]* `# |input mcasp_ahclkx,
, _; }4 g, d/ r0 g1 m; Ninput mcasp_aclkx,6 r' v6 u/ c' ]4 s
input axr0,
$ v% P" ^+ w& M9 k& q2 r: f3 Q
output mcasp_afsr,
! q( ^) f2 c3 A" foutput mcasp_ahclkr," y5 N8 \. j7 `; h5 O& V
output mcasp_aclkr,3 C9 @+ g' h1 q" t w
output axr1,& s/ }% O7 e8 M) P: i. E
assign mcasp_afsr = mcasp_afsx;8 [3 v. a, M/ [; p+ G# j
assign mcasp_aclkr = mcasp_aclkx;
. y C% }) G& o/ S ^2 y# Uassign mcasp_ahclkr = mcasp_ahclkx;
. ]- N' P: t* @* L. h; |8 ~assign axr1 = axr0;
8 o7 o: _6 S; j5 H/ [) k
0 i! W+ X9 ~" F# T$ s在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 x2 Z9 J% O9 C- \5 X6 ^; E
static void McASPI2SConfigure(void)5 R* D M% u( v J5 p
{7 Z) F& L f5 @4 e+ K' Q+ D. s& r
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
& W% L4 g7 t- l; y- z) k$ i5 t' GMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */- Z+ j% l7 ]& ?- n
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; `0 X+ G8 ~5 @" v$ x' q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */0 @6 @6 {3 {( ?& d( P( I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ `1 y/ G' a M2 o! v$ [0 O/ ]MCASP_RX_MODE_DMA);5 U6 C# j) C5 S" z- E: x, E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 ~3 K9 Z J/ l4 pMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ Q* U+ ` n3 ~5 J$ x
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- M0 x* y, u' rMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 C1 L$ x: r% A4 B4 a0 N& ~. I w& G
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
8 E: l# P2 B# l9 [MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */2 r2 ^. H% y: A2 K
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
5 u3 o% ?, \1 W! T3 D& r) ^9 r) uMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# p5 h) p, F8 T8 g; Y9 RMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# J1 q# P, e# y$ J
0x00, 0xFF);
/* configure the clock for transmitter */! G( @9 D3 g+ c' ?! d- T
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; T" G3 m# k" x7 _" a. }McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( g* s, U& n9 u& U
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,! C e6 k, m$ A/ V. ~
0x00, 0xFF);
6 [ w1 I" _1 c: D/ ]3 _* ^4 T% W+ N3 o- V( U+ L
/* Enable synchronization of RX and TX sections */
2 M0 V! _& ~* s" X# w, wMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
9 {( p# ]0 V8 r5 v* vMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);- n3 Q+ E& ~. q8 w
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
$ }9 d. `0 E3 F8 y** Set the serializers, Currently only one serializer is set as+ K: V; }; S" m1 R) j: A8 j( i: B
** transmitter and one serializer as receiver./ r* n4 c: {, T, T8 W; M, i" V
*/
% z7 a0 U% Q1 L! z5 w- xMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
4 J0 h8 v4 K# z8 l; ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
: C y( x8 ?3 V& h: M** Configure the McASP pins
; B1 d# Q {8 L) z$ D0 C" k! J |** Input - Frame Sync, Clock and Serializer Rx
$ W C+ g% T, e, ~** Output - Serializer Tx is connected to the input of the codec
5 G1 R' S: E. ~; v*/! z- t: O' H& T* } `2 j
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. Z Q) O: ]6 @8 ~. H' B7 b+ P, _McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 x1 ]) J4 D; ?: B) B
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
m2 i; y- I, x7 R| MCASP_PIN_ACLKX+ U# P/ e5 }& ^, g. R. d! e2 n P5 R
| MCASP_PIN_AHCLKX }7 G" n2 Y( X; T
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */7 }6 a8 G: s" d# ^+ w$ p
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 w, B$ ^* e! W; F
| MCASP_TX_CLKFAIL
( f. Z% E+ Z( C' F* s, b: u, U| MCASP_TX_SYNCERROR& ?3 J8 F9 W f" g' L Y1 W
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . W: }' V! O- a% R
| MCASP_RX_CLKFAIL& |9 ~6 g. k5 f: x6 ^) e8 ~
| MCASP_RX_SYNCERROR
5 Q& x2 T- K6 u| MCASP_RX_OVERRUN);, R/ J6 z& c+ g. ^: o/ G4 @
}
static void I2SDataTxRxActivate(void)- B: H! S& l* s- S) f) J+ l! z) n
{+ {( n% H) F$ ~$ K% h7 Z
/* Start the clocks */7 \# v5 d* ?5 o: Q9 i, H
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);* O- H0 j/ {. z, r/ g; V
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */- ?! S* C. G+ a: U; q' f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) N) j5 Q$ r0 u+ xEDMA3_TRIG_MODE_EVENT);
4 ^# i& M X5 G0 W- k0 I$ iEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, % c) |+ ]5 ?* F, M/ h" e2 O
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
?, {$ W8 }$ M+ q6 W$ X+ ]McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( T1 j* y* Y W/ j2 x3 wMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
( ]$ Y9 ]4 O4 \4 Wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. U- R& F+ Y3 }' Z2 aMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
0 s# k- f) t/ s6 b* r3 h0 sMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 N# y0 S! A; w1 c5 {
}
. S/ w) J5 c0 d( f/ n% x请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, e; J, l. t# c1 E7 \- _9 e
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |