嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
+ K+ K! f- b* E" L$ Tinput mcasp_ahclkx,
% e$ }8 `0 E4 y" C6 c# Q, P% w3 M: Qinput mcasp_aclkx,
7 [) t( L% V+ P/ m: m( w1 u1 w2 @input axr0,
( f, M6 I: c" e+ K8 d3 Z8 ]
. S; q5 r; [& H5 e1 @) uoutput mcasp_afsr,2 P" V) C9 f- i* A5 w5 [
output mcasp_ahclkr,: b, g7 ^; S8 v- j( }2 _: s1 m
output mcasp_aclkr,
* Z8 _0 [ {. C& p9 ], qoutput axr1,& R5 c- K4 t/ Q+ h/ R6 {8 F
assign mcasp_afsr = mcasp_afsx;
" S0 g/ f3 o7 |$ Vassign mcasp_aclkr = mcasp_aclkx;* W+ X* y# f3 ^6 I3 Q2 f+ x( T+ e
assign mcasp_ahclkr = mcasp_ahclkx;
+ B! s8 T- g+ d& N' iassign axr1 = axr0;
% M, Q7 s; s$ n
9 o6 A! `( c5 N: L' T5 @; n
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 m* D0 R7 Q2 M1 G, I1 T+ D
static void McASPI2SConfigure(void)
7 y) U' ?; a% I8 o, G7 M2 C{2 P/ a( P- d: Z* H5 E) X
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
, j+ W. H# G) B6 i/ |! wMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */) Z! B' N; U# j- A. B
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- ?# e: r: e: c: G4 n, l# gMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
; D/ Q4 U, D% [McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 E, h( y% _& b \, _
MCASP_RX_MODE_DMA);
* p2 M, x0 {# h1 Z. O. v; Q1 UMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
# ~/ E$ K7 Q3 D7 K& _, pMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */9 R4 }( q0 ~% p- T2 p5 J* b
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % S1 Z1 k& L- o' h: q7 R
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); y4 _7 l% K5 z$ j3 ?# }9 F4 Q2 H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
! p3 Y* B& A, c' |MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */; U# |1 g( @8 i; s
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
/ Q( w1 H- Y, ~McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
$ t) h6 Q' n- T2 JMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& N& u& M% s2 ~6 w* H5 M1 B2 j" _0x00, 0xFF);
/* configure the clock for transmitter */
# y- }( b; A# vMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
) G' l& h# e/ i9 J& h& d$ VMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
\: F/ c. Y& ?- K& KMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 _# T7 W2 _% F! [ q1 t# d
0x00, 0xFF);
% d0 [3 W7 [) M* k2 p' a# J1 M; U
, e0 m* f9 s1 I/ ^5 h8 a |( w/* Enable synchronization of RX and TX sections */ 2 `% a$ Y1 e W+ Z# \
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */( K. K2 N/ B4 N" V8 H/ u& }
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 t/ ~0 ~3 b4 o* O* B( p- m8 D
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
6 `& a5 w J$ @** Set the serializers, Currently only one serializer is set as+ N- p& @# Q: O+ w/ Z [( C
** transmitter and one serializer as receiver.
: o3 t7 O$ d* K*/
$ ?, a0 V e8 q; `8 H6 @ h2 [McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% z2 U3 e- g5 X+ @+ e3 }1 eMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*/ g! s5 \) o. b1 j& C
** Configure the McASP pins
0 R' Y- K" ^( o& P! S# s s7 b** Input - Frame Sync, Clock and Serializer Rx3 N( m( R |% q. x E( k6 j! Y' D
** Output - Serializer Tx is connected to the input of the codec
( i1 S3 n" @' M/ h9 }*/
/ z0 p' R, X' ?! N" `2 M5 E% kMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);7 m- x* n% ^* l/ K* i9 @5 P
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
; {( [* s0 x+ g. T2 YMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( N8 u# `( C$ u" g5 x| MCASP_PIN_ACLKX! Z/ J8 a! U7 P& u
| MCASP_PIN_AHCLKX
. r1 o9 u, p# k& T2 N| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */, s- D d) l3 o# o
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- V& `, Q# n5 m/ _4 n0 a" Z| MCASP_TX_CLKFAIL 6 m0 o; C- l' w
| MCASP_TX_SYNCERROR
4 B6 A+ n7 ?2 P| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
3 [0 Y: D/ c7 h) D| MCASP_RX_CLKFAIL
1 T2 F" H$ T. K| MCASP_RX_SYNCERROR
# z6 o4 m8 `! o; d| MCASP_RX_OVERRUN);# h/ f) L( L1 x7 `7 h5 s1 A
}
static void I2SDataTxRxActivate(void)4 Y- U* h/ t8 e% s2 P, X" {7 ]
{
! [3 |/ R1 |" F' G+ a% B/* Start the clocks */8 ?5 O; u, Y" r& P9 c% A
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
/ P" `9 E/ Q; d7 Q; J7 j BMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
5 F/ ~2 u( h6 e5 u* VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 m1 X1 j2 k9 C/ @3 REDMA3_TRIG_MODE_EVENT);
" y7 {/ {/ h, [3 h/ {% a I. aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, . E* B. S3 G' z" o3 J3 t" f$ N! q
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
" m" N( h K. b9 W* w+ X6 iMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, [ a5 Z/ u+ w0 U$ G2 qMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
5 |8 `+ m0 J4 v$ b/ Y' C. p, A$ vwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
/ v/ T# I' B' P" v+ S6 I, wMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 X& V3 w( f U% hMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; h* a, j! X/ J) x9 E( D7 [( Q0 q}
7 H9 D/ ?/ L, Z
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 q1 n' p4 _4 S% f+ r2 W: U$ r
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |