|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,; z5 }6 X( \) _8 v! V# S" g
input mcasp_ahclkx," ~, Q1 v1 O6 H- h: r
input mcasp_aclkx,
( a/ v5 j+ O0 h+ B* N% M- sinput axr0,
) t4 V4 h9 T) N" y* n
5 z: P2 H$ e8 j [output mcasp_afsr,& r9 G d+ i# N0 l/ C
output mcasp_ahclkr,
) Y! K+ j. b" E. J. ioutput mcasp_aclkr,, k, G8 u5 J4 Z# O8 _
output axr1,
7 s/ l% G' F. v R& o assign mcasp_afsr = mcasp_afsx;# _7 G: Q( b; B2 Z# R( `) x
assign mcasp_aclkr = mcasp_aclkx;
" d4 W" u3 ~" k5 f" A0 n4 Aassign mcasp_ahclkr = mcasp_ahclkx;
. A% T W0 _0 j9 V* ]: I0 dassign axr1 = axr0; ( M, e1 K- v! G
( j( k8 q" X. w在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
, M$ L; M# c" f" M. [) b, h, Dstatic void McASPI2SConfigure(void)" H% f7 }- w7 D" c0 }
{% P7 ~* f6 ^4 L/ G) V5 U/ N
McASPRxReset(SOC_MCASP_0_CTRL_REGS);/ z2 O2 ^2 D$ i4 I* b( o
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ U; ~3 X P- [5 Q+ S2 f$ _
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 X$ |) w; P ~7 S9 }& ~( Q2 `; CMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
6 c \9 ?# |1 A2 r9 EMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
3 _0 g( s7 f( j4 z) D1 H3 CMCASP_RX_MODE_DMA);
( U6 M3 n/ u5 Q3 _8 ]# V( }; BMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! u' [4 I' i% D- B& g, @) {
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */2 i4 A- d2 m+ ?0 h/ {- H1 l# U
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 3 g' v) {: o0 S: Y! |
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);6 U/ m1 c+ `8 W
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
- p+ k9 ?9 R. y* J9 C, }9 ?8 A( K" QMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% T2 o1 M( ]. j5 Y7 B9 T" [
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
3 \4 c. L6 C `+ ~, wMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * A. e9 l8 J, v! s @# a/ K" a4 T: w
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
0 i: X+ ^! N$ d/ t! `( |- r* |0x00, 0xFF); /* configure the clock for transmitter */* K7 d& i) v p( i5 U
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
- U- z/ `" ^! f0 O5 dMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 F: l! x. X1 xMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
+ i: a |$ b! y4 }1 F1 N( X0x00, 0xFF);
) O& v: h+ h- F' b! ~! w! N: i" e3 B. n- e- Y, L2 A3 v; J7 u$ T
/* Enable synchronization of RX and TX sections */ & _" {& |$ J3 q
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */5 Z# ?/ s# e7 [( R5 u$ Z% J* ?1 ^
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 M* `/ k4 i& u# j+ ?McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
" ^0 b+ \8 [) y** Set the serializers, Currently only one serializer is set as( O5 J" g$ l) B2 Z! f; |5 K K
** transmitter and one serializer as receiver.4 }6 R' l( z6 r# A1 }
*/
7 a h, p' x- d/ g% G. k! T: ?% \McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
3 s& V, z0 o0 TMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*3 t' U4 F6 T1 s# C/ P8 u
** Configure the McASP pins 3 s* v# X2 f( B: N
** Input - Frame Sync, Clock and Serializer Rx e6 n, _8 W- Z! z
** Output - Serializer Tx is connected to the input of the codec . ^0 K& N4 z5 p5 q: X1 `0 m r
*/" [' j% O5 |6 g j; n
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
/ A) n: l% b7 A$ \McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
5 P* f( Q% e+ F J) r9 P$ Z9 Y6 r( K/ cMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
* z2 t# f7 A; @7 M" R| MCASP_PIN_ACLKX2 i0 }+ q, }8 @8 C d
| MCASP_PIN_AHCLKX5 O% @; z/ v/ {( i" x5 Q2 c' }
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
; n6 f2 R0 T! }8 tMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 7 m3 t8 L6 c7 g h4 C
| MCASP_TX_CLKFAIL
; U5 Y) O; E# P; |% _8 r| MCASP_TX_SYNCERROR
6 ^' e! p% }. ]" Z, B. A, V| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 r9 k* z% C% y, G$ D
| MCASP_RX_CLKFAIL
/ h: O4 A' ?/ U| MCASP_RX_SYNCERROR
, d2 a" Z P$ D$ @: d| MCASP_RX_OVERRUN);
) s3 f& o. i) D} static void I2SDataTxRxActivate(void) S1 v) _$ Y, V
{
5 V4 H8 {/ B( l0 J/* Start the clocks */
$ a! t8 g- w* ^* I, \' m7 cMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 B# H8 ~2 s* ^7 B4 C. qMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */. y$ [8 D; h) V
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,$ U2 Y: ^: t3 o* N
EDMA3_TRIG_MODE_EVENT);. R- P4 T# t: ^7 @
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ! }! T4 L9 B) s, Y% T5 J/ @; v8 J# n
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
' \ w7 i/ @$ p/ Q6 JMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 |7 |8 g4 j$ p2 W3 V2 }- ^3 W
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
4 o! i$ L. W) d$ Rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */- y1 \- x# W) B+ K) B4 z d
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 s$ j) Q$ j2 I4 dMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);; v9 l+ W- m: s' I9 w4 V3 T
} 2 f; _0 ?$ N( P! H' K' x
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
/ |$ }( E. X0 m* A: [+ Z7 w) i |