|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
+ t; l9 ?' x% X4 H, ninput mcasp_ahclkx,$ t8 D5 f2 }4 U2 w4 r4 t8 W
input mcasp_aclkx,
" L3 c: l# z; l# w7 R9 S, l& Q7 Linput axr0,
! }5 X( q2 n! J5 G X \0 K# Q) b) k+ U: v2 h+ a: F2 o1 s7 l
output mcasp_afsr,/ z. N7 A6 J% H% ^
output mcasp_ahclkr,, f# v3 y- Q: ]: n& J& p+ k
output mcasp_aclkr,
; s- a% s0 f3 L0 joutput axr1,
6 `& @7 D# l+ w; F6 R3 D assign mcasp_afsr = mcasp_afsx;. a, k6 i V$ Q$ o- t+ e
assign mcasp_aclkr = mcasp_aclkx;
7 V* ]. [, S oassign mcasp_ahclkr = mcasp_ahclkx;) V0 r6 b6 r/ n" L% U3 h7 k
assign axr1 = axr0;
R3 P- `) Z/ R* M$ o1 o6 x
3 s* V& H0 `7 |( j/ ^在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 0 ]/ n& C1 H& F* z2 l
static void McASPI2SConfigure(void)
( a( y9 L, _" }4 }{ X' F) D6 I O% t2 f* |9 s b
McASPRxReset(SOC_MCASP_0_CTRL_REGS);3 g. j5 e( E* U. F
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
8 k3 {: T s j. O( b- vMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! `- t' m2 B7 k3 ?: k9 ?- n: w1 N0 @
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */9 v! t/ a( D7 r% B7 s1 N
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" `0 y5 ?% F3 V1 ]MCASP_RX_MODE_DMA); E: Q2 U" d! D6 v
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. Z( Y' f3 n3 C, m$ n" m
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */ Z9 i! |5 P$ o! G2 [( O
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
! J$ a1 p- c% t, A' eMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);8 |) }% w: Z+ \- x V; P* W7 U" Z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 3 v3 Q8 i4 w/ P, U# }( F
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */+ J3 L: K/ ~5 `5 L6 v
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);0 |- v6 j ^8 z: H
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); / N( r8 }- U, U1 _0 H
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,/ y* @6 g# O- q1 }
0x00, 0xFF); /* configure the clock for transmitter */" g t, Z/ a+ x0 m* X: n) X
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);/ V1 l f! F& o, p M* m& c
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 h e. }; J- w' j- ^" Q# M7 Y
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,) I) n( V- z$ M5 Q1 p
0x00, 0xFF);
' G( D2 g+ G2 U; S) W
$ ]9 q! t6 H( L% ? q4 Q/* Enable synchronization of RX and TX sections */ 4 p5 [7 p4 I) l. ?+ n; r A$ N
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 u0 C) f! Q. a" O$ C9 ?McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); k& K6 P, R. A# C
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*' [; x$ B4 D- `8 o& C. k! R+ ~
** Set the serializers, Currently only one serializer is set as/ P `9 S( v: `. n# E; Z
** transmitter and one serializer as receiver.0 c2 w' U" G+ b6 z/ G- R
*/6 @1 o" k* l- P0 F
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* h) n; A$ @$ h$ b" C( c9 l4 V
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*) I2 g9 B8 J3 c j( H5 w }& j; l' X( r
** Configure the McASP pins 7 `! n7 G0 A2 S1 w+ w7 j
** Input - Frame Sync, Clock and Serializer Rx
7 ?4 N" k) i) J6 c** Output - Serializer Tx is connected to the input of the codec 2 o e. Z6 R# ^! G: C# M
*/
, A- N1 f: T! A9 p- r0 s* kMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' g! c, E, Q7 a' l- x+ x, Y9 Z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ ]& a; h9 z8 v& U4 `* _McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% Y6 @: d! e; V* P2 T
| MCASP_PIN_ACLKX( O8 O1 T: F, ]. e6 a
| MCASP_PIN_AHCLKX* s7 ]/ m+ R, p
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
. G- Q$ _3 c/ yMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' G1 j: L3 v4 G6 w| MCASP_TX_CLKFAIL 0 x4 r4 f% a( y( D% i! r2 I/ @
| MCASP_TX_SYNCERROR G9 k& j0 c0 `+ |5 p' Q; N% X
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
- b. \. B4 W8 Z: \9 L( V' H" w| MCASP_RX_CLKFAIL5 R3 C/ a+ E+ h5 p2 u7 }
| MCASP_RX_SYNCERROR
+ R2 v2 J( B8 n# W5 D [| MCASP_RX_OVERRUN);
5 k: C M# _3 G; G- E& g0 |. ]( e} static void I2SDataTxRxActivate(void)8 u: y8 n, l; p2 Z6 K& p
{. ~6 w1 Q9 ~: Y
/* Start the clocks */
: f- \' \, ~2 _: V+ H: d3 HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" J. j4 S: n& c w4 k9 H
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 a8 L5 o7 U& O6 o: FEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,8 o, N6 c6 f& g$ k
EDMA3_TRIG_MODE_EVENT);* l; c% `+ c& _, ^) U+ b
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, [* l. h& b. T/ d; U
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
: w) y+ w, x! A! D0 kMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS); C T1 D0 ?3 {! t" G2 b
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */9 o& \0 Q2 ^9 r$ b. H0 Z- @
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */) g. o; J, R$ O; B% g1 Z5 Z
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);. Z% v: U1 h3 ?% l
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);+ ~, u" B% B9 ]2 l* u
}
" W" `" V$ o" G$ _7 w' ]. S' K" t请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 1 p& A1 Q+ ^6 C* Z5 `6 t
|