嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,% s2 C7 [9 U! \
input mcasp_ahclkx,
' G" h' s, o( A5 {0 zinput mcasp_aclkx,
9 t4 B; C+ L ~0 Rinput axr0,
- j5 T& M2 S" _1 }0 [
& w" n5 |, B( b7 c; M1 doutput mcasp_afsr,
8 \* ?5 C4 ` R0 z% A, u7 ]output mcasp_ahclkr,7 X7 ]5 h4 Z/ d d, c
output mcasp_aclkr,
! m0 J9 E* L7 D7 V P. _ Y% D' M' M+ m8 coutput axr1,
% ^# k ]: u4 J. `& k1 g3 M
assign mcasp_afsr = mcasp_afsx;1 m; J# ~9 Q8 ]9 x/ Q
assign mcasp_aclkr = mcasp_aclkx;
9 }* u1 ]% R3 i6 K% F* a- F, Cassign mcasp_ahclkr = mcasp_ahclkx;
# ?7 G, k6 i# ]- t- R( dassign axr1 = axr0;
4 ^; l2 f r7 ?* x- m0 ^
0 n3 E# O- p8 a) {( J4 d
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
. n* ]1 G- F- {3 f1 V* wstatic void McASPI2SConfigure(void)
8 }% ]) K$ I5 `, u/ |; ]{1 q; N" ]0 [) s' A2 K+ n5 Z" b" o
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
8 {$ @8 _; U8 }' E( t$ U1 BMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */ W) e$ W' m) D, j) v1 k4 c, [- i! T
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 o& H5 W4 _1 g. ~* U7 ]- lMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
+ y: X' v, k9 J' l* R9 |! RMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 p1 U6 h6 ^9 \! t
MCASP_RX_MODE_DMA);
6 n$ }* t: h) k1 LMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 D# A/ J8 F; D( A/ W5 \! j2 RMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
( C! { S3 N. GMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 L8 s. q/ W5 S. e4 u9 _# O# F
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 s4 }3 @# W7 O5 a; T
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# k. S! t. o% Y7 [- P: ?5 tMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
3 P+ }8 v X, G: m' @McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);8 K! _/ g' m- T- n- x
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % W$ f; T9 X h5 u! [1 e" | x
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,$ j- e$ ?/ ^; `; A- m
0x00, 0xFF);
/* configure the clock for transmitter */
/ _ c4 L4 _# s, S' xMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 U$ \* {6 Y$ lMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
U/ p. P' E8 B0 l* P$ G0 aMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: E$ ~! @) \% ^0x00, 0xFF);
& h m# N* j2 X* i: Q9 }: i2 ?% {9 H+ F N' b: f# H
/* Enable synchronization of RX and TX sections */ q. S( K2 B2 s+ @# P8 T$ F+ E
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 W- I h2 ~1 jMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
- i% {6 v' f( t' A }' l4 \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*4 K# P2 v% c5 d! [( C) E
** Set the serializers, Currently only one serializer is set as
, S" A w" w! M, d, B, |: t- w. Z** transmitter and one serializer as receiver.
" M! V6 f- A: X* k' {/ @# O*/7 ~3 n/ o1 j0 v$ t8 P
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); k# z/ p+ J8 o2 {0 ^- n$ V$ b9 b9 \9 }
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*6 O. a/ O5 l& {* {1 \& U
** Configure the McASP pins # n$ d; m5 l+ b; z4 [; c* J) i
** Input - Frame Sync, Clock and Serializer Rx+ ]% T! x9 n' v3 `' A5 g
** Output - Serializer Tx is connected to the input of the codec
Y; E% m: z. U; V( b/ M*// ~# ?" c7 z r, n
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% `- f* D8 ]& P/ K2 I$ C; hMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 ^" a4 S9 O* `8 K7 k$ ^* SMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
5 D9 s* K# g4 k) ]1 r, \' o| MCASP_PIN_ACLKX
: T \$ o0 p( Z/ w. X' n7 O5 G, p| MCASP_PIN_AHCLKX2 k3 y n1 {* o: a! _- g$ Y* H8 U
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */3 I. C7 j o0 t$ f
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
. P5 _) k4 b: L2 `| MCASP_TX_CLKFAIL
3 a r3 N+ L) o* {! u5 w| MCASP_TX_SYNCERROR/ z7 y _8 y! a
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * c4 X- ?, n# G1 k- A6 f+ H
| MCASP_RX_CLKFAIL4 x7 J8 i4 ?' x7 E; h/ W
| MCASP_RX_SYNCERROR 6 f. y6 [# e j/ r
| MCASP_RX_OVERRUN);
3 k( r5 x. h4 R}
static void I2SDataTxRxActivate(void), d; T1 B. L" Q+ o" ~. X
{
) X' q; l" n! W& f* I* D: C: d/* Start the clocks */7 _& E1 [& _8 ]% U1 n; k
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; F% O% g- c5 N% Y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
, }- J, \0 u) l7 L) D3 x: SEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 j0 P6 g6 x$ I# {/ ~% ]/ G7 k
EDMA3_TRIG_MODE_EVENT);' G( O3 i4 R. m: L: ^
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) H0 r$ S( {0 v+ x1 H) p1 J
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */ ~9 r) S' |: u* V; u. Y7 J
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
# B5 O& }* K* UMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */9 H+ `6 g' Z# z5 n5 z7 s% B
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */( J( y* M I7 N/ ] |
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* s" w6 E$ O' HMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);- U* y5 h1 K' \) M8 L }* i S
}
; G1 C) J, v" h2 _& u
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
+ h1 \3 Z0 G: Y+ M
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |