嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
) Y- F) V* C+ `3 X& j/ J$ O4 ^input mcasp_ahclkx,' {& k4 W, Z* R6 |7 M6 {
input mcasp_aclkx,
9 T, d, ?0 c0 d5 Q) Yinput axr0,
, `# k) K" [- S* S; x+ q) T, Z3 ]8 k* _
output mcasp_afsr,
0 X) T1 z) i8 m. e6 coutput mcasp_ahclkr,
2 g7 x/ D3 }# B% L& woutput mcasp_aclkr,
E1 P8 E. D- ?4 Foutput axr1,
# p A9 Z6 v: q; G' _
assign mcasp_afsr = mcasp_afsx;! d% g) h% k; P6 m: I
assign mcasp_aclkr = mcasp_aclkx;
2 n# T; M; u7 [9 B, w1 {assign mcasp_ahclkr = mcasp_ahclkx;
, M- L0 S: A0 ]- J+ f7 Cassign axr1 = axr0;
) j0 Y" i; {0 t! a
D4 \, z! P+ \( i+ M6 J在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
! x" l/ h8 A% b- y; ?( b" ]" b( E
static void McASPI2SConfigure(void)
& Q' v% Z0 T/ B) e3 i{' G4 H. g; S; H6 j! u
McASPRxReset(SOC_MCASP_0_CTRL_REGS);$ B) Z* `' S n3 z- T3 q! S
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
9 G: R+ C& m& s; a" |) s. w) dMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);% T1 T% X5 A0 x( l
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */( [# R; a4 b+ T( m" t: o# H( T
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
n2 G- A+ f7 z! y' PMCASP_RX_MODE_DMA);
) D/ O6 @# v4 s4 iMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,% }! v$ {: o2 R% `1 n/ G/ N
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
}. J/ y' v( N: W* ~McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- ~ |8 Y7 T# _6 O2 q! MMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 V2 Z R* L' K# w' h1 r- ^/ Y! N
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! t; r5 t' N" k, v$ x, r% }
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
! W) ]5 ]& M' K2 k) LMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);' B G% E* s0 j! n
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 P" A9 b3 {8 V7 i% \, ~1 gMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ s$ l; P# E! J% X
0x00, 0xFF);
/* configure the clock for transmitter */
+ [+ j( v$ u+ x# wMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
3 k' g2 Z' p. T- o6 R/ bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 I4 J/ Y5 o" I! F% v( t" W0 R
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ @5 ~# s* s2 i$ h+ O0x00, 0xFF);
3 r8 W5 c/ q- ^! J2 b+ I0 @4 A: c
. w$ F; O' q' }5 Q5 P8 ?: D4 @% ^( `1 I5 o/* Enable synchronization of RX and TX sections */
, ] ^) }9 `! A4 sMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots *// r6 C9 ^6 V: Q% N
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( U( ^& s1 O1 a. D- v5 h* w
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
% v' w# C8 l9 ?+ J1 V. E/ i- F** Set the serializers, Currently only one serializer is set as
7 J- f8 }) w4 ~9 V, M3 c** transmitter and one serializer as receiver.+ A J- L, }5 L( v, j: S
*/
1 N! s4 n9 O& g; P6 r8 e {6 yMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( | e( e( S) z+ E% T. T
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*+ C% C1 A' u9 [# @
** Configure the McASP pins
& ^% j8 e9 P. [& W5 C B6 E** Input - Frame Sync, Clock and Serializer Rx! O9 a' w! a I
** Output - Serializer Tx is connected to the input of the codec
1 w0 }% r; z4 j8 X7 O*/
: c0 x5 r- X8 I8 F1 r0 oMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% S; H* A+ r2 z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));8 c* N; Y: ]6 K+ \
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX& h/ c6 \9 k9 v* f; R7 Z; o! V
| MCASP_PIN_ACLKX: {8 U% Q) R+ g9 U, C M- r+ T
| MCASP_PIN_AHCLKX
" w+ ~$ M* [/ @9 J| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */8 ?) `/ b6 m' Q& X% r
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 z O8 U* X! K p M7 n( }+ Z0 C3 f. @
| MCASP_TX_CLKFAIL
( t# ^. g/ C1 b" x) i* w| MCASP_TX_SYNCERROR
: ~4 W. B2 V7 m6 n& _. ~; h. j| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR % F$ A. c+ ]; m2 j) O
| MCASP_RX_CLKFAIL
+ T+ l& h0 Z: }* T7 Q' I6 P' ~| MCASP_RX_SYNCERROR
3 b) I9 N1 \3 s) T| MCASP_RX_OVERRUN);9 [% {4 u3 o; k2 g5 h
}
static void I2SDataTxRxActivate(void)
H5 h" }3 u2 X j" X) G7 I{% J8 W9 P" [& `; X
/* Start the clocks */
$ C( A. A" x' t P$ W0 C* rMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# F' @, v; x3 d' U7 [% w/ a' f8 s/ X
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
- p: v5 R2 @7 gEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
9 h3 O' ~+ r# R: E$ @) H1 C* t; C: nEDMA3_TRIG_MODE_EVENT);
! K; W, G- h& C" H1 v4 qEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& T8 R* N! _9 M* m, j' m2 UEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */: V" T3 X" U- d" Y7 R
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);& s0 v+ C$ G/ [7 u6 V( N
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
8 b6 Z9 `- o' R& F) H, F. i# }while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */0 f1 R" H7 r4 t( e9 d2 P
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ m6 ^2 \9 `8 Q. ~5 F- k% u+ ~McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
( [$ e8 f h2 u" [# y1 a}
* t9 u+ H8 {8 `1 X
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) l$ L1 M" s$ r8 V, D
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |