嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
- m4 C! Y6 R F: j5 ~! Q7 [- m3 V# Yinput mcasp_ahclkx,6 c: k2 o- q' @' V
input mcasp_aclkx,
1 Y. O! O0 S7 L- Finput axr0,
" P. K) Q: u3 v2 m3 x) u3 V6 Z9 c4 `8 `2 M! F! L0 x& B
output mcasp_afsr,
/ W, `& k3 r" ioutput mcasp_ahclkr,0 [. @( d' Z3 N0 |" y
output mcasp_aclkr,
8 v# S: T+ C2 {2 F+ Routput axr1," j) z' K0 ^5 ]3 I! y+ S& Q
assign mcasp_afsr = mcasp_afsx;# C* A. R& M, H& Y/ }5 A% S2 k6 T
assign mcasp_aclkr = mcasp_aclkx;
# |+ Y0 ?( Q7 N5 C2 q" a+ v: passign mcasp_ahclkr = mcasp_ahclkx;
( Y; Q- i* @1 [, p, J; I8 }% i0 C1 hassign axr1 = axr0;
) {* n$ R7 v9 V; N. _
( Q8 \6 u- n w" b( A在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
5 E ^! h2 I7 M3 Dstatic void McASPI2SConfigure(void)
* n: C1 _! h% X8 T$ d& R9 a% P8 ]{2 k/ C" v, h3 y }, k _- J
McASPRxReset(SOC_MCASP_0_CTRL_REGS);% ], J c4 `2 w
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */* T3 x! r$ d b6 f( \- {- w
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; g( O# e* x4 FMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */, m' U) y; S2 B+ C% k, p9 @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& [! R5 u$ w1 g% P# |" h% TMCASP_RX_MODE_DMA);) E1 D0 m6 G+ }8 R2 z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ u" R/ \9 V5 S) iMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" z# v$ v+ G5 j6 g5 y. bMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
b2 b/ J( ?) C8 W4 M, I. wMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);7 r, x# E* s) ]
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * \3 w, g, W* b. X
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
+ A0 n: ?& R7 E6 tMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 ^- @) i& L0 xMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; |# h4 q- }/ t7 a1 D7 x0 |McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 r# E! u& G/ ^( R. H
0x00, 0xFF);
/* configure the clock for transmitter */; J2 K& i; u$ E4 N6 h1 i2 l5 r& S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ Z/ z9 a- d: k- A
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); # C- s% {; N; i5 o" O
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 M5 C; \0 B& }) g
0x00, 0xFF);
1 c1 k, ~$ q0 x* v" ]/ F# k. i/ g, ^- P/ t I. u' Y4 d8 P
/* Enable synchronization of RX and TX sections */ + M S) v$ {2 J5 @
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 i4 {2 H1 Y3 y, E9 K/ @( m$ p
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
( N6 H1 O6 O! c* t6 Y- O1 LMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
) ? J4 p; U) y' s: r4 b& C** Set the serializers, Currently only one serializer is set as
! s' v4 b) C5 j& ~1 H** transmitter and one serializer as receiver.+ Q) F |+ F, q7 @+ z- r+ |2 Y
*/
3 t' Q+ c9 T: r/ ~4 Q) cMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 _& e# h' v% P% A1 j: `8 F. ]* VMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*: M; H6 H6 _! x( V. i$ r, H
** Configure the McASP pins
/ b) v z2 |! \& t** Input - Frame Sync, Clock and Serializer Rx$ G- g, D5 u! c& _+ t$ }
** Output - Serializer Tx is connected to the input of the codec
7 ~# F& v9 j6 k6 D5 x*/6 C* `9 h" V$ @3 Z3 \* l
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- ?. X: R0 A8 Q9 u$ c% JMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));2 i8 Y0 g4 x' ^8 p& f& p' [! q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' Z( q0 |6 J$ h8 v+ `: q" D& J
| MCASP_PIN_ACLKX2 D: S6 n7 ]; }7 ?. G {% I: E
| MCASP_PIN_AHCLKX; d, I+ n7 Z& |! ?9 M" y
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */* T {/ t- i; e6 q$ o7 L
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 e f" D! A- g) R
| MCASP_TX_CLKFAIL
" m" O' o8 N3 l1 e7 |( ?2 L| MCASP_TX_SYNCERROR
( [2 I+ J+ d* W1 [. G| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . Q' {. Q. d$ @# V1 p5 m! z
| MCASP_RX_CLKFAIL# [ e2 e' o8 T
| MCASP_RX_SYNCERROR 7 @, @/ q% B2 K( b3 I0 J& X
| MCASP_RX_OVERRUN);# S/ B$ r; z6 [4 G, y0 L/ W5 H( Z
}
static void I2SDataTxRxActivate(void)- n# j2 u6 H' s! k& {
{1 A4 R2 r9 y0 d% V# {/ e3 d2 Z: j
/* Start the clocks */. y& s' g4 e9 d, @0 U
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
8 e# v1 E7 {+ f2 C5 Q+ y0 d6 h: e1 AMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
$ |7 } R4 s" B, qEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX," I+ R6 N3 x: f. ]' d
EDMA3_TRIG_MODE_EVENT);5 b% T5 G9 C$ F. j$ ^3 f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
Z) L2 |! H/ g& bEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
! c& k" @' V# R7 u$ V9 q- kMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ u+ I5 `6 W1 \2 T2 _# f" qMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */0 _$ `! e& N+ z D
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */$ y/ C* `8 ^4 J+ e: l
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! L6 p, E6 x) r1 W. ~5 _5 V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
8 y+ u# _5 ~7 `& H}
# v( q) ~2 M# q3 z; y* \4 K请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
9 G% S- I1 E9 F$ O0 z% ^
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |