嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
, F2 d2 Q7 l# w5 O& e5 W8 kinput mcasp_ahclkx,
" z3 [6 l% Q8 _9 M1 U7 Minput mcasp_aclkx,* _0 B. G* S( l$ b& C# O! `; T8 g
input axr0,
) e$ a3 w3 q! |+ `8 O# W' [' x" [; o$ U) b
output mcasp_afsr,
9 L/ n8 I! S3 o# p/ `' Moutput mcasp_ahclkr,
: L9 C7 _( U# Goutput mcasp_aclkr,9 n, ?- q3 E( A" E" @& y Y8 Y: e
output axr1,8 i# e4 a% X( O& a
assign mcasp_afsr = mcasp_afsx;
* \ F; @* D$ E) ?0 D. |assign mcasp_aclkr = mcasp_aclkx;% S8 z7 P' c s; A& s; p
assign mcasp_ahclkr = mcasp_ahclkx;
7 d, p; x' {% K3 a1 c$ gassign axr1 = axr0;
$ Z7 y: `$ O4 ^- w% x& ^4 q6 S3 S* K) s" e# V6 u1 R
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
/ z' T9 N, O. u4 S9 K% \( }( R. o
static void McASPI2SConfigure(void)& j" x% ~1 @3 ?; `' x$ i8 i
{: [( d" K/ a$ R
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
. W" [ A+ j, N7 z1 H, x6 P/ |McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
0 E! E& L7 ?9 T; R( d% G. OMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- @1 u6 _5 b! H6 gMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */# i( j+ f8 e! W& D
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 W/ l; f% m8 ?& H. w
MCASP_RX_MODE_DMA);
5 ]5 R* o# s: z6 o1 wMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" ~& `# d. p0 [MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */+ \' d/ s1 O- d* F# v/ {
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 o- r9 \# h3 H9 v/ ZMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
5 x: J3 z2 I" \McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
6 o6 H9 L0 ?- D2 v0 K% g0 J9 @2 lMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */2 Y- a$ f* o: d0 T
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# Y# i, e. r0 i. K: ]4 \3 \
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
O% y5 N8 I/ O; e. V2 WMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
+ ]8 s1 h3 G" K- e" J0x00, 0xFF);
/* configure the clock for transmitter */
+ F; F Y h6 O4 r7 K% I% j; \8 D4 lMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 b8 Z% a& u- N1 s+ X/ OMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
8 h3 P/ f& N) A7 q9 B" O2 qMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
z6 Z& s$ k# E4 d0x00, 0xFF);( @9 }8 m/ X0 Z, q5 M
9 |% j8 T0 o- R) j$ G3 I6 H
/* Enable synchronization of RX and TX sections */ " b* ^% B, k, `( z! A/ `2 W' E
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */, N" V) S. Q5 ]- b+ [
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' a6 H: U# W! E$ @' WMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
+ A$ V/ ]% h7 g, E** Set the serializers, Currently only one serializer is set as
& U9 C3 }0 }$ x** transmitter and one serializer as receiver.1 W, X3 ^8 z& B$ r$ h' u! i
*/2 ^; s* }1 g2 @) k% Z4 y4 d: N
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& a5 g3 c: o" O$ j# y yMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
8 s( P, h+ D. k% J** Configure the McASP pins & @$ P2 M" x1 W
** Input - Frame Sync, Clock and Serializer Rx# U+ I9 A1 w1 l v I
** Output - Serializer Tx is connected to the input of the codec
; _& q( a5 _6 E# R% v8 s*/
; ^1 e3 ^0 j2 P0 H1 y1 KMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);/ R5 y6 F3 l* ?' K8 a, ]0 s* O
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# Y5 m5 \( i7 U% [( ]4 s. n
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' M/ @4 a/ y1 e3 a8 T" d J+ I
| MCASP_PIN_ACLKX
; k; z" v9 \, I| MCASP_PIN_AHCLKX# X8 s7 z7 ~3 C" {9 n- g% [5 X3 y
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */; J% }- ?! f# }& S, f: j
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 4 P2 k! @/ K1 U; S( u, j
| MCASP_TX_CLKFAIL * n U. @9 d5 J% J0 m
| MCASP_TX_SYNCERROR
/ @ L9 O4 H) C1 Y- N7 G% {3 X| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 `7 V$ J+ y2 T+ \% N9 \$ w
| MCASP_RX_CLKFAIL
. z' D' s! T. O0 L8 v# }| MCASP_RX_SYNCERROR
! B4 @& {" i- m7 L0 ~& P! O# @8 B| MCASP_RX_OVERRUN);
: B" b. ]1 d( m7 q1 ]/ l# Q- x}
static void I2SDataTxRxActivate(void)3 ?2 T6 D4 i' { h& K$ ^; u0 N
{
, Y8 W$ y/ G3 G: z. d1 k2 m/* Start the clocks */
/ h9 |, ~8 F( J' [1 F1 `McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);8 s2 ^+ O- Y( W5 r9 E0 D+ s! L
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
i% b& G, |8 J% AEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,; K4 C7 X a# j! ^1 a: i
EDMA3_TRIG_MODE_EVENT);
+ y# h* \1 V! k- S: NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 p) p I3 G5 {% j7 k) A" l
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
; }0 N4 R% u% p5 e1 ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
; d6 z# C% o% d9 ^$ p" K& ?+ EMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */7 r( H- |: ^$ _( \$ B. k% v
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */$ H$ I) x2 W5 |! h2 \0 F3 K, n
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);( W; J' J+ x( O! ]2 ^: P* |
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
5 g/ w; p( _! f0 w2 s/ B! ^}
2 [& \3 p+ ], O B* S- b' t( `. Y/ |
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ R+ c( M( f9 x0 x
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |