嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,1 n$ S$ q. T" N0 u1 j, P: i
input mcasp_ahclkx,
/ F: m H* r5 ^4 `) N. Sinput mcasp_aclkx,
- B5 `1 M! U V7 C d7 a5 V& T) einput axr0,2 u, M0 `. @9 a1 Z
c* }6 Y; v u' S e c% ]output mcasp_afsr,
2 E6 t0 D( p% t( \output mcasp_ahclkr,
6 X1 v) F: a! ~6 ?! e0 ]8 A. U. Eoutput mcasp_aclkr,
8 e. A# b: a/ v! p* z* n7 q5 N$ G: }output axr1,& W+ v' A, u6 l" I3 B/ c) _
assign mcasp_afsr = mcasp_afsx;2 a4 T Q* r) Z1 O$ @
assign mcasp_aclkr = mcasp_aclkx;
' w6 E/ ?7 P3 x' C+ Eassign mcasp_ahclkr = mcasp_ahclkx;
. r. D) \9 u. Y% J0 S3 massign axr1 = axr0;
: P: W! [ \* ?3 }
. O6 I U( q1 c在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 b1 |6 d+ r8 ~5 H+ _
static void McASPI2SConfigure(void)
3 ?: |* a- X! N7 M{
' a' d6 h8 f# ]" @" ]5 x% D9 K1 TMcASPRxReset(SOC_MCASP_0_CTRL_REGS);& {! y& [/ M; ~
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer *// @6 t$ M+ t3 J' }0 J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: m h3 J* q9 {( y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
" i- G+ Q- o3 w2 ^McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- G4 F( E C4 b) `
MCASP_RX_MODE_DMA);
, S; C& C- P6 w8 R. G; _: a& QMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 p- c( |$ w; L1 ], j, W1 M a- c$ x4 P
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */# E# E% M: [ h' Y* _! e
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * a. t" m+ h! u& z8 k- Z
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);) G( Z, S! Q* J; u; d, c3 H7 x! H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. x& S- c! S( A$ Q4 W: SMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */: H8 S/ a* i& B
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) b% C. y4 n0 a9 Q5 M) q0 nMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 F& f6 [5 i/ X$ g5 K0 r
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 b* B& r9 F# l% {8 \0x00, 0xFF);
/* configure the clock for transmitter */% L" l! K! g! l! i7 T7 L: }
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; e+ Z2 b7 G6 x2 Y7 tMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
3 E7 _& Q3 q% ]+ d) j( DMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
! {- j8 m2 z. r1 W" ~" z: p; D; t: t0x00, 0xFF);0 Q9 t( C, ^3 r$ f+ ?
- A- r: `1 y3 D% f
/* Enable synchronization of RX and TX sections */
- F; a1 \; a( o7 Q$ T" CMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */; J8 f2 f0 Z* W& }$ k* Y4 b
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);, d1 k' x# Q% Y V' h) X1 c/ o
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
; A' |, O' t! x& P** Set the serializers, Currently only one serializer is set as
4 ]$ O& q; @ _$ z** transmitter and one serializer as receiver.; V. _1 ]0 r+ z% r, E. o* g# `) `: a4 Q
*/) ]$ m3 v/ h _- p$ e
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 Q! i* D6 t) l+ }* ZMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*' Y5 K& ~7 p$ w2 h% H
** Configure the McASP pins
! s7 X- D/ j3 I% m- M. Z! y** Input - Frame Sync, Clock and Serializer Rx
7 d8 \4 X$ O$ G F** Output - Serializer Tx is connected to the input of the codec % G* s* {* ?! H [
*/
) {9 W8 Y P \) Y/ y5 h6 a. GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
r) N, F0 p* wMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. C2 x3 W: @3 G& wMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
' I- i/ I9 M; F' B* v7 H# j| MCASP_PIN_ACLKX- t: a, F+ N+ v
| MCASP_PIN_AHCLKX
9 c0 ^: \7 V4 d) M| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
# g- J. h1 S! c+ @- s( VMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
* m. ?! i5 y0 m f+ H| MCASP_TX_CLKFAIL 5 v9 r! x# k J- e" D0 \ f0 D
| MCASP_TX_SYNCERROR
. n0 B: j( D! b8 A4 E| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: Y( W" A1 m- v. A- z| MCASP_RX_CLKFAIL# o5 ^* h5 s6 |( j
| MCASP_RX_SYNCERROR
0 V4 }, y3 i, H, B) K+ }| MCASP_RX_OVERRUN);4 K) C' g& I: _8 R/ ]3 Y: U
}
static void I2SDataTxRxActivate(void)3 b$ r, F* c. t( d- _
{
/ I2 e; T4 |6 [( q; P/* Start the clocks */
, J+ N2 L1 `0 ~6 qMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 v! A& C8 L7 b$ O- ?
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */8 n4 h2 p( m$ _% e; `- Z* ^. {( Z. C, X5 z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 z7 Q( q s' c1 I9 @! b7 H
EDMA3_TRIG_MODE_EVENT);$ `5 }: ^% }( F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 z$ W. S3 B) P( i
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */1 w1 O1 N3 s0 D- D! }1 n2 C
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);7 N2 \9 A7 d X: ?" w
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
" S3 T# Q n+ B% mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */# J1 R1 b5 C- P- G
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);" ?( F1 [2 w6 o1 D
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);& u. d- j$ u8 @8 Z( ]1 ^+ z
}
- `/ W! S$ t! b请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% ~% ~3 X4 p7 O( N; `
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |