|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
0 C( g2 {# w; Oinput mcasp_ahclkx,
! U7 Z' P6 ^) |- v4 y1 E) |& Uinput mcasp_aclkx,, J, _, s P' H) _4 D5 G( `3 C; F
input axr0,2 S- _& p3 h4 }, S
* W9 N3 s( ~9 D' K routput mcasp_afsr,) q1 k0 e5 R7 h
output mcasp_ahclkr,
4 O( K- x# b& B; Aoutput mcasp_aclkr,
7 c# K6 X! C/ j6 G1 `& V4 T' y0 } Zoutput axr1,
8 }! T2 Q/ Z: G. H* ~ assign mcasp_afsr = mcasp_afsx;
3 I! \1 h. l% j5 [( ?assign mcasp_aclkr = mcasp_aclkx;/ s5 t' }; w, |- W( f
assign mcasp_ahclkr = mcasp_ahclkx;
5 J! f" i) H; lassign axr1 = axr0; ( |$ s8 u( n. m- v, c
4 ~8 @# V5 t" g' J+ ~/ M: K在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 9 l; k* L: G8 G& \6 ]) W0 u
static void McASPI2SConfigure(void)
3 n |; L2 x3 G# I) c{
: j$ f% I% z, Y5 |3 k7 L8 z% c# hMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
( X2 g! V$ P5 M. j6 v; ]: sMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
9 {; u) G* A( K$ k+ XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# k8 n! k! b2 D! v9 n3 GMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */- z- K) }2 { }: L4 n/ h
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% j7 l3 b5 e4 a" w h$ F7 mMCASP_RX_MODE_DMA);
3 [4 \4 {4 s8 Z7 EMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) h: T2 w- r. ^! k, Q
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* Y: P+ X- X. HMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
9 Y* ]4 U1 {" k4 p: l# xMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* ]2 W1 n/ o, f1 f+ C; h% B( lMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# S3 Q; {5 S1 EMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
" l1 ^1 J) v% s) W$ [McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- s) ^2 n8 I5 z9 f7 KMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
9 Q/ V2 _) f+ L9 L: p* I3 IMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
" D E/ Y8 c6 s9 e7 F2 N0x00, 0xFF); /* configure the clock for transmitter */
) t( c- h% e9 t$ v w0 n, c; ]9 A* qMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ d3 @6 X& y, U! n4 E9 V5 OMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ; j9 K/ L' m: p8 ^8 p
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32," N5 b- x# S; n2 e# L @" N
0x00, 0xFF);6 c' ^* A/ }% Q# k) @
! J) g2 k7 K* L6 H. c/* Enable synchronization of RX and TX sections */ . t* ?% U: @. S# Y
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */5 ~6 a, \6 }! L) k- W( u
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 ?' S8 j/ P7 {7 G
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
! J% H4 I/ m6 g6 L7 t- z** Set the serializers, Currently only one serializer is set as
6 F2 Q1 z1 }9 k** transmitter and one serializer as receiver.! Z0 E* g6 l: B5 e
*/1 P/ N V Z3 v1 B
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
) P* w5 J1 @3 X4 V: B; t* \! i0 O& CMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*) ?2 j H7 u% W9 c* Y [) k
** Configure the McASP pins
4 R) n' i) n1 p6 `! }+ x. `** Input - Frame Sync, Clock and Serializer Rx
% |( R6 w1 ~8 k0 l( E7 D) t' C% T; [** Output - Serializer Tx is connected to the input of the codec 2 k% }0 I8 l+ l7 ^' I
*/
7 R/ e6 k+ m, L8 c; S1 i+ _McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
& D7 C1 c8 p( m$ v; cMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" E. l) j2 H ^# g5 I3 p" h/ W
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( u( w; W) |* G6 e* E
| MCASP_PIN_ACLKX0 C1 _9 h! ~0 T" \( |# O) q* {3 |) A
| MCASP_PIN_AHCLKX3 w+ [; J. K% ]( X( b; _- v+ O$ ], F
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */2 H* g* J4 _ t$ p1 _
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . p( c1 f; h4 n+ |/ j0 ^
| MCASP_TX_CLKFAIL 3 a9 U, n3 v" i$ o
| MCASP_TX_SYNCERROR* i4 c- b; L3 }3 q+ O: P
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 D1 ^' O* N4 z' \0 n| MCASP_RX_CLKFAIL
! @4 N: g& w7 ?! z| MCASP_RX_SYNCERROR 2 o, s. G- s" D1 a4 x/ ~; }5 C4 P1 S2 I
| MCASP_RX_OVERRUN);
, u2 g- d7 c2 c! G} static void I2SDataTxRxActivate(void)
# b/ N8 t4 A0 P, Z{
4 r- ^& ?5 \ G- r* v8 C8 p( U& I. o/* Start the clocks */
L- v! z4 I1 U5 d' ^5 p! B# a& pMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) ^4 [ M+ ]8 _8 ]5 @, C zMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */3 x- X$ s, A5 T. `4 F' M" q
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,3 I& C2 D9 M* H( j! d
EDMA3_TRIG_MODE_EVENT);" V; {# m# k |, f
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# E( q8 j! ^- c# u" \3 vEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */% f" ~# I" o+ u6 E; y7 c. r" i1 \" q
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
8 w/ m( y3 u, O! J( W* L( WMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */$ W u6 R3 x( T1 p* C4 R/ d4 i
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
2 i- g( Y7 k( M% t$ UMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 }; a, E3 [( K: m0 LMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* B4 e: j- f a; D% `# [}
/ h: a; d W5 j' T9 ]$ ~$ n/ G) Y请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% g7 f' `5 @+ L# c; m6 S$ W |