嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
% J1 D/ c, G- @) s6 tinput mcasp_ahclkx,
4 D! ~" I/ n8 [$ Rinput mcasp_aclkx,
; k4 n4 Z; b+ D& p0 Finput axr0,) T5 T) O1 r& }
8 H7 b' L$ X8 X$ ]; J7 b, q
output mcasp_afsr,
1 A& s. `- I/ i( C: r9 Zoutput mcasp_ahclkr,5 p% S' O9 n6 Z% U& e8 j
output mcasp_aclkr,( J0 o0 p9 N$ C
output axr1,/ ~' B& r6 q) M
assign mcasp_afsr = mcasp_afsx;5 b3 @. U9 Q2 }) J8 B+ r
assign mcasp_aclkr = mcasp_aclkx;
' C! z, }& o( g4 ^assign mcasp_ahclkr = mcasp_ahclkx;4 ]4 Y0 a% B, d2 x; E/ l
assign axr1 = axr0;
* q U( f B( `( e0 y
9 |2 Y. I; c2 X/ j) q% M在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
0 V8 t8 G4 x. Q- X* ^
static void McASPI2SConfigure(void)( Z9 }2 c( e% J5 |' R. G$ q
{
$ t0 D1 I; _" c) T/ FMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
% S$ n. |8 k( ]' n/ w! T! g+ IMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */% [4 p/ q% B# d/ y& d
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);- e% h+ ^- O( g" } X! [; Y, W
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */" W) z4 k. X! v
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ E; Z; Q1 W6 i r2 L( @MCASP_RX_MODE_DMA);
- l5 C0 z' @# G: P- xMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: E) k$ `5 A0 }" a
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
4 k1 @7 l7 P0 m/ u' x- Z- xMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, A, g4 G4 v3 b& R& k* M/ MMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
V {; t, ~. A, ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 7 I" c# `6 V- b: l ?
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */+ D" w! Y( R. H6 }6 {
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" n& T* T# ~! g2 w
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
2 [( Y% ~* n* U7 n) y w! ]McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 H+ r H( x$ j0x00, 0xFF);
/* configure the clock for transmitter */: s* M. W, S( d$ }. e; @. e3 j" S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; a' Q, l/ `/ T3 @McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ W+ t& x ?. _% z: TMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,5 m+ P0 s; E e! |3 D% G
0x00, 0xFF);
) g* S# u0 Q2 G1 c1 [6 A; @# B$ O. d0 s. T4 j q
/* Enable synchronization of RX and TX sections */ . X* U( L3 V, S% }9 P- f
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */# t" K+ a( Q# K" I9 U
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
$ U. r1 y8 E/ _McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
5 f) y" G0 E* f e- p" e** Set the serializers, Currently only one serializer is set as# G7 C0 q. ]2 ]) T
** transmitter and one serializer as receiver.
7 }7 c3 ?' {$ O+ n3 B" Y, m*/1 k, h% m' k% v7 ~ C$ S1 \
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# K$ V& b3 y9 o9 l" U
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
/ G, O* ]* e6 _! A% s. M$ q& C** Configure the McASP pins
' L+ O1 P( `: a$ R8 P% v** Input - Frame Sync, Clock and Serializer Rx
! v5 F; I% i- N9 i9 L1 _; s** Output - Serializer Tx is connected to the input of the codec
" ^- p' {* Z8 N* A*/, a4 x$ r, Z; }3 I+ x
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ o9 t5 \; |! gMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));$ q S# l( @3 q1 \
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% I Y3 ^8 Z5 R( L5 K% p
| MCASP_PIN_ACLKX4 ]) j3 G& f9 ?9 X. ~& {
| MCASP_PIN_AHCLKX
' P6 B' M. a% c$ H: a6 s| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
5 R; @/ T% F S8 i6 b: Z2 ?McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR * e4 ~* q0 Y3 k, h7 W8 K7 @
| MCASP_TX_CLKFAIL
$ T, b9 w* F4 `+ W: C2 w- c| MCASP_TX_SYNCERROR
% S7 p: D; V( s5 t0 I9 || MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
' H$ U: P. x- z$ l| MCASP_RX_CLKFAIL! P4 W/ v- K! x- a& J
| MCASP_RX_SYNCERROR . Y! f$ o i: R: b' @2 q2 N
| MCASP_RX_OVERRUN);4 d- ]0 W& \& T% {
}
static void I2SDataTxRxActivate(void)
. z/ K* y1 g1 o8 Q6 `{
! }- p- m! X7 }6 u* X" L) D/* Start the clocks */. [7 {& D$ [- X
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. S/ @4 F$ Z% Z, x: D* T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */( C; x/ v2 Z6 f( o$ s" c
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 ? n* q7 Q G8 o
EDMA3_TRIG_MODE_EVENT);
& M P& q( {! Z p" D3 u4 @. GEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 _2 ?: u, Y" U
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
0 o1 O9 \1 F1 a% Q" mMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
- z& c+ E+ Y* QMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# S- F3 \8 j8 k4 r7 r! Q0 H
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
c" ]4 d! ?" w$ L% FMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
7 |0 u3 S1 L+ \- E0 L' S9 X# {. xMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);9 M0 c# N1 z5 y* T
}
8 F( L7 R* ^0 l
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
1 a& I5 S5 @ v& A% g( t+ s
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |