嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
) S* A$ O0 C' r7 Ginput mcasp_ahclkx,) K5 N8 @3 l: P4 t9 x, l; U
input mcasp_aclkx,
- |* U) n6 J1 e: }input axr0,, M( ]1 d6 u6 L4 K1 o
4 L, ?. s' [% n7 R. }# C
output mcasp_afsr,
* [1 U4 e% F. ?$ j5 v1 ^output mcasp_ahclkr,
" e; @0 S- G0 p( q2 a# aoutput mcasp_aclkr," k9 ] s9 d8 d2 h3 K4 N
output axr1,
) D; x8 ]0 s% n
assign mcasp_afsr = mcasp_afsx;& s# R' r% L# ~
assign mcasp_aclkr = mcasp_aclkx;
- O/ ?/ s7 u0 ~& F' x. sassign mcasp_ahclkr = mcasp_ahclkx;
( k7 R h2 M# K9 Bassign axr1 = axr0;
1 `/ }6 l1 [% E8 j( D, e3 | Y0 q3 A
4 ]4 G3 J' o/ F- Y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& \( N+ t3 V5 dstatic void McASPI2SConfigure(void)2 a- o! ]9 H9 f. Q* d% g5 d
{4 S. L% |. h4 X# j
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! j6 s8 P2 x" f6 V+ j+ ?4 f' d* Z$ e
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */# S6 t% w9 {3 ^! ~; F! X3 E2 q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 L! z3 }) f& S5 E1 E$ Y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
# p, n9 }4 f6 ]4 |McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' l- ]8 u* F" w lMCASP_RX_MODE_DMA);
, U7 k/ @( E2 `7 aMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) e% L) e7 w- J. D5 X
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
5 f5 y6 w" I0 [7 Z& x, C hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
. ]: Y% q! w1 LMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
/ {' v# b7 ~! ?. r. n7 k: yMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ `/ r) F; ]$ E. m/ F. w" k0 SMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
: J5 h" S! C' H# s; ^McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);2 Z1 u5 Y6 z. }" k
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
: f$ y1 z! e, R# n; C; \5 `' u; ]McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 ]5 C# N7 Y2 V9 v* {
0x00, 0xFF);
/* configure the clock for transmitter */) q$ B8 [ n& m; x+ F
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- B3 `" x5 `, J. S' ^! k1 O9 v: mMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 a1 n3 R) V: d" k( e+ H% U
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 i4 b, l8 a3 f6 d& Z0x00, 0xFF);/ E# d9 @. g; d; G5 P- q
! v0 U' e: {! g9 ]* ]8 ~7 i8 v
/* Enable synchronization of RX and TX sections */ ' [$ S3 l+ F. Q: W; q( {
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ j: c& Y& r; v! G4 h# \, oMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
6 J; ~0 m# D: x; H0 FMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*1 W0 b g8 T8 L3 i5 H# v0 u
** Set the serializers, Currently only one serializer is set as( N m& B& N3 N) ?
** transmitter and one serializer as receiver.
# q# M- _# J2 B9 u*/4 J% _, D- }$ N
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);% W$ l$ u8 D t$ S: o6 b: v1 c }- w
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
0 ^1 \- t8 Y& h) ?) O** Configure the McASP pins & {5 c/ t4 x9 O( O8 {/ H( Z, n% x
** Input - Frame Sync, Clock and Serializer Rx% a& N: g# N0 X* C- I
** Output - Serializer Tx is connected to the input of the codec
; ^# l6 o# ~0 Y6 q8 a. j f*/
8 ?( n) G/ W$ y kMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); K9 R" Q1 w8 Y# X5 _. e
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% e% s6 N0 w. y, z+ Y6 ]
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX4 ~: w+ ~1 N* P5 P
| MCASP_PIN_ACLKX5 E% f6 T1 a4 ]5 V, a9 o
| MCASP_PIN_AHCLKX
, n* w- y. j( T6 x| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */+ h0 o: A3 C! U# l( R" I
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
- D8 I `. I5 ^+ l# L& Z| MCASP_TX_CLKFAIL 9 r) V% \7 m; q* k
| MCASP_TX_SYNCERROR
4 @' ?1 z, O L* f0 L| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
/ a& s0 p2 s/ X5 ]* _| MCASP_RX_CLKFAIL$ [- @5 @% B6 U0 K. v
| MCASP_RX_SYNCERROR ' D9 f( M4 U4 N4 C3 t' k& {
| MCASP_RX_OVERRUN);; \. F1 n5 ]3 q/ j4 X0 ^# R
}
static void I2SDataTxRxActivate(void)
6 S6 H7 y4 x' P% U8 v{
) b! X. Z" O( N* \/* Start the clocks */
* N+ R: \0 X s" A# ^: _McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* E- _& z% F' V# w) V. E: OMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */- r) Q: @8 f8 R5 e" U% z9 r3 i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( e3 `/ J& h" B$ _$ R7 K
EDMA3_TRIG_MODE_EVENT);
# b$ w% C6 ^ f9 IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
) |5 h9 d& T1 G- [( x( k( ]( SEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
/ \) }& p9 L9 e% [& kMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
+ s3 g- B7 B5 ~$ R' V$ qMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */6 d6 ?& u9 h) g) U7 q! Z' W
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */5 H9 G6 m! H8 ]& n/ \6 b6 b
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);( z/ `9 R2 }, }3 y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
# L5 s3 J" V; |' u- e' \; W}
$ E0 e! \( `) r' N; I; G请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 o. a$ s, |* p6 l p
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |