嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
. c1 o, R; w m B; d! ?input mcasp_ahclkx,
1 j6 ]" J' ` y. l9 [input mcasp_aclkx,
3 j# V& s4 W: Y! p6 @input axr0,2 p5 a( ~4 H$ K
# }' |2 G. _: `( D5 L- }. O, w
output mcasp_afsr," y: R# y5 E- _' J8 Z* I
output mcasp_ahclkr,! U) n: s4 \9 F R' d2 e/ B
output mcasp_aclkr,. J/ K% k& I# D+ y% z# z
output axr1,
3 M) S& V8 R1 r' O
assign mcasp_afsr = mcasp_afsx;
1 @. C7 t% ]( b& @$ @7 Iassign mcasp_aclkr = mcasp_aclkx;" `7 K! l3 A" n0 O# J i) G
assign mcasp_ahclkr = mcasp_ahclkx;
% r/ ^" W( w+ b( Vassign axr1 = axr0;
+ d$ M* A3 d, i/ Q% [( z H
5 d- G8 y* P. a; E0 x# F
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
' Y3 P) Y; M; W3 Ustatic void McASPI2SConfigure(void)
7 M3 a% s! p" r6 \{- G e: m+ e0 R% i6 J4 U8 z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);" s8 D9 I' r, s' {
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
+ f+ C+ j5 ~1 Y6 g# r" x7 PMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
- [( R2 z+ i# k& n8 M; _McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */: Z8 c* @4 M5 B0 H: A
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% u/ M; Q: |: I0 s" D( wMCASP_RX_MODE_DMA);
6 X5 }" q5 a9 WMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 L% C# F, R9 b7 y% j4 oMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
V9 K- J, i/ U! n- c2 L {McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, d% S# F, v7 i' W X% t% Z( Q, bMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
+ R* R% a( R6 ]$ o% h* h0 e$ gMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, : C T: ^( W3 u" x9 [1 Z7 R6 ?
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver *// F" I( X, Z; W- S
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 y+ d3 d1 k, c7 x( Z% Z
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 2 {# w/ o0 G7 _6 {3 c% @- X
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 y5 N# h2 d& D: x/ j. l# {
0x00, 0xFF);
/* configure the clock for transmitter */$ x5 n O6 r" G+ r3 d* @" I# I
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 u" G7 K; {1 C& r( d; s8 F. h
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
+ B' Z) N3 Q9 f; ^% HMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
# F7 `5 i' X7 D/ H0x00, 0xFF);) x/ i/ z% O) n5 q2 M& s3 E1 a
( y' K, `! L- E9 w8 J; x/* Enable synchronization of RX and TX sections */
2 F: \& w: U9 S1 z. Q2 d& H p. sMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */7 m# Y2 Q4 r' e4 s3 c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 d% m; l# S$ Y0 i
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*) m# }# T% ]( A0 m; s N2 S, |7 Y4 ~6 f
** Set the serializers, Currently only one serializer is set as- n8 J: i8 n# F# T5 @
** transmitter and one serializer as receiver.) m* y' r* G1 A; E1 w
*/8 W4 ]' G5 A5 W5 Q; v
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 j$ }* T3 F- R! w* P2 I
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*2 d* Q4 o' f$ m# s; N3 X1 e U
** Configure the McASP pins $ ]* |( m2 S1 R$ L
** Input - Frame Sync, Clock and Serializer Rx) q U9 Q" w$ i9 V3 f/ d
** Output - Serializer Tx is connected to the input of the codec " P6 h# W, N. d/ N: A- ?6 n# g4 G
*/
: @, D& V6 a7 E! A6 k' S/ _$ GMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( `6 M1 E6 X% z' q s1 M- u
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); @) [" J. t7 Q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
6 ~5 I( ], x& f9 e5 d. ?| MCASP_PIN_ACLKX
4 X% T) @- x* x; L: W' Y# U3 y| MCASP_PIN_AHCLKX
0 |2 d$ V" R8 q+ {! I| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */- ?; ?1 h; a& y, P6 z3 h7 p
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 R2 N2 n2 N1 h6 y
| MCASP_TX_CLKFAIL
: z# H9 Z6 E4 m! R8 |- o1 s C! A| MCASP_TX_SYNCERROR
6 k- E# h) c' u| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
, X. k/ R, h$ Q5 F" i6 D9 u| MCASP_RX_CLKFAIL
% Q- {4 j4 Y* L% J9 \| MCASP_RX_SYNCERROR
) {% a0 }* u5 V# g' u| MCASP_RX_OVERRUN);! w) P# A# l' K e+ E
}
static void I2SDataTxRxActivate(void)
' v* N6 q. [% c8 b{2 X/ x2 h' F3 [
/* Start the clocks */; p$ j9 T( n7 c' K
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
* w" s' S \. ]. k+ ]McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
U5 V% S _$ B8 K6 o1 s* t* P) WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% p, ^) M6 m/ c8 v7 R7 X! e7 MEDMA3_TRIG_MODE_EVENT);
$ k' D! [: q- u' ^6 l! K, |0 f. _EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 8 f q/ ], \% z( w) c
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */" }! I3 W f$ Q4 A$ H/ P$ I: x! Q
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, k. c0 v( L' l- K2 c2 o" M7 iMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
! m7 @6 K! S$ _while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */* f" D1 E9 t1 E" _; a
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);& M/ I" \( W3 b7 a$ C# a' ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 n* x6 I2 j1 m+ G& P& `) U
}
7 ^) A/ D+ J/ D+ q0 T: \1 e/ B
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
# R2 D5 S, Q6 E* k- S# p
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |