|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,7 W2 {' l* ^5 J3 l1 h8 Z
input mcasp_ahclkx,1 q2 G6 B# h4 u. L, ]! j5 f: o
input mcasp_aclkx,
- A% f% T: @3 b, o/ kinput axr0,
9 l J, S( @! U4 ~6 K% _: G9 _# b8 X
: p, ^% j7 Y) L: ~output mcasp_afsr,& Y, ]4 x% G( r' C2 i5 g8 ^
output mcasp_ahclkr,
9 }% d) S: M; A+ m$ Q( r0 A% koutput mcasp_aclkr,' T) Q. t8 d, ?" c' T. P7 W
output axr1,
: a4 ]! j2 t2 j& @& d' { assign mcasp_afsr = mcasp_afsx;) X ]/ p3 N; B7 F& h7 t: D
assign mcasp_aclkr = mcasp_aclkx;
2 W6 o& N% y& }6 e# Z( [assign mcasp_ahclkr = mcasp_ahclkx;4 _6 S7 O5 O! l) x; I; o
assign axr1 = axr0;
2 Y4 n. Z5 t0 W* @2 ~, L( n7 V5 U3 n, C" E" D8 r' u
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
( c/ G8 w- r6 N+ ?1 S( tstatic void McASPI2SConfigure(void)
- U! T/ @" ?$ Z6 i; @3 F" z{
4 S1 G* L) [! w4 [7 r AMcASPRxReset(SOC_MCASP_0_CTRL_REGS);. F: N# n% ]! S& B' ^; f
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
4 r b+ c! y$ n; |* HMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 z- J& I2 j; f
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
, N7 z- b3 n0 t$ L% |7 m' fMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
C' I, j* O8 iMCASP_RX_MODE_DMA);& A) `3 U; A$ \$ I" t
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ u# ?& X' {8 H- _' CMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */& W$ l: s' W" U5 ]" S5 {/ e/ _+ E
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, $ @3 X: P. L6 Y6 }
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
3 ?( U# U4 T y( Y1 u6 ?McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 S8 G, d$ S! P) a, A
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */8 `2 b8 w4 Y; [, ], x
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, j4 b1 g7 Y# cMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" A" Q# k$ o/ M$ sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
% q T5 g5 R6 [0x00, 0xFF); /* configure the clock for transmitter */# T' Z! w3 e7 m: k G! z& E) m
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
* y; f5 j# V& C# T2 ?McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 s, K: M& ^/ s0 ZMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 A, X$ U7 a6 F! s7 v0x00, 0xFF);
4 r/ c% Q6 \% g9 x" Y' B# {1 A2 ~" p" c" I8 W u
/* Enable synchronization of RX and TX sections */
) T6 Y }3 X' G7 K5 | d) DMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */+ t9 x1 c0 M8 D
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 v6 F5 ~5 f8 { q; N+ }
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
2 _) i% } k4 Q+ J/ P** Set the serializers, Currently only one serializer is set as
' |( |% O. s6 ]& [" M3 k4 l$ m** transmitter and one serializer as receiver.8 h9 G1 F& s: @4 f" g8 x# o5 m
*/" X' ~( N/ d( _
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);. q, b# i$ S& @7 b" q- K
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*. x. g/ v4 h# d J
** Configure the McASP pins 1 O4 `: ?$ Y5 n# p- e/ B
** Input - Frame Sync, Clock and Serializer Rx0 P9 I) t& a" o
** Output - Serializer Tx is connected to the input of the codec
+ s; H! P: Y3 z% g*/! s2 J; a' C( N2 U9 c
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
" j" n+ d- J' e4 n5 qMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));& G6 Y# S7 l7 t: I; ~
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX3 m0 P; m' t4 i
| MCASP_PIN_ACLKX$ U" z! B# S& o+ l1 u& z. M; y
| MCASP_PIN_AHCLKX9 f2 }1 q4 r# w
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
4 B5 I! c' [, J! I) f! O" HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ [; ]) B& } O) p: O) t4 r| MCASP_TX_CLKFAIL O' c; O- A$ S0 P" [9 O+ C
| MCASP_TX_SYNCERROR& C" O" O% ?8 g. i
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
t9 e8 U A! v5 y5 P1 C| MCASP_RX_CLKFAIL0 j4 U5 `2 k M5 \- U
| MCASP_RX_SYNCERROR : s; c$ w3 {" f1 s$ U
| MCASP_RX_OVERRUN);
% B) U8 I! y7 I2 J! A} static void I2SDataTxRxActivate(void)7 {. U J0 A$ v3 y: ?! m* ?" v4 \6 j
{
7 M3 C+ X* X5 \7 b/* Start the clocks */
) P- J. }: c; K; L' t% C( fMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
& d3 C, v/ Q0 e. d5 n F* RMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */# K3 Z {8 `0 O. w6 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% Q5 g0 r( t/ w9 X6 Q6 C) n
EDMA3_TRIG_MODE_EVENT);
' w5 {1 R7 I! Z$ ]" X- h k0 Y: @" pEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# [" q5 X& E) R) E2 Q6 eEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
4 B" t7 \- P( k* sMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( d( G/ c0 J- sMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */1 j: ]( f4 c7 F* v- z' @1 y. a
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# Y }* N9 z. _+ a/ a0 r
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
$ R1 H3 q5 O: ]McASPTxEnable(SOC_MCASP_0_CTRL_REGS);6 X! n% K5 ~0 a: H& g$ l
} ( F6 C8 Q1 _/ [$ F# ~# D' M9 K5 e$ d
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. : I( }* _6 c( \: r1 x$ A) ?
|