|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,( k6 \( s: V: w) U1 C+ k6 y
input mcasp_ahclkx," c. u& E1 {! N- A
input mcasp_aclkx,' {5 O4 z) H3 b, y
input axr0,! V _. b8 \1 p% T7 t
% f& h: X5 `; C/ B( |- S
output mcasp_afsr,8 s# h+ v+ J7 l6 }3 `- h
output mcasp_ahclkr,$ U' `) b* ~/ V( y' t N; P
output mcasp_aclkr,1 R: d3 \% y: E$ s: A) y4 N; a
output axr1,
; m3 P/ a, A# @6 \" { assign mcasp_afsr = mcasp_afsx;$ Y2 b4 {# V! v' N
assign mcasp_aclkr = mcasp_aclkx;( q. m5 K) B# A& m) H' Y: W" p
assign mcasp_ahclkr = mcasp_ahclkx;) Q9 d" b( R4 \8 }
assign axr1 = axr0; ' F: @7 z; B# _- e5 Y
! l7 W+ w1 |$ x3 W! A' E( W: G在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
" F1 ?! v. `0 H* X0 }9 W5 u# nstatic void McASPI2SConfigure(void)# M. W+ a* }6 H3 x' m: r7 L
{! J2 z' {: O' i8 z: E
McASPRxReset(SOC_MCASP_0_CTRL_REGS);$ |! l/ K2 `* A. |+ J/ c
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */5 ^6 e4 N* n+ X5 ~( f; I
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);/ `4 M* F! H: a- k* l! w% B( v
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
* Q8 V: m' {% J9 BMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,2 {$ N o+ ?2 F. I9 M. C. {2 x" W
MCASP_RX_MODE_DMA);; X8 c& [; \; _* m4 ]2 G
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 D7 S/ t# o( wMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */' x' q# t0 {# {
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, {2 {/ V G- v ^' S4 e% g! SMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);$ U' d6 D/ P8 K0 M- p2 Z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " u8 o% |% f: O0 V
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
# Z: A$ ]8 j. q+ k) wMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);9 x- c, H& ]% R8 A+ r) F5 H
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 _8 d; f$ G2 N4 W
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,8 r9 W- h- I+ `1 Q# R/ S9 b% X3 H
0x00, 0xFF); /* configure the clock for transmitter */3 V" X7 `6 N3 W
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
( Y( J6 V% c2 y9 t7 F. Y8 ^McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' n" c2 O9 [4 A3 F4 v9 D) ?
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,2 T) V1 E4 j* Q+ @# _
0x00, 0xFF);
# N8 a; g5 K% Y, |5 P/ g2 \1 w- h/ W6 i3 F6 E) w5 [
/* Enable synchronization of RX and TX sections */ 1 [4 {4 O1 f1 i2 }8 O5 W
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */4 z5 O! U7 ?* e; t; e
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);' M8 x( t" A+ s3 c5 u: P& H
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*6 n/ h$ t, ^7 ]! T' D3 C7 {$ D7 Q
** Set the serializers, Currently only one serializer is set as. {" a6 a4 l0 b" a! q
** transmitter and one serializer as receiver.
" q7 q% y( Q& e8 _% b6 B5 \*/. w3 f. P# ^. b% T0 K7 J7 j- L: M
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 P% L9 E5 F$ ?' _+ T; J" E
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*# ~, Y" O6 m4 f! p7 i4 D
** Configure the McASP pins # W) `8 v1 T. e& N7 r
** Input - Frame Sync, Clock and Serializer Rx" P4 ?5 x( Y7 J$ [1 N
** Output - Serializer Tx is connected to the input of the codec * S6 c. R$ s2 g( Y
*/8 L+ T6 b" T( n2 f/ X
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
: I+ P; K f; q& P" ^McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
( {2 d7 a4 B) }0 `McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) u# t9 w" T. L) @$ k% p* A! a| MCASP_PIN_ACLKX0 D5 B$ c- M$ j! A" O
| MCASP_PIN_AHCLKX9 d6 n% u# r, w2 ]6 v$ Y
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// x6 {& ^% H: J0 n5 c% F( \
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " M! E* v! K; G; ` f% W1 p! h5 c
| MCASP_TX_CLKFAIL ! E, c! G0 l" o& g y
| MCASP_TX_SYNCERROR
: X; C) T2 g( R4 E/ I4 ^8 @| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ! l! r5 m+ P. ^5 A$ C7 v/ D" d7 H2 t# A, u
| MCASP_RX_CLKFAIL1 y! x+ T7 \* b! L
| MCASP_RX_SYNCERROR : J$ B# H* k) Q2 ^8 t, @; [# u9 D
| MCASP_RX_OVERRUN);
* }4 t" H' B9 Y6 \' V. F, h( _} static void I2SDataTxRxActivate(void)% L: q3 t" g9 \- i* m) g( p
{' M8 y# {4 y7 Y3 ?4 H- x* d
/* Start the clocks */
# ~9 f8 w7 t% U+ b3 HMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! f4 u: r: B1 V' ?McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 }( r8 _/ h, d3 }# Z$ ^EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,) T; t1 l( L0 y( p4 c
EDMA3_TRIG_MODE_EVENT);
7 \$ L, C" j- IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 3 W; g% r) B4 H }6 W
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
0 h, ^' a$ H2 N- a, \1 R/ OMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% R% r9 i! Y4 I# A$ m0 ^0 hMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
* J A0 T- m, S5 Z9 O5 W) b( dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */" b( |: F9 @1 d8 K. l
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);" Q- `6 }! a+ @& y5 Z8 Y% b- q2 N
McASPTxEnable(SOC_MCASP_0_CTRL_REGS); v n; @1 C" ~ [' L+ h
} - @2 q1 V4 F0 S0 {; _. E) X
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
, {3 D$ `$ g$ z4 L$ ?- M: E3 i2 L/ @ |