嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,1 @; m* K% u( ~ z- G
input mcasp_ahclkx,3 B% }% b7 Z# |8 K
input mcasp_aclkx,
8 m4 O3 `- ]% Q) P4 }8 J. o$ B8 N' Minput axr0,
2 |6 v) _; g3 h0 ^3 j
4 q7 K9 _' g8 i- s2 j4 X! |output mcasp_afsr,
2 u# C6 f1 Q& \( P# f9 L2 `output mcasp_ahclkr,$ a P5 {" x7 O5 |- X
output mcasp_aclkr,
, x3 S6 r7 E4 g# i" s: z& c1 qoutput axr1,
. R9 A2 V( ~1 j) c- \
assign mcasp_afsr = mcasp_afsx;
* T+ m9 W, p8 ]! S/ dassign mcasp_aclkr = mcasp_aclkx;
/ E/ g0 m% O, N8 P/ u1 Nassign mcasp_ahclkr = mcasp_ahclkx;) ^! Y1 _( g- J1 q
assign axr1 = axr0;
* b: v K7 y& }) ^' }" v: J; G1 z0 |/ I+ u3 D; \1 N
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
6 u6 _) Z0 E2 O3 \
static void McASPI2SConfigure(void)
# D7 W5 {9 i) D& A8 l- {; m5 H' M{
5 X. R ^1 u3 @McASPRxReset(SOC_MCASP_0_CTRL_REGS);
( c; X; V! u& e8 c4 o* n, XMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
$ K. Q/ x( @1 b+ gMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
) N2 ^2 o8 t* t4 M) ?McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
6 H/ W8 W) v) CMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,# L1 [0 \8 h/ U1 i. l: z/ W
MCASP_RX_MODE_DMA);
) F4 |' g$ |( j& e7 A+ RMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; n" b0 }: p T. }8 i# u4 u
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 G8 s5 E" `( d2 y; H9 b! U2 XMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ; N9 v% q/ L8 S9 m0 g$ X4 ?
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);4 x) t( K5 G; i; ]! q; l# g
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 6 F1 ~! Y1 e& I4 F( Q0 P, |
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */4 o9 V" \- `5 K# x: d! i2 B
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 k$ j+ I+ ~2 r2 {
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
- j; {* N+ w- ]1 D, qMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 ` W- [/ ]$ w3 @
0x00, 0xFF);
/* configure the clock for transmitter */
, o# W2 H# o. W8 CMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; e3 f( \9 D9 i
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 h" J, @' h6 N7 c* o( k) U
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* R% A, O' r0 Z, L
0x00, 0xFF);
8 y9 l6 j) Y/ m; r) f' C; x, Q1 @3 A# e8 D" ?( q5 @. s5 T
/* Enable synchronization of RX and TX sections */ 0 S! f3 t* z$ R* G1 m4 ]& Y9 U
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */9 w1 i7 O' F3 ?! z( k
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
! h6 D$ s- ~# T: O* YMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*0 g' T" D9 T0 c! }& L' W; |1 s* H
** Set the serializers, Currently only one serializer is set as; H+ a! B4 c8 x& j- @. `5 i9 e& u& V$ q
** transmitter and one serializer as receiver.- ~8 ?! J \9 Q9 l" H8 b
*/2 U" |0 I5 I& a' s# a: T) a
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% j5 F, j# a/ W* fMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
) E/ ]; J7 H9 G9 v# c5 i** Configure the McASP pins
+ m* E. ]5 U5 ?. [; u+ c7 f** Input - Frame Sync, Clock and Serializer Rx
, s4 l. o' J) |& w0 N** Output - Serializer Tx is connected to the input of the codec
9 X6 F; ^: n" U5 I: U* c0 i5 C*/& a8 p+ r, @9 v5 b
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; u1 k8 _; T' w3 N) s4 s8 PMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
3 L; D7 C4 |( `, B% ^5 kMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX. W, k, A3 X! E
| MCASP_PIN_ACLKX! ~- F7 y0 f" M7 Q
| MCASP_PIN_AHCLKX" W' Q; o% m% Z) H9 o. d
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */. p* q0 P U" Z1 {
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR : j5 v2 T) E) n' e. s
| MCASP_TX_CLKFAIL
, B8 F6 O% G+ [; o# m| MCASP_TX_SYNCERROR3 C$ h% M6 o% t; N7 g7 G
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR . g- M Q" X7 N
| MCASP_RX_CLKFAIL! n; T' B5 U8 H" v
| MCASP_RX_SYNCERROR , a( T9 V9 B2 m$ w
| MCASP_RX_OVERRUN);- `0 C$ Q5 _4 |4 f% f
}
static void I2SDataTxRxActivate(void)
2 [! Z* E2 o2 y+ j- e{: V- |3 w# c$ l- n1 t
/* Start the clocks */6 ~1 Y' J1 Z0 _3 ~/ W
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);) J, Q# l! s" R" {+ ^
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */* q/ L# w( n, `4 q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( ]% l$ \: c) D7 _: A
EDMA3_TRIG_MODE_EVENT);7 G! B% f! M1 O3 f+ M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
, a; c# G+ M; j$ TEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
+ a6 k$ M( T' ]6 s g6 A; {5 xMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ G, N# M7 L' m* g4 ~3 h" KMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
P& k& H! s8 F7 Hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
, A2 i q& Y9 q, x: [/ o' uMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 J1 P' G7 P- w c( a& e: j, p8 q; E
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);: O% v1 X, D- C( }8 n: N, Q
}
1 U7 N2 T& g& e) f请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
' ~; |# p6 M7 K* R& q3 I5 E
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |