嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
& k' W) t4 P: U% O; Z: U0 Binput mcasp_ahclkx,' z9 G8 |8 p( d
input mcasp_aclkx,
8 d8 }8 c! ?" U! Cinput axr0,
9 |3 B' C; x! N- p
& s9 e* u. t: ]. N4 K6 _% j0 w4 Zoutput mcasp_afsr,
# b2 U" U6 x- z6 H2 Y( \output mcasp_ahclkr,
8 B' T/ m ?! A9 g, I( p8 Houtput mcasp_aclkr,
/ s3 O" ]* q [( l! j3 t& U7 ?% c( T1 Qoutput axr1,5 l# A% G; E4 g% @3 i- |- ?9 p
assign mcasp_afsr = mcasp_afsx;) {9 I6 C- O9 c1 Y1 L( d- }
assign mcasp_aclkr = mcasp_aclkx;; P6 Y; t3 u, a1 u7 l9 M% f3 y9 {% F
assign mcasp_ahclkr = mcasp_ahclkx;* @$ ^; t6 K4 I- [
assign axr1 = axr0;
" g7 w8 n+ m! g
$ Z/ |' n+ x$ ] \5 u在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
* e2 }. x8 n9 \0 rstatic void McASPI2SConfigure(void)0 t, `9 l& t: B) B# [
{9 _2 I$ D% ]" o- A' a7 G/ [
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
/ ^5 }6 p! X# ~$ |3 w0 R& s' P# CMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
2 t9 L0 i, W+ Q" y( f. zMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
! g3 p1 W( x6 X& k* L0 XMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 Y- F+ T5 j6 S1 s/ m6 I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- g8 }+ Z @. u+ e. k4 i- S% J, s2 C
MCASP_RX_MODE_DMA);
# ~+ ?; P$ {0 l: pMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 U% L) J* C4 {! R) ^0 o9 F9 o
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */: b! a) @- f5 X( [* h# j+ D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
/ F/ p! L9 t+ ]" _MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: F, M3 |* E% c" \1 kMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 8 k1 j+ }8 w" }( B3 D2 k- T
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
+ y, `1 ^' T+ X' U! w( R5 \6 o# U7 LMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" }& ~* }( v4 s# X8 G
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 x" s- _2 \% y$ I, p/ B* G$ vMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. n# N4 C) a; M0x00, 0xFF);
/* configure the clock for transmitter */
1 e+ m9 Z! n; W, \) L# aMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ P) y9 U, a( V3 `9 `5 q9 }McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 O9 ~9 W' @4 _5 m( D9 Q+ M
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
5 U* H5 b+ m/ P3 r0x00, 0xFF);5 F% _- }1 R9 o
0 d; n8 I( A* a
/* Enable synchronization of RX and TX sections */
5 X1 v/ j' {, ^$ x9 a5 x5 UMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */3 F! V9 {# {) k |- G
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- ^- h. B7 v1 O: c0 qMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*; F% l% l u6 _. N* f
** Set the serializers, Currently only one serializer is set as4 U3 _. |1 c P* o' F2 P
** transmitter and one serializer as receiver.1 a$ L& ^1 J, ]; d3 g
*/
K! G7 [0 ?$ e/ l; u4 E- vMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);& U; Q" E# j' O" p9 L' Q( h
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*: ^1 U: |# D/ b7 ~4 Y7 J& u
** Configure the McASP pins
+ N: i5 g- z6 U! z2 o, ~; [** Input - Frame Sync, Clock and Serializer Rx
9 n& h w# L f! A* @3 x** Output - Serializer Tx is connected to the input of the codec
& K; ~% i9 @5 T8 I! }2 k. K' y* N$ j( o*/
5 y) z, a9 a* LMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 J% m0 i) d/ s0 L) S
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% [% B6 i4 a! n D6 WMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX0 W& C. @9 ~7 X$ @& n5 v
| MCASP_PIN_ACLKX
8 r0 c2 H" L6 y. i8 R' l| MCASP_PIN_AHCLKX" C3 n+ r0 O, ]. ^
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */# E j& [$ ^! A: h
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , ?( d& B- n: }4 W6 G
| MCASP_TX_CLKFAIL 0 {$ @# p% d8 z4 L' J3 h% ~
| MCASP_TX_SYNCERROR
; ?2 r& X: V5 T, _) b/ Z( l7 G/ v8 k| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 b; j% B/ T# |3 T3 w
| MCASP_RX_CLKFAIL
/ I X0 Q/ U U7 Q! G% D| MCASP_RX_SYNCERROR 0 P5 r# O' R0 D, O1 R- q
| MCASP_RX_OVERRUN);
) z5 I4 s7 C2 o. N3 r}
static void I2SDataTxRxActivate(void)- l) n4 p" }( G/ e7 h! n
{0 U% r+ v% p* W8 ~' o
/* Start the clocks */
' B; ?1 t4 H5 K7 s; V; J" c+ vMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);' p1 S5 R1 E9 |8 A9 u" D+ n; E
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */6 i3 d/ k6 o8 m2 w4 s% i# @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' K$ e1 c# D5 C9 L% rEDMA3_TRIG_MODE_EVENT);
. q$ ]3 b2 S3 o5 S" QEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 4 N+ ]2 U" `, k( x' l' u
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
' C3 k7 j0 D. p% r2 x. |McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
3 ` S. ~2 N1 H, sMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */. x" A; [ X& p& S1 t" B: G$ m& t
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
" B5 f0 |7 Y, s) H& |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! O; s2 o5 ?7 A2 b5 H* X& ?8 GMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);" `. c7 N# I" D0 R4 G4 y, M1 U
}
+ E1 A1 w( [. ^4 e2 p* D
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& l, W9 N/ h: p9 `# U
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |