嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,' ]& J% D6 ^) F" b+ [* U1 q" |* _9 E
input mcasp_ahclkx,
+ {) z1 _2 H0 uinput mcasp_aclkx,
2 T/ P. l: t3 W: [) Q  }0 oinput axr0,
: P9 C2 |$ X! F2 `3 t* f. r3 I5 U' j, h2 ]# R
output mcasp_afsr,
7 i0 R! f# v+ z; Y1 Z8 K, M0 i9 `7 U% I1 \output mcasp_ahclkr,
- W$ L+ U7 t7 F& r% }: J; {  Q% C4 Doutput mcasp_aclkr,4 G( m+ d; K8 P" h2 s) L
output axr1,
& T6 e! ~& }) q9 T4 U8 J7 c
assign mcasp_afsr = mcasp_afsx;6 u8 w: u1 ]8 U
assign mcasp_aclkr = mcasp_aclkx;
+ T8 K6 S8 z* L6 v' }# Yassign mcasp_ahclkr = mcasp_ahclkx;
5 e+ c" ^  y& k3 l# @% [( @' Eassign axr1 = axr0;
4 U7 W. |, ?) p: X, Q
3 J9 v. Q6 \9 e
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

1 w4 A7 R/ ^: t9 D7 @4 D
static void McASPI2SConfigure(void)
8 R- L/ b7 Q3 ^7 Y7 z{
5 ~2 K' I, {* iMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
- w) a% e2 f; y9 nMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
# [! p4 `+ ^% e& u* m' vMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 `! _$ p: Y: e4 {- GMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
8 b% s% ~! S) `# }! y/ d2 B( MMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,5 I9 n! L8 n' H. C# K& p
MCASP_RX_MODE_DMA);
7 N3 ?" F/ L8 |' t% N4 d  PMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- R6 H( F4 a3 Q% Y
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 B% P3 d% _4 U" q% K- L8 qMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " ~9 ]& B( C1 n
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);# o) I" K7 B3 i+ V* x0 D
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % e, ~) _# W2 `" B! h9 _# [
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
: u8 ], Y- m' Q* h) xMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
5 u# n8 @, P9 P5 LMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
6 L) ^1 [% I: U$ v6 V3 b! y6 ~5 YMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 N$ T+ u7 C7 M6 T- K" p- M0x00, 0xFF);
/* configure the clock for transmitter */
' o) ^- O6 ]1 i2 W. M- {McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
9 d( d  w3 Y- d4 F0 |3 F- D! uMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); * t* y, W9 _, v$ d
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- [! J' }/ c- B: b8 y" U0x00, 0xFF);: B; a( u( s+ N* W
8 J- u  i) l/ }1 q7 z* T* b! L
/* Enable synchronization of RX and TX sections */ 9 X4 T4 D7 |7 W) a1 |! I
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */$ i! F! g& I# L0 I1 ~! p& Q2 x
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);& f- d5 f, y, l# A0 q' Q
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*) g% I+ H* S0 ]7 r: _8 |8 I- z3 _, b
** Set the serializers, Currently only one serializer is set as
% J: A6 u/ d* G' p+ T** transmitter and one serializer as receiver.
+ k, S0 s; H+ \% }4 D! C8 F*// @  `9 `- v* n
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) S4 l) \5 m  z
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*" _* {2 t! a- `4 s$ }' d
** Configure the McASP pins
/ ~, \; w, h. l2 n" R+ `) p** Input - Frame Sync, Clock and Serializer Rx
1 K8 j4 L8 I4 F) W7 D) K- Z** Output - Serializer Tx is connected to the input of the codec
/ a; b! o" d- @% _- j8 c3 p" Z*/9 u7 L( w! O; c7 B4 j  e
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);; H- h, S( B5 J: T" g6 I" [, p
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 l. N. p# V9 F8 a' N4 {8 a/ E1 KMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 \7 z. p3 ]6 Z0 t3 x: ]| MCASP_PIN_ACLKX
$ Y, G* W0 k' B8 h4 X" n| MCASP_PIN_AHCLKX9 J& p/ ^) d% M  B. K# S
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */4 F2 b. C* e  V2 ]" o6 E
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , k9 T7 e; P- L; E! ]
| MCASP_TX_CLKFAIL , f, B& I+ u  n" `3 Z
| MCASP_TX_SYNCERROR
& P; B* `6 e7 ~. t( Q. x# _) t* E| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 ?$ Q6 H. ?/ G4 U! Y
| MCASP_RX_CLKFAIL
# n; c* x- g% G! q" f1 F6 ^| MCASP_RX_SYNCERROR
0 I5 ?: ]9 l, L9 M- l- S| MCASP_RX_OVERRUN);8 Y: a& r& b& y
}
static void I2SDataTxRxActivate(void)4 f( S2 o1 j1 L
{
: _: C' v# A% d4 Q/* Start the clocks */8 a( ~0 b6 `) V0 L
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);  w- `7 @6 f0 ]* x2 m; H
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
" d. [5 ~( n5 `5 v* y, S/ E+ ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# Q7 j! K9 q( C  B5 r3 IEDMA3_TRIG_MODE_EVENT);
$ P! D0 u9 |, G2 v! uEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 f( e  o0 T' B. `6 S8 c( w, ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */- U9 C7 U( u. W6 r, n  O
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: f% q. `+ Z$ x* n% G8 q9 f; KMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */3 Z# g/ T7 V/ q1 A6 _# Y
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */4 V3 v- q: {7 `/ j' r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: N4 c8 _7 `2 L, z$ k: J- W3 T8 vMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 I9 l) I4 O  F; o7 \# N  j
}
; c" ~. ?; M, d8 Y% o( y
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, B9 z. i6 `' ^- U





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4