嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
2 b% p" m- Y) N5 iinput mcasp_ahclkx,0 ]5 P% d( H- R8 V/ V6 [! i
input mcasp_aclkx,9 o% S! G8 K- Q% ^' {: U
input axr0,- {6 U$ H9 I# Z( |. x
, ]: {) C& _! [: i- D
output mcasp_afsr,, U; G8 _' ], B. l
output mcasp_ahclkr,
/ |) U2 }+ B0 l; o( S2 goutput mcasp_aclkr,2 ~ J: e, {% p- n O2 Q
output axr1,
2 r+ u& H, v9 E( |% ~
assign mcasp_afsr = mcasp_afsx;( b! l& a5 _& f# z" L
assign mcasp_aclkr = mcasp_aclkx;$ g2 D7 a) ?, R7 F
assign mcasp_ahclkr = mcasp_ahclkx;
7 o5 d/ s& \9 g& s+ Zassign axr1 = axr0;
J& i2 @0 T6 h8 _
8 b0 i6 v) E. d* l/ N) y, @9 Y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' i) b9 c) ^$ A8 `9 v! a2 ystatic void McASPI2SConfigure(void). f% p% h7 p, m) t+ P# ^
{9 X# X$ ]5 i+ J- P) o( l7 ]: _! E
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
. G( X3 i1 Z' B# M6 Y& ?McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */2 ?0 Z0 X8 d& }& f4 `3 t
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' f2 U, v! m, A' a& _4 {* SMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
- `- q7 Z, d# P5 D. o) R: DMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 z1 i6 C: {( s6 V8 s7 K1 dMCASP_RX_MODE_DMA);
7 V) o( G# ?( W, Z! ZMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
}7 n4 }( ?( x0 o. w; ~7 GMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
- D- z, z' E( T, Z F" ZMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 7 w' a) ~9 i# c/ c( v
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( s1 K0 v5 \ \0 ^, ^8 Q) AMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# W( n# l7 Y- x- Q" B( AMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
4 a7 i4 L/ {. ?& M1 e& pMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
4 W; \' Q6 J* HMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); . Y3 E+ c$ W& J- N5 E
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
' z7 \6 _( K: _* k% k# r$ L1 }4 z0x00, 0xFF);
/* configure the clock for transmitter */1 @' Q/ S. d% s: s1 q9 x
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);# m' I8 ?0 e4 O, p( i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
. @# r5 g% S0 B2 V" gMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, Y2 E& b. e, q6 V
0x00, 0xFF);
2 l/ Y- m* |( w9 k; x X d: d. d* J, N' c: b3 q
/* Enable synchronization of RX and TX sections */ $ ]8 ~8 h g$ F8 x9 e+ `' M6 w
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */' K! |+ b/ W' I* {
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" c# y/ ~) w2 _4 D0 E+ X/ Z; rMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
# |' } H5 v) l" ? Q* y** Set the serializers, Currently only one serializer is set as
5 Y( a% s+ P* N! i/ ~1 g** transmitter and one serializer as receiver.1 d! {( j/ `5 u8 N0 H7 i$ l
*/* A! E/ w! @; `$ N; \5 i
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ c) b Y! T; F. @* ~( rMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*; r0 Y! H" a# \4 `+ S+ u
** Configure the McASP pins
6 N1 K$ D' e& M5 [; v! ]0 r** Input - Frame Sync, Clock and Serializer Rx
* h6 Y# _8 H+ k: Z7 J' k" ], S** Output - Serializer Tx is connected to the input of the codec 9 D& M6 O4 V8 a# L6 n w& n; g' B
*/
7 P$ c* ?' G. j4 r FMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
$ `4 w G& U1 _6 ~" c2 a# D9 M xMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
X2 o3 J; _0 C! G+ W- w2 jMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
& p) R: I0 B+ \$ A$ E9 C| MCASP_PIN_ACLKX
5 f8 s. ^% r$ i. H. d2 B/ W0 f! H| MCASP_PIN_AHCLKX6 T, ` {+ e$ Z9 b' k
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
; y* o q8 j% ~; l9 ^% dMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ) E% |7 N1 N2 z* q( Z' ]% R
| MCASP_TX_CLKFAIL
6 z" H& K, P) L6 x9 @. Y| MCASP_TX_SYNCERROR
0 S- p( r9 E* H6 Q- i) [| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR - k! d* `$ [) e
| MCASP_RX_CLKFAIL' K3 V( z/ n: s6 Y" O
| MCASP_RX_SYNCERROR
" y) {2 N' X+ P! W5 @$ w g; K# {| MCASP_RX_OVERRUN);
' m' e. ]9 ]4 o& L a}
static void I2SDataTxRxActivate(void)
1 K+ {( s. q& V! ^{5 D, M) b2 F8 A
/* Start the clocks */5 D( ~* J5 i% Z6 Q' Y9 k
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 e: l5 g' t% b3 f+ h; f: Y9 yMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */8 A' }1 B. d9 h) y. B+ s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& x) V8 d7 o7 B% C* g7 c rEDMA3_TRIG_MODE_EVENT);1 b7 B! \0 @! F' s
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' X- o* |6 r' W1 G4 @EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */4 ?+ l2 q6 u* P
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
G! o6 W" `3 q$ C: O) e) c$ ?McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
/ J7 H- n% W; W! u3 E, a7 y4 Fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */% U0 P+ t% n/ H# I7 [
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* z' H) }4 P. p2 PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);1 x" }- V: Y& t1 J
}
* ~/ i* Y/ }' _! U1 G1 f请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* o2 g4 c* j& G* L
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |