嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
t- ?' r6 Q$ a3 N% c% Winput mcasp_ahclkx,9 C" F0 C9 g. E6 [+ e
input mcasp_aclkx,! S* A: I& f. c% X4 R5 C- ^
input axr0,
# H5 I. q1 T0 B0 b1 f* ~+ q; b$ H" y: C
output mcasp_afsr,1 @+ J3 g3 V8 i* f
output mcasp_ahclkr,
) c; |2 Q( | u" {output mcasp_aclkr,
}9 S- K" P- b. j1 N1 moutput axr1,
7 {$ U: u3 n' L
assign mcasp_afsr = mcasp_afsx;
f( X5 t+ [# ?0 \, r5 D+ ?assign mcasp_aclkr = mcasp_aclkx; L0 e" @9 H& @$ h E5 }. s
assign mcasp_ahclkr = mcasp_ahclkx;# Y# B3 e. M& t3 [
assign axr1 = axr0;
5 V( x f% C' ? p" z# M
$ s- g5 ~/ K8 b/ F4 Z v
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& Y- F/ `" a0 q6 {& Z" g. p
static void McASPI2SConfigure(void)
0 v+ l/ @# N/ X* ?, Q{
, \8 Z+ P3 {0 ~$ p3 h H B4 RMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
# `5 ?( \5 G" ], @% {* E* RMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
- u9 F! O* q h& Y( DMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);: n% l; A- T8 A
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */ P' ]# r( _( Y5 E* k! Q
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; V- R7 j$ s# w0 k
MCASP_RX_MODE_DMA);
7 K. c1 X- V1 T, p7 Z }* cMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. N4 E; c: I' i5 i. d7 N8 g; JMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */# t) v1 {$ P w
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 b$ i2 r* y/ zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
" | K6 w" r2 ~) [& R( NMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# b5 Q+ G s) `/ e% ~' \9 C! uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
1 ^4 e7 a8 _' J/ h3 `# _& p% b aMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- r! }& R h% M! FMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 ^; R! O- G" L( w
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,+ V( Z6 t* d( }8 ^+ H }
0x00, 0xFF);
/* configure the clock for transmitter */
! H1 ]" U: w+ w2 E* \- t5 Z$ {& vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
5 } K; x7 x8 n* w1 o' a( bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 O0 W3 L& H# A& G
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 G% |# P0 J& g) U8 l( q- M+ h2 Q) T0x00, 0xFF);8 k9 i+ P/ _7 d0 _
% ~6 x" p# C! F% I- N# _6 }
/* Enable synchronization of RX and TX sections */ . x: v; Z8 \: Q2 m$ g, j
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
- r' M0 n9 C+ f: ~! I8 {8 SMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; H0 {8 G7 ]' r# ]9 x( ZMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
) {% K4 n$ Y ~** Set the serializers, Currently only one serializer is set as
9 x, ~1 W( ~2 \7 ]** transmitter and one serializer as receiver.
' w. c ^; m5 t: F1 }*/2 K/ q! c1 @0 r5 Y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. n6 \9 Y) J" Q6 B8 p/ k, M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
& X5 F2 U1 l0 I6 _& b I( ~** Configure the McASP pins
5 k5 p, l+ f; Z5 E4 r: q" X** Input - Frame Sync, Clock and Serializer Rx
& E7 X& M1 {0 \+ f' T* n** Output - Serializer Tx is connected to the input of the codec ' R% x) ^: t* @$ Z8 q0 l3 }- c
*/
$ t+ L) y4 j$ y7 v" tMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# x& c" ~, Y5 H% r6 ZMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# I7 e4 w# h* R' t
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX P$ j4 ]/ e, v `& U. b# N( k0 g
| MCASP_PIN_ACLKX
( s) C. M" H9 D9 d d" P9 t0 `| MCASP_PIN_AHCLKX3 }- i, S$ W$ [0 z- |
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
" E7 b0 W, x# d2 W* dMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . k$ J9 y: W! A7 H- V0 E
| MCASP_TX_CLKFAIL ) |. H$ R' z% t6 C6 h
| MCASP_TX_SYNCERROR
) @$ {; P8 k$ u s f: q- i| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
0 B( [) i6 b- W5 Q4 I| MCASP_RX_CLKFAIL; |6 H( `4 S& Q
| MCASP_RX_SYNCERROR 7 |6 t6 f* y3 E# r. _' r/ r5 c
| MCASP_RX_OVERRUN);
; b( Y3 f0 d9 }* Q}
static void I2SDataTxRxActivate(void)
) e$ W# K1 U6 ]{( G" }1 w, T+ |9 k" a& l: Y
/* Start the clocks */# }: L; t, ^+ n
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 c! c; F: T) S7 u8 Z7 K% g
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */8 R+ ]5 u$ {/ m+ K- _7 `% r! S
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,7 {( A0 n. ^( @) n+ m" `- w1 d" y. H
EDMA3_TRIG_MODE_EVENT);
: v4 M. m& T6 D" R+ u* |EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
9 b; O" [3 C4 d0 j9 }4 ?EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */- M, g' c6 Q0 {' x( C
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% G9 r8 Y- o/ W6 _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
4 c+ K, h2 G, ~ ^# J# @( y8 N0 hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */; D) B& b$ ~/ Y+ T$ G* F; @) S9 b* |
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
. W$ A4 x7 ^: l! G4 u& nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) q" D8 |3 |3 m5 ^* `% R' ?}
! x, ]+ P. J/ e' G9 F
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 s. n; |: p; s8 Y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |