|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( r+ ^9 R$ T. B
input mcasp_ahclkx,
$ s5 T/ `5 }! kinput mcasp_aclkx,
7 Z; U+ M |1 I0 [) Rinput axr0,
: Q- ~5 g7 d- f! o2 l& A: E9 a6 \4 W) }
output mcasp_afsr,
$ I/ O2 A9 ^2 E# q1 D: z+ Q( e9 Houtput mcasp_ahclkr,. }( u5 z+ F6 q
output mcasp_aclkr,8 O o' A/ j6 O
output axr1,- d/ M$ {4 R/ Y
assign mcasp_afsr = mcasp_afsx;1 b1 n4 n/ o+ v! B; Z
assign mcasp_aclkr = mcasp_aclkx;
1 U; o4 n) R+ o# y+ y5 Bassign mcasp_ahclkr = mcasp_ahclkx;. R! y0 \4 I7 O6 l- Q6 J4 [( B
assign axr1 = axr0; 0 ^. d3 D1 M& u3 ]) E! }7 j
9 W: p0 m4 f2 R2 m9 w' D
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 0 b1 Y, `3 R& q- b
static void McASPI2SConfigure(void)
6 f7 p% G7 o+ B: S, z4 y{
3 o: j# m# r7 aMcASPRxReset(SOC_MCASP_0_CTRL_REGS);+ g: f. q' p0 |: P3 F6 K
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 M/ U" u: J* P/ T9 FMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);1 X4 ]' b+ o7 M6 s; n! H9 R. N
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
$ ^( N- k* i4 ^) n( h0 ~7 \9 W/ c' sMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ b* P5 |# { m, d) j* O" h" BMCASP_RX_MODE_DMA);
& L3 x+ q1 `, K6 N5 gMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) ]/ I0 S2 L K2 U$ `% PMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */) H$ a+ U& i& C$ N! Q1 Q! e
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* M" o/ o7 u3 A- u0 Y; CMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
' z3 N1 U% b7 A- {. e6 `McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 y2 s, n; \8 o, ] D! n t2 h' Q
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- x! ]4 W- _. K
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0); h1 W/ y! G* C. C
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) b9 |9 Q- a2 l( j6 D
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
9 _- j7 P' \ s* N9 P }0x00, 0xFF); /* configure the clock for transmitter */
7 E7 C6 |$ Q6 ~) Y% C: {McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
% y4 _5 J" ]. u9 I% j8 F% ZMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 O7 p4 N, p [+ VMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: k- v \1 b/ s) i4 F; k0x00, 0xFF);
7 o2 ~4 O j4 S: g' Z
2 h3 C7 C. I5 \! {. I/ z/* Enable synchronization of RX and TX sections */
$ m+ f0 a9 q* C/ SMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. \' K7 @- ~0 {! _* u! [3 K y+ h# GMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; q. u( i5 G! M3 k
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*( w+ h) j1 ?, r3 R* Y" v6 b
** Set the serializers, Currently only one serializer is set as
0 R. S: i; ?! W _2 j, X** transmitter and one serializer as receiver.1 S' q' l" J9 E! I* }( n# O
*/
) u; S8 S6 ^2 n0 Z! DMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
$ J& \" N% X! D: F$ MMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* g. s. g0 K, v2 d" A2 L: x$ ] i** Configure the McASP pins 4 Y: k, r9 T# U
** Input - Frame Sync, Clock and Serializer Rx. V/ s1 w1 [- ~ f2 [( ^2 \2 z
** Output - Serializer Tx is connected to the input of the codec 5 v( Y! k4 h! h- r& E1 r
*/- L; ?& D" r6 L: \6 B
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
. O% ]% Q a5 x0 a* L7 B4 cMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% [- ]8 p6 a; s, G) Z, _
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 N. @) P7 i5 a
| MCASP_PIN_ACLKX
: a6 G7 l0 N! x. K( m% h| MCASP_PIN_AHCLKX
# u; G+ n6 Y# x% {| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ {3 ]2 K0 L% n8 D* U4 b# Z/ qMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , F0 \& M) B2 ^
| MCASP_TX_CLKFAIL
; J( v( n0 T1 q: y. Y s0 G| MCASP_TX_SYNCERROR9 W5 P+ w" w1 f& P% p9 b
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
# f. m- O+ g5 a& O$ v V( W( J| MCASP_RX_CLKFAIL0 k8 k, E4 p" h
| MCASP_RX_SYNCERROR
/ |2 M7 q5 t* h, S. c0 `/ N| MCASP_RX_OVERRUN);) c* t+ r8 P# W( t3 A
} static void I2SDataTxRxActivate(void)4 f' {3 x8 D% ?, F; V: N
{8 {! e S( {0 N4 a' x- G
/* Start the clocks */
5 {9 M' i# ~. }9 xMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 c! _ D/ V& rMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */& m' C6 ?& ?. o4 w' @, w0 Y7 P- Q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX," {6 s. k7 \3 E; A
EDMA3_TRIG_MODE_EVENT);8 H- h6 R0 }1 s+ w3 R* A5 v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! H7 H# q4 H8 j# u; V; W
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */- w! G5 X: o' W/ l, R) a& W* y8 p
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: Q+ p! _/ e/ C& c* _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
! Z# k, H1 x5 H% {while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */9 [0 m, L: g5 H% w0 A1 O' y+ f
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);4 C& d$ r) |6 b( v/ c7 ^7 c9 s
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: K) _8 ~ }, X" }. u: F} 0 F6 v6 e6 G! q1 D/ J
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
2 ~& e& |, z' o* N- _2 _2 h* u |