嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,: Z+ |. g w) c5 X9 R% [, t
input mcasp_ahclkx,
& x2 I* q+ k/ B# K8 ginput mcasp_aclkx,4 X- [# m8 p2 j5 U: H' U
input axr0,
" O; w) j3 E* B7 Q [+ `. B+ f$ ]5 [3 p- [: F6 }. |* X
output mcasp_afsr,/ ?: K" P2 l5 r I
output mcasp_ahclkr,
' ^$ ]6 S7 S2 B# v+ L& s4 Houtput mcasp_aclkr,
( D. C3 N& w5 l7 voutput axr1,/ D5 t+ g% V0 I5 P% Q4 U/ y/ A
assign mcasp_afsr = mcasp_afsx;
- z2 ~- @6 y" H% A; U: d4 bassign mcasp_aclkr = mcasp_aclkx; `$ w6 n7 \* q7 R" ?3 o
assign mcasp_ahclkr = mcasp_ahclkx;
7 ^# C: y! K" @8 T. F1 Yassign axr1 = axr0;
, K% a5 s, q9 {( B% b9 S" z3 }5 b; m/ l, d, j8 M6 r/ P) L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 }1 K, b: v. |static void McASPI2SConfigure(void)
. v- T% E8 P' s' t( g" K{
4 N2 C) M. @' y7 b! j0 UMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 y0 z( T9 t2 f G5 aMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */& @# K/ H; G3 U X* F. {
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; B: P7 z7 |- b( eMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */ S' i+ R, B+ L
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ Z9 i) d% |# T' g$ Z0 E* G/ FMCASP_RX_MODE_DMA);
/ Y3 p3 q# l6 o8 wMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 {$ ^( A( m! L
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, A# N+ f* c4 r% y* wMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% o8 c' o' x) J) P2 ~MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* C8 R! D1 ~1 p" ?
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
, c7 _7 u; H7 \$ i! c9 g( dMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
9 T4 Y3 r. Z0 h u# i5 VMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( p; m/ H+ L: r4 mMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* P# o+ l k/ Q0 z3 H/ bMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 t, s6 k1 x$ w$ q7 D- v
0x00, 0xFF);
/* configure the clock for transmitter */7 g' h* a( {3 o5 ~, i( U: ~
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);1 F( Y: q8 ^* o" R3 U
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' r6 u! m P# m0 \! F7 C. T8 B6 P) _
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
. E/ f1 P1 a( r0x00, 0xFF);
0 w* ?( n3 P$ \" @3 ~7 ~! {% y& ]7 O( v+ R9 E! a% N
/* Enable synchronization of RX and TX sections */ $ i0 _# b! L. e" L: l: O5 M
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
8 a3 F+ d1 x/ i0 X3 E, Y) h8 M( OMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);: j% a" B _4 z
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( ~( g' s6 D8 q. Y** Set the serializers, Currently only one serializer is set as. E. T9 W, s m6 G; `( t& g
** transmitter and one serializer as receiver.
! Z" r' l* p: f& Z0 P*/5 s* p, [" G" h. O, w4 _
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 P& B" h$ y+ T ? @; KMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*1 S' ~8 U' C+ ~- r
** Configure the McASP pins
- `7 F- g0 K: X9 F z4 o; M** Input - Frame Sync, Clock and Serializer Rx
/ u9 W& D4 e( E. y; l** Output - Serializer Tx is connected to the input of the codec
! J& I" I, p2 f- z/ l. a*/
( e a5 q/ l! P/ oMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
1 G/ A. Z' B- \+ [McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
( T4 J0 A( q* `: G: H% AMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
( A) U, k$ `8 H| MCASP_PIN_ACLKX2 [9 Z2 k$ q& Y+ D2 q; H. D
| MCASP_PIN_AHCLKX
5 |9 E3 ~& p( p| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
5 b' E4 g! B9 b$ o& _4 tMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ v# R( a; H* x$ a| MCASP_TX_CLKFAIL
$ ?# [ f( i' c, L| MCASP_TX_SYNCERROR
8 H2 G& Z+ a7 c+ K: R7 E9 y+ x. f| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- c* j/ U( ~, O4 }) E7 x| MCASP_RX_CLKFAIL7 v5 n6 j2 c8 i! L% j( D
| MCASP_RX_SYNCERROR
& c0 d m, b2 h8 B3 S8 j# e) [% _| MCASP_RX_OVERRUN);1 n" M6 H$ g2 c, C! g$ k
}
static void I2SDataTxRxActivate(void)" i E) p% J2 ]: y0 h8 W, [
{
; F4 t$ d! _& G3 A A; z. q3 {/* Start the clocks */
: N- S2 o! P, U& GMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ R) \0 c6 v7 U
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
+ H4 |6 k. V1 R" h1 Z9 mEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
4 e# N v ^0 S. m" h% e _1 ZEDMA3_TRIG_MODE_EVENT);
, R" ^! Q7 h3 r6 }EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
& c p$ { e7 [EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
& K) i, f$ @( b% X* L( UMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);0 N+ c' c. O3 m' e' Z
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */2 [: y: I. g" b9 N8 [0 F% |: x
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
b. J/ x \5 hMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 E8 y+ g: R0 `McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 r; C/ e0 }# m0 s& \( @3 W/ c0 k! z) \
}
" w8 s. B8 k2 H& f C
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# g0 @0 n s" t( s
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |