嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
9 l1 o4 n" d9 p$ C& @# \input mcasp_ahclkx,
3 l: O l1 C% q( p$ Finput mcasp_aclkx,
3 x$ ?, g9 P3 ?- l8 a& }input axr0,
4 [8 n) o) L, U% X( F' q, h9 J5 u" Y$ o4 D+ B
output mcasp_afsr," y& k9 y3 g& X0 y( {
output mcasp_ahclkr," I7 F8 Y7 v( Y2 g; r- z3 u3 h* D1 Q
output mcasp_aclkr,* `! D8 ~( ^8 Q5 P2 J1 C7 n C" q" N" [! ?
output axr1,
, a# r6 ^7 j0 I1 B! `/ d6 w3 N0 ]
assign mcasp_afsr = mcasp_afsx;9 V, l1 c& D! Y
assign mcasp_aclkr = mcasp_aclkx;6 g3 I# H9 B9 @) b: w' L/ a
assign mcasp_ahclkr = mcasp_ahclkx;
9 ^0 [* F- W* U: \6 y( `assign axr1 = axr0;
) f1 E2 H3 K- B$ B
5 _6 D5 j x% Z7 B6 u& ~2 A在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
) Q% y9 J6 G) Q8 [
static void McASPI2SConfigure(void)
' ?( T7 `9 _9 I$ h L{$ [% y& r/ a6 y# G# O8 \- c, V2 Y0 v( _
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 L. w# U+ u+ _McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */6 H: f5 D+ d$ U+ c" W& T( d
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);" k4 b5 f. r$ d6 [1 u! m& q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
: t4 ?6 a* e' U& D- ZMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ X# J7 Z- n" M. U* G* G, ?$ W0 W* H
MCASP_RX_MODE_DMA);: `0 C2 l+ `& L
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; d+ U+ G0 ~8 u# t
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; x r% U0 ~% H0 c
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 0 F' |$ e7 G; h, x9 N
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);5 { d5 [ v$ ]- H0 P9 ~
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : [7 O: Y! X. e; X; }
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */& d- Z; N; n$ j. I
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 G" E. u- j9 g- J' J6 R# M4 ^McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
/ r! P W) ^( X( a5 z0 F# {McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32, D) b: x1 e& |. W" k2 U
0x00, 0xFF);
/* configure the clock for transmitter */, q) f$ p+ P) Y9 @
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( {5 I8 @, z3 [! ^ K0 eMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ! K! x$ G6 G# F& d# n& W9 w
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,& M$ U2 g8 I8 |3 Y
0x00, 0xFF);
# U* l: W* i2 _% j; K& D, n* C$ u' |
/* Enable synchronization of RX and TX sections */ 9 g9 K4 }& \- \
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots *// L5 _1 e/ Z5 X
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
3 C$ R3 s/ b7 pMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
' C0 b; @) C7 l$ A$ `" b: I** Set the serializers, Currently only one serializer is set as
8 P% j! E- r+ i3 q** transmitter and one serializer as receiver.
' R( l( L9 P, h*/- @; ]9 ]9 i0 ^
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, l4 h- ]! O4 s. }6 EMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*) k9 x3 F' Y. M
** Configure the McASP pins
: z8 g( [0 o8 y0 ?** Input - Frame Sync, Clock and Serializer Rx- E+ j( p% d! z( R# d9 B& L5 y2 j+ l& J
** Output - Serializer Tx is connected to the input of the codec
& D/ w0 r$ ^7 C*/
7 l* ]* x1 }" X! l& H( T2 ^5 @1 H1 FMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* n# p' ~; J, H. a$ b
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 v6 g2 k( l ?" J$ N' R, J
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX7 P- o9 u3 w% @
| MCASP_PIN_ACLKX
; W/ l) z* ^& L$ W| MCASP_PIN_AHCLKX) P" R v6 L7 G8 d9 G \
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */ Z" g6 L. v) @; F
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 3 H! m n8 z: V: o
| MCASP_TX_CLKFAIL 9 B/ h% _1 ~2 K
| MCASP_TX_SYNCERROR
7 l5 s6 b$ ^$ @) T% i. C. d1 Q0 F| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 d" u& q" k7 U- C \| MCASP_RX_CLKFAIL
7 Y# V$ p- g+ t& W. n) |/ c, c| MCASP_RX_SYNCERROR $ Q+ Y4 f' s0 m& s0 F3 Z9 ~
| MCASP_RX_OVERRUN);. o, }8 a% v6 s5 O& _
}
static void I2SDataTxRxActivate(void)3 j$ d w7 n( B( m% }% m! k
{
_8 x9 f. n/ U8 f: {6 I/* Start the clocks */ U- e$ @9 N6 |" e; D% o/ E* S2 k* R4 ?
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. _' C) h& e' }* c
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
* a( [9 F0 X# {EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,3 _( |7 e; ?( F, H! H$ q* c
EDMA3_TRIG_MODE_EVENT);
6 C/ j) R. P( v. ^8 ^: f) v- I9 VEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
" }+ S9 D& \) P* lEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */- h$ T3 E" \; R2 o7 e. h
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 @8 |- t% a5 aMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
5 H, s* _+ U8 \1 v0 d: n+ f0 gwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
) ^) `/ q6 l* ]! w( sMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 } z; K$ q3 NMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);' i5 U/ t. i; }' z% M4 T+ U& A
}
4 |0 A) _% L2 Z* b' r9 }6 [; X. U; h请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
& T1 i0 O0 K* t9 x4 p
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |