|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,6 M' W6 u' N8 f4 U
input mcasp_ahclkx,
2 N+ `8 K8 D Y; b. F9 j* rinput mcasp_aclkx,
# }5 u: z. Y `3 h* e. @1 c% h, @input axr0,7 S8 K3 T" T# `6 G' R
* w3 t1 J( W0 s c
output mcasp_afsr,
4 I# ~: o8 H$ v4 |' Routput mcasp_ahclkr,
( U# n4 ^: {7 G G# W" loutput mcasp_aclkr,4 w! P( `' ^8 f/ n
output axr1,
' w. Y2 X$ d" R3 Z X0 w assign mcasp_afsr = mcasp_afsx;
2 O8 l, A) Q: ]4 o | b/ eassign mcasp_aclkr = mcasp_aclkx;; h; H$ o# V% g" i
assign mcasp_ahclkr = mcasp_ahclkx;) a- [; J7 O# G) H& W7 X
assign axr1 = axr0;
/ Z$ h" o7 D0 @) r6 b- f4 ~
9 t4 m+ u1 a* v' `- D" s& E在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
' x& y- F) t. }1 Y* t3 t( {static void McASPI2SConfigure(void)
# Q0 V+ T! s( I4 h1 ~{
+ \7 E/ q6 J# q6 G/ j$ F( b$ Q0 O+ FMcASPRxReset(SOC_MCASP_0_CTRL_REGS);6 s y; Q1 o, I$ g6 Q/ ?7 `
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */$ e, ~% `' @8 ^
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
' A3 B; {, p" ]7 |McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */( Y+ w, Z# |- {9 J; z! {0 _
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE," `4 k! o8 H5 a4 }/ d/ `- N
MCASP_RX_MODE_DMA);; A2 t) m" P4 i; s: ~
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! I$ M7 Q S* I \5 CMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
. a# U! }" H$ JMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
3 g, e) Z6 G8 T: b2 ~* ]+ }MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
_, U7 K* U% bMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, * K }& \0 X9 ~4 f( g2 Z M7 k" @
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */1 t, k# k' X% F1 m" q% W# i
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
. G( I3 L( C/ J I6 q6 V$ SMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); $ d5 n' v$ H7 W6 o+ I" A( m
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
) ?: K" R; y$ e* w0x00, 0xFF); /* configure the clock for transmitter */, G( d( `: h4 r% Y7 E8 v
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 V% z6 l5 [4 E) B+ C' f" d q# LMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
5 U# @% t, l" ?" \5 |, XMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: U6 T+ L3 `1 y p2 g' q0x00, 0xFF);6 a0 d2 P% j7 C2 ]( N4 D
K0 Z% L f! L: f4 Y' o- b/* Enable synchronization of RX and TX sections */ 8 Y' w; k8 ^5 ~2 |2 j1 n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */! ]7 N8 R# g+ V' c4 w9 g* C
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% U5 i0 `0 _# vMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
8 Y1 B0 u& }6 U, B" h** Set the serializers, Currently only one serializer is set as
8 v" R2 `8 V: Y! { e** transmitter and one serializer as receiver./ }! P+ @3 o% b
*/
. H2 F/ V) i; E. `/ L) hMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- Z/ q$ ?* k2 _' X) XMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
7 l: j% d* l( b3 H ]** Configure the McASP pins
F' p* c! X8 [6 Q) {3 ?1 O** Input - Frame Sync, Clock and Serializer Rx
- }5 |9 |9 Q3 I: [3 e( p** Output - Serializer Tx is connected to the input of the codec
. v9 @% y, O6 c5 [*/1 @8 [0 l. R8 @7 @" j1 d
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% z$ ^8 p, [8 d; N8 A- D, {
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));3 Q0 u. S& @* e" v7 M7 I9 O, d
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ K: }3 ]( q: a" ?/ t
| MCASP_PIN_ACLKX
+ i5 R; @2 @7 ]. C9 ?9 O5 [' _! A| MCASP_PIN_AHCLKX$ u3 E* t; s# ^7 O0 C" W6 _
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */& c) u, G, v; y* N! o- S2 b: c
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR * q* \* `; D% l! j: v4 M
| MCASP_TX_CLKFAIL
: Y4 T" G8 {- D) e7 j( a4 k0 f| MCASP_TX_SYNCERROR
6 ?% J( E! M5 T$ x% d, Z4 M| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. F9 T% y$ ~* E3 ^+ a' i- G6 X; q$ N| MCASP_RX_CLKFAIL d q. m! e- W7 ^' c
| MCASP_RX_SYNCERROR 9 ]8 T E" U% [- T
| MCASP_RX_OVERRUN);6 d9 ~1 h& X, n5 V/ i& a
} static void I2SDataTxRxActivate(void)2 n5 m3 |0 x' a0 J2 V- X. X8 Y
{+ M% C6 a) D7 U0 q2 E
/* Start the clocks */2 _' W2 M- N5 I, L, ?! Y
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
- D% r. F. E4 u4 B0 x+ \9 W4 vMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
5 A, Q4 `, N9 t" q, a8 V% f$ ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* y$ }% F( t: d/ u* e. g" GEDMA3_TRIG_MODE_EVENT);
( F- O& n& t7 d' S+ `4 @EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ c, y" @) W! I+ Q4 N6 o7 [# a( ^( REDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */& J, t( D3 y6 F- _3 I
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
5 y% M: j& x4 h3 _McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ l) \+ d. j4 Q' l- M, y* }, @while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
1 `1 {2 r+ R; r) q! T" A) uMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);) M& b+ k3 s/ L! l X C9 z7 I, h
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; C, c* R4 t3 L4 b0 k6 M4 b} ) e: F! O9 ?1 g% c" r4 D
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
3 }% m( D; u. Y' ]% U* a |