|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
: C( h- Z2 d& N& N) J* ?input mcasp_ahclkx,
4 G- M7 S; l- g& e# hinput mcasp_aclkx,$ Q* n$ w0 f0 A
input axr0,; ~+ q9 _' C$ v6 Y7 g, R$ n
; [! A2 y9 A: J) o" S3 D' A+ I4 }output mcasp_afsr,: |. N+ }& F m& p' e
output mcasp_ahclkr,; S: [2 { O* v% M
output mcasp_aclkr,
6 N, P6 }5 q ~2 soutput axr1,
/ ]+ e& p$ Q# P/ s% Z$ Q assign mcasp_afsr = mcasp_afsx;4 y3 W6 L+ s. m% H8 T& u/ W9 }. [
assign mcasp_aclkr = mcasp_aclkx;
" k2 E% z7 D6 s1 Passign mcasp_ahclkr = mcasp_ahclkx;
8 Y( X8 I4 w; r( Wassign axr1 = axr0;
9 @" G, T8 O8 k% i1 ^/ w) H* ?9 C( c+ ?; H4 ? c1 D
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
# g, G) w1 A% S5 ~static void McASPI2SConfigure(void)
3 [3 g/ ^3 B6 T0 ?7 `% U{+ x; Z) H8 y; X7 y5 z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);6 p/ y7 Z4 J+ F
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer *// D' d5 J; g0 h9 V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; x3 Z. X! t! q$ O( WMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */; z6 ]! y* o7 c. G- i' O, |
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
% R. o6 r/ l" H0 \MCASP_RX_MODE_DMA); c9 Q5 p7 C9 e* ?$ S$ x$ p" u
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,. Z2 z4 b; O/ b& q
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
/ p0 Z7 A2 w6 z Y9 H& QMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
& F) f3 C0 H% P% R7 a ~MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);- K* H+ ?: x* p9 k$ {6 J! Q
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ! r" Q2 Z) @6 c+ b$ K; K2 L
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */* n# e) O: J9 i$ ?4 Y
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);6 v$ O9 M8 c! Y% [0 y9 ]- c
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
- ^/ g! @: l$ y. A, sMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 Y1 J4 |! ~5 F% p! v/ i4 d c
0x00, 0xFF); /* configure the clock for transmitter */5 O4 o: j' {; H
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) S+ H0 c g) A+ @% P
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
" f- [1 v- P2 O6 _McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32, Q* w3 P! X9 l
0x00, 0xFF);$ T% o. M" f# m' W5 |. F6 R2 X; d
& ` W: F$ `( C! L. V/* Enable synchronization of RX and TX sections */ ( r f$ k" j' n" I: C& F9 \& N6 @
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */8 C" g( k( Y, l
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);! e6 Z! M# t1 _% G) e+ r
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
( h3 c* N5 L# z8 T t** Set the serializers, Currently only one serializer is set as
) N$ R+ ], j% v/ W! f% d7 j** transmitter and one serializer as receiver.5 w3 H7 e @8 P
*/
+ X$ U; }8 J) u; s% YMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( s, J V9 a9 [3 E; Z, P8 n
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
8 H0 o. _" E! ]** Configure the McASP pins - k9 q2 S9 X9 P* s
** Input - Frame Sync, Clock and Serializer Rx
2 T2 J9 p: |, Y8 i F: E8 J** Output - Serializer Tx is connected to the input of the codec 1 ?% W9 J: E# _4 z: y: p5 T4 h
*/
' ^; ~) Q0 {% A0 z# F. a PMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" s& |4 a3 g& Y/ G2 E1 K- I
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); i5 u1 X1 x8 I! V5 Q9 B: d6 _: y
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
6 c: f; k% _7 m9 Z% x* o) c| MCASP_PIN_ACLKX
' P* E; W, Q* I: O1 x0 V4 n& R4 o! T| MCASP_PIN_AHCLKX
! I- L8 R- e; J8 w" l| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
! M6 K# q9 x6 x7 pMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 c* D2 G. s& N! Y0 ~| MCASP_TX_CLKFAIL
2 L+ ?& d) G' w9 W! z' ^) c| MCASP_TX_SYNCERROR
: b% ^8 M0 I6 |, N8 m| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 g4 o& D' ^) M. \2 P$ l
| MCASP_RX_CLKFAIL
8 M3 { K' @- M3 T% _| MCASP_RX_SYNCERROR ! y' k5 F! x7 |8 I! X* ? A
| MCASP_RX_OVERRUN);
! T0 Y3 M) N! M! H} static void I2SDataTxRxActivate(void)# r. q. X0 W% x1 y
{
' A& O5 \" z2 h2 g# a/* Start the clocks */* a9 N8 t5 T* U7 ], `& }1 J+ n5 l0 ^
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);0 }& l, \ J2 W& M- S6 U4 R
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( V$ V8 G6 x1 X+ A( V2 H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,- ?2 N& {5 f: h: ]1 B
EDMA3_TRIG_MODE_EVENT);% W/ O; `1 M& D8 t/ G3 e) e
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ( V# w$ X4 ?8 Y" m2 T1 x; l
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
, [2 ~: c: B7 p0 s) e+ ^' ZMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);3 N* k; }8 C8 i s
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
. q3 o/ v( V, |7 Wwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */3 m4 S$ ^, E [$ T
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ w6 P, J6 u6 }McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
) y$ i) K$ a% s2 Y4 h) g}
- Q3 a5 D* J+ V6 M! K请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 }- l0 ]/ y: C" j& q
|