嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
6 |8 b( R3 v7 M6 z0 x+ I5 Vinput mcasp_ahclkx,
% @. C' j0 G: [: {0 o5 Ainput mcasp_aclkx,6 K5 d+ O8 E! I# i4 p
input axr0,
9 h' U* V/ _* T/ w
6 h& i) h% o* V0 |output mcasp_afsr,
2 w* R4 L, q0 M$ w3 N" Zoutput mcasp_ahclkr,
6 U3 P+ j% F- l$ t# w y! \/ `) Foutput mcasp_aclkr,
& c5 S9 ]0 {9 Z' g3 coutput axr1,
5 G4 Z( v% w# w5 E' v! ] t! A0 B
assign mcasp_afsr = mcasp_afsx;
9 c5 b! M( O7 D+ Iassign mcasp_aclkr = mcasp_aclkx;; R# i4 ]1 I' m
assign mcasp_ahclkr = mcasp_ahclkx;
- ~2 h1 |/ X) z6 e( ?assign axr1 = axr0;
, U6 }$ E2 l7 S# D
" N: J5 u& E" {; a
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 y! Y }* `/ u8 g2 o' f# c4 y( ]static void McASPI2SConfigure(void)% o/ Z* `1 t, C
{! U" C* u4 [2 o- C! J
McASPRxReset(SOC_MCASP_0_CTRL_REGS);5 Y: p. H1 B) Z6 c+ L
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */- T( b8 h" e! _9 P$ x+ }4 E
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);& A" u9 {9 p6 E/ @$ p- J4 Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */; A) S/ _0 q; |
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 N8 @7 Q$ b" r$ TMCASP_RX_MODE_DMA);
. k: L; [1 {2 d% `. ]& U1 \' _/ KMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ o' h5 ^+ r' AMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */- n7 H, Y. z/ U a0 Y) L' a; R
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 ]4 U, v9 H& x, d
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% _' |- A/ K, \- J# T) h7 PMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 X: f! _! _ c6 cMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
2 @9 q* M( ]# Z$ G' C3 q6 v$ FMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
# a+ O+ k9 o5 k9 ]6 ^McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
4 h5 l. e) C9 r# g4 D2 f- pMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& @6 x4 V" p# T. _ O: Q; S" L0x00, 0xFF);
/* configure the clock for transmitter */; s' [ {# O* @# \ t0 ^6 M% v
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- @, }! l$ X4 m" I& r% o2 ~McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
% P- g( I( ]- o& PMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, N9 [. w0 r5 I% L2 ^2 v+ _' @
0x00, 0xFF);, Q7 m5 E, x) I$ F7 @2 ]& O
) v1 \+ V/ v1 @# J' V5 h f
/* Enable synchronization of RX and TX sections */
* Y! k, D) v# ~" l8 kMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */! ?* H$ d2 k5 W
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 n( b q& I6 e$ B
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*- V- o5 ~* p+ t- G
** Set the serializers, Currently only one serializer is set as! W, t( V! b/ ^5 M) C9 Q/ V4 r
** transmitter and one serializer as receiver.
0 @ E+ G% S$ ^- J1 f3 ^ L0 y*/' O) d) c; A% A& c0 f/ G( G
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 X' T! M& a& z, M" Z# c
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
& w/ W4 `/ z6 y** Configure the McASP pins
2 D, k' N# k; b) ?( d! \$ C8 g7 |$ N** Input - Frame Sync, Clock and Serializer Rx
8 j6 D- V1 _* a# q T4 P** Output - Serializer Tx is connected to the input of the codec
& |/ }& } A+ c% p9 ]*/1 z( l4 M' {. w3 O7 h7 ^! g. N
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
0 O" }/ s6 p" k8 P/ d7 z! |2 u: e4 ?2 @McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: {, R) a: N" d, _
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 }1 E( D$ d% {! @& l1 x b( J
| MCASP_PIN_ACLKX( o! i, }7 W0 c# D* S: {! J3 d+ ~
| MCASP_PIN_AHCLKX
$ q% j6 f* d+ \ z! T| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
' h4 N0 `3 O% yMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% G G0 I' ~- w0 B2 I) J6 [| MCASP_TX_CLKFAIL
7 C3 Q( z k4 _! |' `| MCASP_TX_SYNCERROR
' g, J5 U9 ]# v# l. y& X| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 S2 Q# l, x: R' D2 s| MCASP_RX_CLKFAIL: F- p7 h4 t4 R
| MCASP_RX_SYNCERROR ' F5 J" \* d( d
| MCASP_RX_OVERRUN);0 D ?% W* t5 |' a2 f! E3 J: j. w
}
static void I2SDataTxRxActivate(void)
4 t0 h8 ]+ ]3 M6 Q{
: E& y5 n2 P7 j, a& I% ^/* Start the clocks */& R: c% X% f' q, M7 x# L2 P
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 b9 O& D! G2 s. `, |" `' dMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */" J& K R) m3 E" [& r) { `
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! J H* d% E, Y5 d% y
EDMA3_TRIG_MODE_EVENT);
; {$ l- O! r7 h4 l( EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
" J# B( N$ @1 X- d( jEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */8 R; z4 S3 U1 _0 g& i1 K9 K8 {1 h
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% O6 b$ y) f7 D7 ~3 EMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */; @' X( V, M; k. P
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
3 w- t& M& b5 `9 rMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
o, K7 k5 w2 h% r j/ l* dMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ i4 v9 m# m+ E2 m8 i
}
/ n1 C/ b( i$ E/ l6 u2 z9 [请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
S/ I$ r( b" }/ [
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |