|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,3 _7 c! x" m/ a$ I h
input mcasp_ahclkx,
2 L/ O1 J1 P: t5 b- zinput mcasp_aclkx,
: @9 l5 M, l4 G2 Hinput axr0,
' s! T# `- ^: ], O0 Y g2 l6 W; j* P- m) H( N; T7 w: z2 d" b
output mcasp_afsr,
8 `: i4 o: j' [3 _1 ]& \output mcasp_ahclkr,; v! _ b3 @& u/ V2 _9 R8 c3 g& P
output mcasp_aclkr,
0 d8 N# X g: z* j4 poutput axr1,$ i* x7 C. p; t" X; ~) @$ b7 E
assign mcasp_afsr = mcasp_afsx;1 s1 X$ W2 [( G, R- J) R+ S3 t
assign mcasp_aclkr = mcasp_aclkx;
2 q+ }& k; Z- A& }/ o/ jassign mcasp_ahclkr = mcasp_ahclkx;' x: r o7 ]( `* M0 s
assign axr1 = axr0;
+ o: d8 e. L/ C: \
, ^3 }" f6 N% P2 y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
5 Y( }/ X9 \! D8 D2 |# B" ustatic void McASPI2SConfigure(void)( p. e" a9 q; C
{
; e, k" K5 L/ H6 i2 [7 oMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
) Z: K+ C, t, U% U3 K$ [( O* N( IMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
+ n; I# T8 @' o }. OMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);$ N- ]6 ~# T/ [7 v, [ P
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
+ H: e& P3 p a$ O$ I" uMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) l6 |% [% O6 k" |MCASP_RX_MODE_DMA);$ J, \ R4 z" K& |# z S8 {, u- q
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 t2 P" z7 N1 K* ?. Q
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- |- D; H6 B9 @$ V: u
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, J) b+ ?1 u1 o! G& iMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 ~; z. D; Y9 q4 }+ A8 L! CMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& ^. D5 Y* S2 T8 ~$ ~8 p* y# }0 oMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# Y' ^; F; M% K4 Q1 w# f; [McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 V4 F/ h; D+ z: _- [, u
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) W: b6 C" C0 @ F0 T) [+ x
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
& A- p9 m! k( c. [; ~0x00, 0xFF); /* configure the clock for transmitter */
) N7 E9 b6 U# _+ l9 KMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);8 f5 R7 B. K! o( P
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) z9 I$ a: x- |( NMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,1 |( V6 `* i4 U3 h j0 v% G1 v
0x00, 0xFF);8 t( @: l" A1 p& k7 ~9 w
. n/ j( S' b" M6 i- Z; v% g5 Z/* Enable synchronization of RX and TX sections */
) K# E7 H5 F3 e' k5 wMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
( I% P: C D6 q$ _McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);+ S$ a- S' \: O6 ~0 n8 O% p
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
0 r7 L- e1 y/ R/ U P** Set the serializers, Currently only one serializer is set as; v# `; ~, i" } \) _- o/ V+ q
** transmitter and one serializer as receiver.
3 W5 S7 h/ }5 n1 H* j% y2 ~*/' K9 ^. L# g F3 m
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 M! \. ~( S- U `( R* |" l8 HMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* `8 H$ ~7 [: ^! N5 k D** Configure the McASP pins ' R! J5 |7 R! f" c* G
** Input - Frame Sync, Clock and Serializer Rx
, {1 Q* R+ E% B8 {' W** Output - Serializer Tx is connected to the input of the codec
9 n1 A# h& S; Q% w* z*/
( S, e" M) \6 E) W5 c6 EMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);6 L4 ^. F! n" Z2 S, t: O/ T
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));# g1 [3 ~: I5 Q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX) o$ w8 l+ J0 i$ y; b& P' h$ _* d
| MCASP_PIN_ACLKX5 Y! s6 E' i5 A
| MCASP_PIN_AHCLKX! K% T( P( w' A$ [
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */. h% b4 p) C0 N/ J
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
% X) `" O+ M$ x& b| MCASP_TX_CLKFAIL 3 U2 y5 l0 h! _8 B' I' D' z! H
| MCASP_TX_SYNCERROR
2 x+ j( W% {( v% T$ I| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 w k, p& C. H# K0 ?
| MCASP_RX_CLKFAIL, D+ f: H. A6 g
| MCASP_RX_SYNCERROR
; R; Y8 l+ J' _/ F. x| MCASP_RX_OVERRUN);* U, z2 k: g( P3 L7 y
} static void I2SDataTxRxActivate(void)% Q* q$ n# c7 M8 Y: `% B9 |5 a% {
{9 o- n3 |6 S# L! s5 W
/* Start the clocks */
3 n5 z- J0 p* y j9 vMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);9 q" q; a" j8 {( l5 D" Z4 Q
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
$ R! r: t$ n% @% w$ i7 hEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# ?4 i; q" e, n' E9 G FEDMA3_TRIG_MODE_EVENT);$ J3 t/ U5 P1 O+ G
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
- X) F- e, V- ?EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */8 v9 G3 q& K0 N; f2 X- k4 r6 _
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 y" H- f3 y" V! ?7 o
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
4 g) d9 Z3 ^' x8 o, wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
0 m( e5 s9 w+ p( `/ M: b' B1 M3 ^McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
9 [. q3 l$ w2 {6 P8 h& K/ }McASPTxEnable(SOC_MCASP_0_CTRL_REGS);; b1 S9 B" J0 K' L/ G7 A+ E$ I: {8 B
} , E8 Y& w: i) \, X7 T
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) j1 r# S! j/ s! V& U |