嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx," m* Q5 d$ P' o( v- `/ R5 Z4 R
input mcasp_ahclkx,: [7 h9 D9 z- L4 Q- p0 i* G- A
input mcasp_aclkx,
! }9 U: v; X: h7 q z- X: L" Cinput axr0,
6 w) D' v, k2 }# ~3 I8 k: z. L7 s; f, \9 E2 U4 H
output mcasp_afsr,
& J* G, L k+ m9 ?( d. eoutput mcasp_ahclkr,* K; `) v7 s1 f/ J: V/ }5 E
output mcasp_aclkr,
2 e6 O$ F3 h& [" s5 F( ^output axr1,+ f2 c& u- _ e$ z% w t! U* p4 V
assign mcasp_afsr = mcasp_afsx;
/ S, w/ u l+ Rassign mcasp_aclkr = mcasp_aclkx;
( O6 e T/ u0 fassign mcasp_ahclkr = mcasp_ahclkx;
" P: A' C' C' V4 x( x0 F Fassign axr1 = axr0;
. ~* ^3 S4 r6 K+ S# Y, J& \$ J6 |1 D5 |. T9 z, W- P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
1 c( B- {# z. O% w' i/ w* xstatic void McASPI2SConfigure(void)
$ g& P6 ? O9 H$ @{' G0 e6 f. l q3 u2 W3 j
McASPRxReset(SOC_MCASP_0_CTRL_REGS);- k0 \/ i# ] x, U; |/ a, o9 F
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
3 C% G$ t- @. _' o: Y8 aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% E) }, \- f! r+ j
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 W# p- q3 F" Y* ~. z' H
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* E! J4 G3 W0 P1 X
MCASP_RX_MODE_DMA);
5 z% w' T K; s5 ^McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 j, H0 u% `" ^8 Y
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */* d( P0 R! m/ x) B% B& {8 j
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 5 O$ Z' @# U$ `( T
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ n! I6 k+ Z( x; T# o! e4 ]McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
: j# I9 x5 |) W9 n: }: I6 uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */+ w, y* O0 B( P% `) b k
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 h% t0 r6 |( ]8 S3 q T4 ?
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 1 T' Z" d9 l9 t/ C" q, O
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ v K& v! `0 U0x00, 0xFF);
/* configure the clock for transmitter *// `& d7 T# c- `8 n, E8 Q/ ?
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 n' m( ]- \+ c9 i8 QMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# l+ }1 p0 ?+ ^McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
; X; p1 Q* _( s# G$ e* X1 F0x00, 0xFF);
; {3 P0 ?, J0 d( d% @: a; J2 J0 ?3 g1 S2 h$ z6 A3 m' V
/* Enable synchronization of RX and TX sections */ - a, p+ H) }7 F0 F$ {5 H! a7 K
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */0 `# t* s- H- P& H# B
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 |2 j7 l6 m1 F% I V1 _McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
# h# L# Z$ V8 \" I8 O** Set the serializers, Currently only one serializer is set as$ l5 H+ v. F5 ~8 h& v
** transmitter and one serializer as receiver.& ?( `6 d) N: K% y0 o
*/8 Y* p- j0 w' N
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);8 e2 b J% K/ p6 R% c
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*5 o; W& Z" G4 ^7 }
** Configure the McASP pins
6 h( e, X/ G% E' ]0 u( `" }; e** Input - Frame Sync, Clock and Serializer Rx
3 W& W! Q4 k, b5 j6 i1 }1 g9 v** Output - Serializer Tx is connected to the input of the codec % o- m* O3 P+ M9 J: K+ d) o
*/- V7 Y# f4 y2 h' P' ?3 o# b
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' y+ x! N. |1 i, w+ y9 S
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! e# ~: L7 H* R4 LMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 _) g2 X9 Z/ z1 c+ T8 h
| MCASP_PIN_ACLKX. r/ S% C4 f9 ~( J, `+ o/ j v
| MCASP_PIN_AHCLKX
. L! G' V# z, q/ @. z| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
. U% @' y4 o* C9 l! o4 {McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # n) E l x8 T# Q( j' H& A
| MCASP_TX_CLKFAIL
) A" m3 ]7 R9 L0 b' `& m5 t| MCASP_TX_SYNCERROR* j% C) X: K) i2 v5 l& J3 |
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 ` D( t" Q$ Z8 b9 w; B4 ?9 ?
| MCASP_RX_CLKFAIL
: B( W; M2 Y$ ~7 p5 b" Y, V| MCASP_RX_SYNCERROR 7 G& W) H, N9 Z/ E2 H9 h
| MCASP_RX_OVERRUN);8 q$ M: A: Z: e* y; l9 e/ y/ f
}
static void I2SDataTxRxActivate(void)) W* G( K: s1 M; Z- @( e6 \
{
: u* { x H! U* J8 x5 d* A+ M/* Start the clocks */
7 e+ g2 |+ p Z. b) ^McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 v/ y, n2 ^ I" ~* |- P9 ]McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
% y: M3 `, D- n/ c! E: A/ eEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 l- ?! _+ i: {
EDMA3_TRIG_MODE_EVENT);
8 I; h/ F" \- g: j% [! ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 B4 R9 r+ P) l+ p) i! y/ Y( E# W
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */1 U: d/ l6 s1 s
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);# L* D0 d# {* k, k7 t; g. p
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero *// _: W9 A* [. p1 Y/ _# a
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */* Q7 w" `; p9 Y9 M5 r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ I+ \: ]5 g& q, c9 a1 U: Q% _McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- }( d$ B3 V. N4 e" _( ^9 `}
1 z X' v4 ]: u+ `6 O6 S
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
! x1 U; H9 p- ?
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |