|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,# n* o; l4 W2 O: Q
input mcasp_ahclkx,
v6 T$ y* |4 e8 o* L2 n. \4 Xinput mcasp_aclkx,$ n8 |% c% g8 _ y3 `1 @
input axr0,
6 }6 N0 N- C* `- p
. e& J; U! ^, g) [output mcasp_afsr,
2 S+ T& I0 U, r/ eoutput mcasp_ahclkr,
0 i. H% u M2 c; y" w7 o& f! G9 f1 ^output mcasp_aclkr,2 Z6 b3 j9 y) P8 [ h! f
output axr1,9 n/ i0 y3 A$ w* f; a
assign mcasp_afsr = mcasp_afsx;% [6 O r9 |- R& v. X1 J8 o
assign mcasp_aclkr = mcasp_aclkx;
9 y3 Y( _/ S2 V6 q2 F; ~" nassign mcasp_ahclkr = mcasp_ahclkx;, Y) p1 M( P" M3 v$ e: G, }$ h5 i
assign axr1 = axr0;
3 J, G( }$ n$ o$ S g/ R' C7 _8 N2 v: H$ _
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 " y% H! _0 ~# X8 H2 \, H" Y
static void McASPI2SConfigure(void)4 A6 G* {, w; X( t
{. l3 d* l7 ?" c, s+ m. T* t
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 _+ v, d& Z# vMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( C: M6 L- Q# ] EMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);# g! n+ s. Z: m8 L. v( P4 B4 Q+ t
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
4 J& g& k. s2 T# p1 x* RMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,3 r! E' L# K6 Q$ o
MCASP_RX_MODE_DMA);
' @% P3 M. j9 [9 V* L1 \McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
2 ^& Q" |) z* c W. l1 u7 C% jMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
3 H% L. f u! K( i1 r: }! u, R- V4 VMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, / W- g: g& p0 X) s% ]4 _8 o* `. f
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
8 T8 H7 B z% t5 a m( R: DMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ) |; d! Y3 A( B' v" y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */( [: @5 Q$ x, [, G8 v
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" C1 E0 l+ u) P6 N: W/ ^McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); D; d; S8 l; ?- P) I9 y- {0 q- X. E8 J
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 S1 u% f; ?4 q1 ~0 F8 @
0x00, 0xFF); /* configure the clock for transmitter */& t. u3 { I! V+ ^' E& C: i* R
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ g7 P1 \; T1 D: g+ W' p4 J# J1 BMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
, U( T; b3 E$ FMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 J. X1 E. p" M% `, O8 C4 z0x00, 0xFF);, M, V6 t" ?/ ^3 S1 e& t" o
9 m5 n9 {' Z0 Q/ e, f, I8 i
/* Enable synchronization of RX and TX sections */ ( q$ ^* Q ^* b
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
1 a+ R: C: Z/ bMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);7 F& n2 \/ E$ L! N6 Q9 X. A- |6 T
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*2 q" m" O" K- E3 t+ S
** Set the serializers, Currently only one serializer is set as
^' v( `4 F6 `1 q6 ]% z% S; B; z** transmitter and one serializer as receiver.
) r$ h# w! @& W }*/9 O; ?$ [7 l' m9 X5 U& p
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 Y5 f1 H, k( P, D# t; ~" I
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
" ]; ?, {* t; p** Configure the McASP pins 6 _" a5 m' Z! T! K
** Input - Frame Sync, Clock and Serializer Rx$ F( e; t( d7 k3 Q
** Output - Serializer Tx is connected to the input of the codec
! }, L/ ?! j& f! @*/
X9 _4 |1 k$ T% |' }McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);- f5 Y7 H l) b x& _1 {0 O
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));- a& q4 D, |( l
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ c5 [" \" P! F* |* w
| MCASP_PIN_ACLKX
/ u k2 ~ p% t4 { Z D i8 r| MCASP_PIN_AHCLKX0 ]4 F p# y6 h5 }: X
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */, l* |0 m7 k( l
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 ]) l! J: F I6 w6 ]9 D r/ ]7 G
| MCASP_TX_CLKFAIL , B# g& F9 j' c7 u& t; D3 j; g
| MCASP_TX_SYNCERROR2 O4 U% f2 |# z
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR $ I0 n% A5 [/ H* k: _6 u
| MCASP_RX_CLKFAIL
+ O# V/ q# i0 ^. C7 x4 ~| MCASP_RX_SYNCERROR
5 W: y0 {' X E; W9 x+ L0 C" a0 W| MCASP_RX_OVERRUN);
- @$ [- n/ r3 Q/ b- |3 b+ g; e1 u} static void I2SDataTxRxActivate(void)
/ u9 D" O0 N* F' P{
2 [5 o$ i% N% y" _, p9 e/* Start the clocks */
5 A' |# I4 {- ^# C6 g9 LMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
6 i3 D# `& A9 W% i: f& p1 V. VMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */; d% N% V6 t7 M# b3 a& J
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
|7 O& n* M& c: X+ ?; L" |+ OEDMA3_TRIG_MODE_EVENT);
+ c6 i# G- {1 Z& b; i$ n4 {EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ) B% j8 n- J0 ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */$ J; l# P- I4 F$ I
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 K) c6 s; h( o1 nMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */% N: h p' ^6 q! e' {- k
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, ~: S+ u$ R9 T5 b6 y5 k4 M( V4 }McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 v" _ |+ e8 c! W5 t0 J
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
9 B' A9 {: h, g! Q; G}
2 i- m7 N6 ^" s7 t- M. L7 _请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. / v" O) v$ ?! q
|