嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
: {1 _4 H5 z7 U d$ L3 Qinput mcasp_ahclkx,
' ]9 i7 N# L) O2 o _input mcasp_aclkx,
- K* L$ c/ i5 m$ |3 K1 Cinput axr0,
) [0 z. A$ U5 q! m" h4 G
" X& K# d8 h" ~0 }/ {$ Xoutput mcasp_afsr,
' y6 m- I4 U# H" q5 g6 Foutput mcasp_ahclkr,
) w3 r0 N4 }8 a4 k' h$ aoutput mcasp_aclkr,1 W% K0 q- ], W3 s& S( j
output axr1,5 W' z3 Y6 l; X: ]" s" Q( k1 D( o
assign mcasp_afsr = mcasp_afsx;5 z# a0 {" @4 ?" [1 O4 d. t
assign mcasp_aclkr = mcasp_aclkx;) Z9 \* v2 l5 _/ [( [
assign mcasp_ahclkr = mcasp_ahclkx;( R' u0 F* q2 n5 r( S( @
assign axr1 = axr0;
6 b7 C9 @$ k% ]0 U- ~. C
2 a K. v* a6 e在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: E( r7 F6 C7 |! {static void McASPI2SConfigure(void)
5 \. d" A$ U: F! z) K1 P0 L: H{! s) R% t# ~4 e4 Q- M
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 x" F, M E9 `# ~. s( |/ {3 X5 n8 OMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
* l, r5 g$ `4 z9 uMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 r& X- K% u% m9 v
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
& k1 \5 d4 B9 I3 WMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! c ?' [- h" @4 g% s4 F, EMCASP_RX_MODE_DMA); U s1 J% U) K; _4 P3 {* _
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* ~# {. q4 v3 G$ kMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
8 {% v6 Y& H f6 q0 uMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 P* a- V+ u/ U$ Y1 a$ d8 d- RMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ r3 \# s$ B1 x- |" n
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
7 K# L. \5 k6 z! Z# jMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
! e- f1 O k4 E! e* GMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);( d+ k( i d( S5 v Z
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
9 A/ q( U- u% }9 V6 n# h: XMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 x8 B& c1 `& y! D7 D8 [" h0x00, 0xFF);
/* configure the clock for transmitter */+ H3 k/ f; ^2 T& C# [; ~7 d1 J
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 d* n0 s% j; x4 [. L% l
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. ^& b9 B V. G; Z; @McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, m C- R' e$ T5 `0x00, 0xFF);0 g& c; z- Y. o( F" w
/ f$ N9 {* B# W' o1 M2 h/* Enable synchronization of RX and TX sections */
' s, Y' n: V" g5 GMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 U t; T* P( Y; Z$ t9 WMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 g$ u1 n' R+ y+ a: }McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*( P, r" L5 J O9 }
** Set the serializers, Currently only one serializer is set as( j$ d) D% k3 T. g3 \' G: N% n( X4 M* \
** transmitter and one serializer as receiver.
2 c: p9 x) V/ Z) e*/" B; ^+ i" o. W( n6 Q3 x a
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);# Z0 O8 f6 t( v5 q: N
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*# s6 v9 B& W# T, x4 j
** Configure the McASP pins
/ U8 u7 C- F9 c3 ]; N k** Input - Frame Sync, Clock and Serializer Rx
' M5 W# H* j! L! B: w** Output - Serializer Tx is connected to the input of the codec ) s6 g: A" h) s3 }$ O; d
*/
3 h/ H8 e9 U7 ?$ sMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. |* R0 ~) \* C1 a5 H9 n- ^
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% B5 _6 j7 q' h- F U9 |4 O
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
8 l; P% J4 Q+ x% S% |7 H| MCASP_PIN_ACLKX
u( M8 }# O. j8 t' h& {9 Y4 ~$ I| MCASP_PIN_AHCLKX
3 p' k+ ]# \9 Z4 i' f' @# v| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
5 t5 u6 D' Y' }/ l- ]/ m: @4 vMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ' n% {. T# T1 S% r) Z; J- K% ~
| MCASP_TX_CLKFAIL
- ~8 ?) y$ a: Z0 s( q6 n" w| MCASP_TX_SYNCERROR( u5 i" |: [0 x$ x) k4 \0 D/ z" F( L
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : H( c3 e9 |) S/ Z- q
| MCASP_RX_CLKFAIL
5 o; G& U. _" n || MCASP_RX_SYNCERROR
5 W, W, Z B4 G; I! d7 @| MCASP_RX_OVERRUN);% [% ]0 c& J6 Z: P
}
static void I2SDataTxRxActivate(void)
2 D# f! g* W& |0 ?7 R{8 _3 l- [3 S5 j( E/ m
/* Start the clocks */' M! V2 d" {" i0 h3 o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 N+ w1 z% i% Q7 ?9 t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */2 m+ Q; \8 Q& ?& N) _% C% o+ q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* H) ^) O' z. \0 v7 A% A6 J6 ?- Q2 xEDMA3_TRIG_MODE_EVENT);
2 V N6 s' B5 x2 i, u" CEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
n5 `0 S- F4 d" h& s5 s. yEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
+ k! W# Z, W' `" z4 P5 a( ]McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);( a' L) l8 D% I* x2 G. h
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */# I' a: P& M+ B
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */# a6 K/ Y9 V5 y/ O' h5 q3 m! w' L
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);) |6 {9 @- \: {8 i
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
- ~6 \; V% Y4 S: K. e}
' U5 T6 Q, g$ R: g
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 {1 H9 s3 j" O
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |