嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,' h! \; p2 V6 k. R1 M; O
input mcasp_ahclkx,
2 \' L; j9 @5 J5 B" Yinput mcasp_aclkx,* y/ t' K4 I9 n' G
input axr0,3 b3 @5 `- t& H* D) O
- o7 j" o5 }3 @2 k( q* @+ C8 @output mcasp_afsr,
3 c& {7 o# H& W0 {- z# K! Noutput mcasp_ahclkr,
5 E! I5 D* w7 J9 ^output mcasp_aclkr,- W$ w& M. ?7 \
output axr1,
0 d% P! I0 y9 n* W- n
assign mcasp_afsr = mcasp_afsx;
! o. m1 T& b; ]6 B2 f& o- rassign mcasp_aclkr = mcasp_aclkx;
: D. }8 ~7 G Vassign mcasp_ahclkr = mcasp_ahclkx;
* X" P& u/ h( Yassign axr1 = axr0;
# T; p8 T$ B$ f2 n j$ x3 Q# B" u3 l* ~5 k4 b5 u
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
B1 Z6 E9 r+ I
static void McASPI2SConfigure(void)
5 h4 y+ ~& H! W; A, F& `- x" R9 z{$ r w+ }+ P% V/ s: r. i! e4 w
McASPRxReset(SOC_MCASP_0_CTRL_REGS);* @; k% b; d2 T$ B8 t
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
) B( c9 Z3 E% }5 u% M) JMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);3 U# N5 X: r% Z' m- @
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 Z3 }6 Q% x+ B
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- F0 Y! d& t2 v, w+ D) hMCASP_RX_MODE_DMA);6 e! T8 \* W. R$ E9 Q7 f3 a" E
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,: G% U. _- H5 x0 f$ r8 U
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */( K& \; P1 l6 W9 S0 W$ c
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + F# O% d" B( O$ L
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- d* z, V! A# c3 E r
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : r% T9 ]# R+ a0 ^1 P( T
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */* U6 F1 v* i1 I% J
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
; L% \ P _8 t- X5 I$ jMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% \9 W" ^5 d5 N5 R1 F+ _+ ~( z2 L* @McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
1 g! J- _! s2 _7 B0 H0x00, 0xFF);
/* configure the clock for transmitter */
2 E3 H8 I# b6 G8 g& P% E$ V' lMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
! \/ S$ [+ p6 ^7 }! a+ P0 VMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( {' q* E. Y* D% v& t( f% w
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 V' U% r) z% d% L. V5 @0x00, 0xFF);5 L5 V9 }) C/ ~6 Q
# w) B4 _" @, E& l* \" t/* Enable synchronization of RX and TX sections */ 5 `$ q: [3 n" `1 G; a2 i
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */& P# y/ }! p4 ^* h$ e$ x
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 h$ q% j2 ] G, c, hMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
8 p# P8 S; [8 L9 n** Set the serializers, Currently only one serializer is set as9 O8 p G; M: X, j
** transmitter and one serializer as receiver.
- k& `; C$ l C& X) v( n*/
- H, R p8 {! bMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- j/ r( b$ m( ?McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
: g; ~$ A7 {; P5 i; `" h8 N** Configure the McASP pins
! G2 f( {9 w2 D/ Y% c+ I1 L" I1 L** Input - Frame Sync, Clock and Serializer Rx5 {6 c+ J8 p0 @1 E4 ?% G5 Z+ c% t1 t- S! t
** Output - Serializer Tx is connected to the input of the codec : Y5 p- v! J0 ?0 i4 I2 ^: H% o
*/
& X) b% F5 O5 ^/ G: q* I, UMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);: w( }# D$ D! S/ p$ p1 T
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" o( |8 q/ ?* C2 O3 H. n
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& ^: I3 [ Y% y0 \: _! J| MCASP_PIN_ACLKX7 n: G) U+ B- a \+ c
| MCASP_PIN_AHCLKX+ i: Q6 |3 ~" M1 t1 J( K0 B
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
# J" D" ?+ j" e7 K7 V! zMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
0 {( R5 A3 O$ [% a/ Y| MCASP_TX_CLKFAIL
7 D) t" l+ ^3 E# C4 s* O! \| MCASP_TX_SYNCERROR
& m' i; i+ I4 M4 j| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ; d' l( U1 g3 [5 {5 k* ^
| MCASP_RX_CLKFAIL
5 q$ } n; H# O6 H+ \0 [; r6 m| MCASP_RX_SYNCERROR # n% f+ K& v; M" l# a- ?$ c
| MCASP_RX_OVERRUN);2 B' g# j1 Z! q- e3 {
}
static void I2SDataTxRxActivate(void)% e# _& r2 v, u3 `, q8 W o: P
{
7 q8 l2 _+ D! q% W3 i2 G7 G/* Start the clocks */. B( M9 l! y+ b
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 A- |: v8 K8 _ C) V+ UMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
% p' w; r- T* v& e3 mEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ |, i0 [/ n+ T: b* F# n
EDMA3_TRIG_MODE_EVENT);
! ], P0 r6 ~5 i8 EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! U0 A- k& f& E; k' P* B* R% Z
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
; b6 K% R P; E# I. F, q6 aMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);4 L7 k& s9 h" w. e
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, Y* z$ R% Q5 v" D; ?+ kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */% x' T8 x8 ~% Z8 E6 {/ {
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);5 Z e5 ?2 Y, S0 V
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; C2 G7 h& A3 E+ u. \$ J}
# R: p5 S. b* \6 ]
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 V; N, ]- K; t% e2 A/ M
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |