|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,# f, P3 Z5 M9 F* g6 p3 F: @
input mcasp_ahclkx,
; |; G# \! j( r( b$ Linput mcasp_aclkx,
2 Z4 |8 w. Z3 linput axr0,
. O; ?$ S' v m. a: q- f9 x$ t' f9 x! G: R
output mcasp_afsr,
, e4 l0 W+ ?9 z1 eoutput mcasp_ahclkr,
/ W4 E- w/ {- V; m0 `$ o: Eoutput mcasp_aclkr,
8 f7 A! |9 B! B: m) goutput axr1,
/ s! ^ ]* }9 d& Y. C assign mcasp_afsr = mcasp_afsx;& o, Q; s1 i, s: y' n* @9 K
assign mcasp_aclkr = mcasp_aclkx;( h" B: g& @1 P3 Y! S
assign mcasp_ahclkr = mcasp_ahclkx;
8 x" ~1 [$ l/ m+ P. h' ?assign axr1 = axr0; ' [! }' ]% x8 t8 k
P$ i; U1 R4 K
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
9 E7 |" B& U) p G3 S6 j zstatic void McASPI2SConfigure(void)5 F! \% j- P9 ]# D# G4 @" q3 z* I* G
{
2 t: C5 t# ~& n' y3 ^7 D1 U) eMcASPRxReset(SOC_MCASP_0_CTRL_REGS);1 C6 R) g% @* W) R& W+ _; a
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
, x8 R, a) j5 H% D7 q6 VMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ j, ?; |8 @- Y) Q- }/ f; c* Q6 nMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */( N. g! h4 Y) B2 `5 M @, Y
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ l; [/ o, K- ~9 xMCASP_RX_MODE_DMA);+ o* u. f2 ?6 \5 h/ G5 V
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ |3 E3 Q& u6 H+ @* n# \. F+ m9 w
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */- G3 @! R/ j, F4 Y: y7 N) }
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
+ T. M: @4 `+ Q: ?( {) i- pMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- q! J( }7 A, t, b9 J9 F$ H
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + [; H! Q6 r+ v. D
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */$ v! D) n+ z. D# z& r1 j6 P7 d
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
e6 n% O/ W+ N: c2 ~McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ) @) L W" y7 }% t/ } Y2 T; ?
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) C7 H9 N j4 T" Q4 s$ t5 q* N
0x00, 0xFF); /* configure the clock for transmitter */5 ~, R# I) U, c( n1 |- l* e6 s8 O
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
7 h. y3 i+ q" j# y4 i4 J* h3 J6 MMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ) Q' f9 \' P& o/ f" S# [: Z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 v' n$ X, n9 ?& s, k8 f5 c5 z
0x00, 0xFF);
' E; }! b! o; R. s/ b. ] s* V9 [# e% y% j9 F. y* a3 F
/* Enable synchronization of RX and TX sections */
1 O0 n8 m0 m& j6 }McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
. c9 W% ~- ~1 V( c" i0 Z0 eMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. \9 h' f1 O) F, p b: kMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
- m5 t6 R7 Z' O& b) F$ f** Set the serializers, Currently only one serializer is set as, p* g. w/ U7 l1 N: J
** transmitter and one serializer as receiver.1 c. i/ b6 Q2 |+ B- ~
*/
* ~+ [0 ]6 }, P2 fMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
5 O7 W/ j( q9 R9 e5 U$ T; PMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
' a, _+ E, N1 [- x( X** Configure the McASP pins
2 G6 ?. i% m2 q4 q( M) p9 j1 F: O** Input - Frame Sync, Clock and Serializer Rx. k+ i- l( o" u3 N& H1 p% K1 `0 ^
** Output - Serializer Tx is connected to the input of the codec / e6 E1 ^" e* |" A4 f( m! y
*/
( a+ s& Q: s q- Q, VMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" {1 g) J! _3 K9 l
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
* q- u' i8 G" ^: NMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 Z5 u& x" c2 y I3 A. X| MCASP_PIN_ACLKX5 p" j; J& A( R4 o
| MCASP_PIN_AHCLKX5 r7 X. Y! @3 X. X4 ]
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */0 L- P( n& d$ h
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 L5 W4 M' Q8 [8 K| MCASP_TX_CLKFAIL
" z2 ?6 B& o6 s% N1 y$ G- _' P+ N l| MCASP_TX_SYNCERROR, \0 v# e k7 G, d ~ N
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 3 i( s1 w, C$ v0 ^( |9 [
| MCASP_RX_CLKFAIL
9 y1 \/ v: [4 p1 u| MCASP_RX_SYNCERROR
. m: t* ?+ ]( N# l C& T+ C| MCASP_RX_OVERRUN);
, H$ X( Q. L) }5 T8 K} static void I2SDataTxRxActivate(void)
2 E& F3 A0 p; O$ ]+ t+ C{ ?4 V7 ]1 x" _
/* Start the clocks */
1 m# Z4 ] b) h9 s; a( n+ b* u. MMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 a3 r) }2 A/ z# n% uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 ~' \& S: C# u7 PEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
2 W& a9 B9 W, gEDMA3_TRIG_MODE_EVENT);8 A. c# ^7 a3 d( n8 |& v
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, " P, L. C$ p. f
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% Y% N" W2 o3 O' F* ]9 V6 I0 Q
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);9 l+ G6 F- N B# q# d8 m! o# j5 ?
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */5 O# T& v$ f& H# B) {
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ p H5 l8 D2 ?( `- }/ m3 R$ s
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);! R+ w8 f- ?: e, E7 M
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);5 @, D5 t7 R' O' C+ [" j q9 R! g5 [
}
3 Q4 ]: Q8 e) N' T: e请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. + g6 ~3 V. Z+ S( Q- ~* Z) G9 k' Y
|