|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,+ s, n6 {' `- H# E. e) a
input mcasp_ahclkx,
4 t4 m9 j! f" `! u, u+ Hinput mcasp_aclkx,
, u! s/ A; I* ?. s R; Einput axr0,
3 m& Y) z7 i/ B0 W0 }
\4 F. n' o+ _output mcasp_afsr,5 q, n7 |8 Q+ e5 Y
output mcasp_ahclkr,
+ f$ f1 B# T; A$ b8 Woutput mcasp_aclkr,
$ }+ Y0 H( c. Z. i* l, doutput axr1,
' t/ N2 X- x7 t1 j3 D/ v assign mcasp_afsr = mcasp_afsx;* H4 e' X. a" C, B, \6 ~
assign mcasp_aclkr = mcasp_aclkx;7 O- w1 `0 s' g( j
assign mcasp_ahclkr = mcasp_ahclkx;
4 |: m% D# p5 z! Fassign axr1 = axr0; J5 h" o7 p, ] X
! z) ~# Y$ w# O+ o) L
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : Q5 ]9 ]) w3 v0 G) c. K
static void McASPI2SConfigure(void)
5 p9 y% ^2 |, |3 X) B0 \9 Q{8 A8 S/ K$ \4 | B* Q( W* J
McASPRxReset(SOC_MCASP_0_CTRL_REGS);- L" g4 P6 v+ h# h& y( h6 Q1 F% y
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */2 b4 U, c# {& S! H3 O$ R
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);; d7 v& C0 h- g) q6 B/ p5 G5 S
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */6 K0 I; x n& C- h9 p( M8 O
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,8 ]# U" @8 Q' d
MCASP_RX_MODE_DMA);
9 I* Z7 B, B6 @1 Z- vMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* |$ E" c2 X# L! y9 W
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */( M0 X7 T; j7 M0 B7 H6 V
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ) X' ?( I' R* K; ]
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
4 c1 I1 b4 _3 @) D& C9 V& @4 |% RMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& C$ u* f3 f7 L" n+ WMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */2 J0 ]# n; X* S" f4 I
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
9 O6 Z' n' ~3 `: A5 T RMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 7 ]6 ]: n+ D |, Q1 S
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
( C; H8 ^# b4 G$ t! D2 W, J0x00, 0xFF); /* configure the clock for transmitter */& q/ r2 ~/ ^$ J) h+ V- |) v7 R
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);- p$ Y* e, W+ M# T
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- C0 a! y# d1 I9 Y$ i) IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: D; _2 q& B- D) e, B, f0x00, 0xFF);* P, V0 M Y* m! K8 I% \5 Y! x4 F
2 d) } p) p1 c/ n* T' o1 M/* Enable synchronization of RX and TX sections */
8 q* E) v, [; V8 t9 q5 QMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
0 B5 |; r+ m3 ~McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/ ^; @9 x8 `8 i: t, O0 H+ [McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*" L$ g: M% f, `
** Set the serializers, Currently only one serializer is set as
" {, Y% s' k6 i2 p** transmitter and one serializer as receiver.
% `3 G1 B! o+ K: S7 H. l, u2 F*/
; X) B1 D% ^5 x9 _7 p' D; I) JMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& q; ]. {! ~, w$ C8 D B1 ~McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /** V2 Y5 d$ ?* U& U" f# |7 Q
** Configure the McASP pins 8 z1 G9 R) S; q9 P- C
** Input - Frame Sync, Clock and Serializer Rx
+ R# x5 F8 m) Z7 G4 g2 X** Output - Serializer Tx is connected to the input of the codec
- A" h l3 _" p6 n*/
1 ~9 A( q5 g, U3 L* x7 TMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( ] v4 @9 l' H, d! U
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ [# `$ P( Z/ I5 S+ _$ JMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
6 F, ?* o7 @7 d4 q0 l| MCASP_PIN_ACLKX; W& |) i' S: a# v
| MCASP_PIN_AHCLKX4 O6 a. L9 c) `; W
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */: e+ D, u/ p9 E' A8 S7 K
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 R) O" g% _5 d5 G| MCASP_TX_CLKFAIL : @1 B! X. S N8 }$ ^
| MCASP_TX_SYNCERROR1 e7 R% M# C; l& }$ A* `
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 q- ~: p+ \4 l7 W| MCASP_RX_CLKFAIL
. |( _% A+ |& D" c3 d% l$ l| MCASP_RX_SYNCERROR 6 u) }$ o' t2 b3 y0 g
| MCASP_RX_OVERRUN);
3 I' M' O) L4 w+ l+ I& c} static void I2SDataTxRxActivate(void): v: k2 R+ m/ z" d
{) S K* K: D" k3 w& j# o
/* Start the clocks */
- y3 n2 x# k1 c( [3 \McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 g- n) }3 E- eMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */ \! g0 L* K0 C9 k5 Y+ g0 d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,: R' R, D: ^4 U( V1 J' E
EDMA3_TRIG_MODE_EVENT);3 l% W" l: [% N0 T2 ]2 Y9 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # K7 `; @: i7 ]! l3 L$ `4 S
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
( w, C) f/ C- u( S3 \McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: o$ L2 I* U2 oMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% A* c* @! C1 l! twhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
+ O* ~( c, P8 f2 ]7 C$ n' `7 KMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);3 ~ j7 {2 M* R( P& w
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);0 h# ~4 y% c9 f/ @, |
} 9 i* Z, z% d- i4 k
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 L3 u1 t! e F) n
|