嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,' f$ W& p% } k; x+ G
input mcasp_ahclkx,
4 `( t, P7 \5 ?. Yinput mcasp_aclkx,, V+ d8 X2 r; ~8 q
input axr0,
3 @( m2 Z2 G( z6 j o8 n2 v
( s2 }/ @( I+ |: joutput mcasp_afsr,% w0 d, E4 a% G/ W p i; I
output mcasp_ahclkr,
8 D( @: |' n- K) Poutput mcasp_aclkr,1 U$ r! w5 E5 G: h/ x! L* c' V
output axr1,
+ w# V4 X) D. k% n9 @/ u
assign mcasp_afsr = mcasp_afsx;
( Y7 `* s8 n1 L9 u1 Q" f: ?assign mcasp_aclkr = mcasp_aclkx;+ x& P4 z8 F- M1 d5 V
assign mcasp_ahclkr = mcasp_ahclkx;; A, K; c ]& j; q
assign axr1 = axr0;
/ M9 A! h7 S, `7 ?
, ?9 `" b' q, D( I. F: _. G# I: q在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
: {* _( A# J% ^$ R$ x
static void McASPI2SConfigure(void)" S8 n/ N% Y6 o+ q( h- F
{8 X+ f4 U5 f* O! n
McASPRxReset(SOC_MCASP_0_CTRL_REGS);0 H8 V) q' v" y" ^4 V
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */) f- e) a' d; J' l/ T3 ~/ A! B+ ^
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
( }9 I$ x; p7 j# C; Z! w& O0 g5 f7 t8 \McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */+ f: L$ l# ]. ?( s8 T1 n6 J5 `
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; Y$ k3 S( v- s |7 XMCASP_RX_MODE_DMA);
* j! _9 Y8 `) u- W# dMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. E8 C4 Q0 s! u: P* A; A# J) V
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */# R3 t3 H6 O7 E9 l( L6 a* D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
8 b/ M# u Z4 K" o0 G9 fMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% O( L. n6 T3 k; R' v8 v+ u6 o1 U( hMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 p" J% e; b( [8 d
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */) w9 o, E& s& X) X9 H( d- n
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! y' o9 O+ F: e% W# o' U
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( M% p/ t0 k1 u1 W. }- w+ W
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 e- \) V: H1 X& {' K0 t7 s0x00, 0xFF);
/* configure the clock for transmitter */4 t# x' X& I3 i, c/ u9 C9 n6 l
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);: E5 S @9 F3 p; c
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 N9 ?+ s M! s# g: s- B+ k& ZMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 j3 u# t7 Z' m# L/ f7 G7 @4 k- N0x00, 0xFF);( F- B) k w9 t
; v X2 M7 f5 E
/* Enable synchronization of RX and TX sections */ r+ i6 }& s0 }7 C2 R! l, e
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */% c' o9 c# M$ [4 b: X3 h2 e E
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( A* q$ K* R6 H! Q/ ?/ R% G
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
8 C; X& f; G( \6 f** Set the serializers, Currently only one serializer is set as8 T; _6 Z) t2 J- k
** transmitter and one serializer as receiver.3 V5 {* `7 z& m+ z- N5 M
*/
" t( w+ H1 p T% m+ x) ^& c8 m9 jMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 B4 s$ Q/ Y# Q5 t6 u( }McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
; v. Q/ @0 k# ?. s. h$ G V** Configure the McASP pins
# n# ? x/ C4 a- H7 p** Input - Frame Sync, Clock and Serializer Rx/ F" c( J: d6 D+ |- x0 |
** Output - Serializer Tx is connected to the input of the codec 4 q6 N& `0 O: a( w* f2 H
*/) F/ {& s( Z! J: b4 E1 I
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
, s2 B1 d+ E$ i$ RMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 f) x4 H' N- h' o" G
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
- B" | p# o: A| MCASP_PIN_ACLKX
9 ~: S, Y! _6 Z+ Z; D2 Z6 \; E| MCASP_PIN_AHCLKX
) N5 G1 O% v9 S0 t. Y7 c2 z, k| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */" s$ F* F0 j8 J: n, k
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 F, Y% B% G) ] D* x3 H
| MCASP_TX_CLKFAIL {0 V& T6 B* t& {! @5 W) g
| MCASP_TX_SYNCERROR
$ F" B4 F3 C, h4 _8 k% j! r, j8 O| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 g$ Z h- e- d8 F2 V1 X k
| MCASP_RX_CLKFAIL
4 X. ]5 `( E' q" m4 n: g: M; g6 Z| MCASP_RX_SYNCERROR
+ P0 |$ q3 T; a3 S! O| MCASP_RX_OVERRUN);+ {& R1 i# E+ G! y6 o8 R) ~( x$ ]1 y
}
static void I2SDataTxRxActivate(void)6 X9 p2 J9 g4 B, J; Z/ J
{
9 t( z' z& R9 x3 M, j# W! ]- |# n! `/* Start the clocks */
+ g/ N) E# w1 a4 A9 Q; HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
G6 S: R4 b8 P. g. B0 IMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */' d: y2 P; a% |
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,+ O; c3 s+ n" k2 `- p- n
EDMA3_TRIG_MODE_EVENT);
8 \* R+ E9 |8 W7 r5 SEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 H" x3 I5 B1 {
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
8 Q" m" ]" B/ P/ D! {McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( M5 x& E, @* |+ h; z5 }' M& ZMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
! p7 H# p* f+ \6 r% O; m+ _while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
( F4 Y1 D$ L! H5 v! {# ?McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! U; {5 C, ^9 d/ H2 @6 ~; _* oMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' X5 Z2 z! r Q( t7 i! I}
& @: ]- ~/ D5 O. z# T请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
$ d! y$ {' Z5 @/ z& g9 s' Q3 ^% g
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |