嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
: }3 u5 I* N( u, F! O8 dinput mcasp_ahclkx,7 \8 L6 C+ z7 e6 B
input mcasp_aclkx,; B) W3 J" }! P' m2 Q( i) p
input axr0,
( M8 f+ t; \* C9 |' h
# I0 g) j, o1 O4 x- Youtput mcasp_afsr,
, u3 U) G9 J, o" ?1 I1 }7 Noutput mcasp_ahclkr,- q5 {' Q( Q" ?& b
output mcasp_aclkr,
8 _; {* \( |: [4 Z* R; W# ^output axr1,
2 l9 c, @' m1 z
assign mcasp_afsr = mcasp_afsx;* c; w6 S' i8 k9 `; M
assign mcasp_aclkr = mcasp_aclkx;' R9 i# ?8 E) L( D5 x# T8 g2 O; p
assign mcasp_ahclkr = mcasp_ahclkx;
4 r; ]% L- J# P* L4 a1 b5 u* S3 r" T- Xassign axr1 = axr0;
3 k7 l0 b4 f: B; W2 x7 H! ?3 U# P
( z" a0 _* ~. O6 x7 r7 h
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
9 R6 r% z9 Z1 Z+ _2 G
static void McASPI2SConfigure(void)# P* h0 r" _+ I, W" m; N1 l
{
. `7 ]! Z5 T' N% \' Y# l- aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
: _3 n4 a# D5 c: {9 }McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */1 `2 t" y$ ]: u2 o
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);( I6 u) c- i6 F; e( h. N
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
. O& r5 p. v5 A/ pMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; [' ^" [' H: _1 ^
MCASP_RX_MODE_DMA);9 O5 i8 W& w5 e& h0 B3 S$ T
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 q5 D4 z& x8 e# W2 m* h
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" G$ ~& e3 C: c: K8 m' iMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 @6 ^" i5 c# t1 ?: ?MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ J' E4 v1 s# B# c" q
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, / i3 B# P3 r( z8 U+ ?
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
+ J& S6 T; T& j+ J! d7 GMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 q( U4 w( F% {! e! F4 |McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; Q; f; z9 \4 f6 F& _/ H
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 R$ c; e; J; p+ R9 P4 F5 X0x00, 0xFF);
/* configure the clock for transmitter */4 V8 X2 O8 ?8 {9 S
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
' z& M' ]/ H, A' jMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 n' y7 B' F$ {; a- U' T
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 \- | Z$ [% R9 i! Y0x00, 0xFF);& n" N, A/ Y, P9 ^) [; R, Q8 w9 z
# N3 S" W& z# p! B
/* Enable synchronization of RX and TX sections */ # W0 P8 F. f- a4 ]6 b
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
+ J& d2 N% V9 v& B4 Y4 X# RMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
" Y. r7 V. }% T9 c& z, gMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
( F! q. n x% p2 o+ K; x** Set the serializers, Currently only one serializer is set as) X2 P' B: [; d
** transmitter and one serializer as receiver.
+ _- [, E/ g5 [/ I6 a& ?- m' Q6 A) c*/0 l7 ` E2 ^7 _9 ^! P
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% T( Y+ }1 [% V9 RMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
4 t$ p3 r; b% P7 V4 n** Configure the McASP pins
8 v9 w( h+ s2 c0 ^! M# A** Input - Frame Sync, Clock and Serializer Rx
8 M4 A+ o6 {0 u6 {5 P( C** Output - Serializer Tx is connected to the input of the codec ; h0 o# ]" A) {; Z4 g( Q9 F
*/
- F, W0 J+ {2 I% \" E: x: N: ]McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
& `# ~ E+ _/ B6 x+ M; N+ kMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
" h9 w! w) B; u0 }5 B- P$ C9 ^5 wMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ G/ [ i+ A8 E3 B3 v- E
| MCASP_PIN_ACLKX4 g. o8 e+ J; T/ |( Y! ~; ^
| MCASP_PIN_AHCLKX
- r& w+ g% H5 q4 S- I# _| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */7 ^, o7 L7 D7 I- y" d3 l3 H9 I5 ]
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ( V/ |5 H, Y0 ]5 ]: s
| MCASP_TX_CLKFAIL
0 B" X/ h; m" g/ [' q& q| MCASP_TX_SYNCERROR9 A, Z5 ] o) {, D' A
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) Z. d& O. R/ w' b( O2 N% k: s| MCASP_RX_CLKFAIL
% G- I0 B1 c% z- m. I, Z0 U7 D| MCASP_RX_SYNCERROR ; }0 L7 }+ U1 v; A% z Z+ U! m' K
| MCASP_RX_OVERRUN);
# v9 d9 X0 h6 G( D9 b}
static void I2SDataTxRxActivate(void)6 z6 e$ i2 @6 I( ^* i" s
{. n% P5 Z/ s- q1 d' V
/* Start the clocks */2 |+ k$ @0 d1 J* D% Y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! M& H8 F* D+ B! \2 C9 [McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
' s" U" P" x& B( k9 e2 W! wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 f5 r9 l0 Z0 G6 g+ t3 L+ w5 I! b
EDMA3_TRIG_MODE_EVENT);
& p, _7 i8 B6 p: U {EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & c6 i [$ I# X) H; Y" R6 @2 X4 Y
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
1 W% B3 z1 L& U" p; v1 \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
n. J3 j2 n+ }6 d( p* }McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */9 q" s/ R6 a; ?* h5 D- @
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
. x, y" W6 M4 {* W$ r* P/ DMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
, v$ M8 k( X% E6 nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 D$ a# f6 G3 |* ~3 t, J; P# q0 F @
}
1 R% k, ^/ @2 J/ T1 Z; ?
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 t7 ]0 o& {5 u: B5 w u
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |