|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,* ^9 W3 L9 Z+ S) v( I$ N
input mcasp_ahclkx,
/ I O, B1 p5 t6 }input mcasp_aclkx,9 |# d+ H. }8 p8 t6 v7 t; D* u8 k
input axr0,/ _0 t6 G2 z4 ^0 y1 u
5 v$ A' O7 A& l6 P' J" goutput mcasp_afsr,1 s1 ]$ i" x8 \
output mcasp_ahclkr,
6 U. _/ W8 X# w: |output mcasp_aclkr,
, f( g# R# a- g5 }4 {output axr1,) N+ P0 V6 t& m6 B: b6 C
assign mcasp_afsr = mcasp_afsx;
. D4 t2 s0 J2 K8 R" e2 g5 massign mcasp_aclkr = mcasp_aclkx;
6 ?# l2 T' n- T7 rassign mcasp_ahclkr = mcasp_ahclkx;
) v- A0 @) j* o: Fassign axr1 = axr0;
& B3 `1 K. k% s" z9 B$ V
; \) t$ {% U$ ^; Q在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
8 r) v$ m2 M8 G4 ~0 |' jstatic void McASPI2SConfigure(void)
q; t: z0 M! p2 W) N5 a{
) e/ A" O1 ^4 c( |" o7 }McASPRxReset(SOC_MCASP_0_CTRL_REGS);
* R$ ~3 e4 [% h9 V aMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
* s$ o2 D( [, FMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);( Y% `. E) M7 H$ r$ Q
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 F0 h: R( [0 f. b3 i
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 {+ e/ v, a7 p( V
MCASP_RX_MODE_DMA);7 w$ ~# l- `3 S' |# J
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ J3 y0 t$ D$ T7 P8 t
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
' W4 D9 k& J: D% Q3 zMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, + ~/ k1 y O9 Z! p1 d1 B% z0 f5 \
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
: @. I) i& X4 V( T7 }* b* a5 D( ~McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& A7 b$ n8 K$ r& @6 ZMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
% e2 O% Y/ Y) D# p* z! w' bMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
2 ]8 k/ C: q+ b6 H" H4 G. d0 UMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
3 H' S5 N* U2 {/ \; W$ j% ^: QMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32," B% o5 a- z$ a) }7 C
0x00, 0xFF); /* configure the clock for transmitter */
- r1 g: d6 d4 N# H6 s0 ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);0 h, B) m7 [4 U7 R
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
# b* ?7 p( F+ QMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
$ w; u- H2 H9 K' W9 y. h0x00, 0xFF);4 K2 x2 O6 S& _2 D
- i1 l" y. U1 r$ }
/* Enable synchronization of RX and TX sections */ 8 a' V% b, ~% {5 H0 C2 H1 J" ~
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */& O0 @6 L: S) E; A. j7 W
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);9 ?. ~: N' I7 |9 D3 p
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! x' E5 `2 [ m8 x) D** Set the serializers, Currently only one serializer is set as
% f3 P1 w& q! V2 D L) p** transmitter and one serializer as receiver.8 W# l! O7 W3 T7 c
*/
- \" j- N8 H" LMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ G7 i8 B3 ^3 s9 |McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
& B) p9 U8 ~% L4 Y D0 V** Configure the McASP pins
: K x. D! @0 y6 V, y( v** Input - Frame Sync, Clock and Serializer Rx& k" L2 f. t" q/ |% l8 s- F, ]/ @
** Output - Serializer Tx is connected to the input of the codec - [. Q0 J0 i* w! _8 G
*/
8 C; v# [7 }: T; j' A' gMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 J2 _% `* r' B ]4 AMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 \! U5 m4 A) W3 p' RMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX, [! g) E, K1 @" u* j
| MCASP_PIN_ACLKX/ ^" c$ O) H: D9 j+ u$ d
| MCASP_PIN_AHCLKX
( c# V$ i( @4 M3 }) G+ q| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
' F6 Z. h3 i' B6 PMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
" n' s- p1 }( z) R; U, h' E| MCASP_TX_CLKFAIL
8 P# ~' V0 Q( ~% i2 {: _: N| MCASP_TX_SYNCERROR$ i6 v! R' C/ S+ k
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR # z- b/ u9 C8 M) [
| MCASP_RX_CLKFAIL" `! }& @& b; n* K# ^$ ^' @
| MCASP_RX_SYNCERROR - e9 W) p, k0 `1 M. k7 q7 X
| MCASP_RX_OVERRUN);
+ E: r2 S$ }7 |8 O} static void I2SDataTxRxActivate(void): |6 T; J8 {3 | P9 ` ^4 V
{
# }% W' G9 @& R' Q) J+ B4 Y$ B4 {3 W/* Start the clocks */
& B+ v! h, m9 b8 B& q, a3 jMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
U2 G5 Z; n* ^McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
: r& z0 s6 a, w; Q* X+ TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,- x& T' G% s2 W5 e9 \/ F
EDMA3_TRIG_MODE_EVENT);5 Z) l" y& Y9 |: `6 S! t
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; c9 D/ r; Y; s9 V
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers *// H% f; u2 ]9 L' r0 j0 C/ y3 ^
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 z; a4 s& E& {" R" n5 }# y) DMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ v# _# e% h. c: t' P) w4 Qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */# Y8 E( v8 Q$ h) O- j$ v/ }, L
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 K0 g, G4 Q# b. K& m6 X% }McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
3 q" T A: Y% T, e4 j$ }; ]} ( V* K0 d8 q! K
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. * A' L- C, S$ W" }. c C: k3 J
|