|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! u6 ~" [9 W/ I# b
input mcasp_ahclkx," z; U" X' b8 Y
input mcasp_aclkx,# y2 b' O+ s" I) g
input axr0,
+ c; P' n* P! A+ e; `# b: j) C$ H1 m/ u
output mcasp_afsr,
5 z* {7 q& c. [" H) t; ~+ ioutput mcasp_ahclkr,) V9 F, ?! |& _$ A) H
output mcasp_aclkr,7 M% x8 r& W+ e
output axr1,
, K2 P" c: T2 c3 Z& V( m- i assign mcasp_afsr = mcasp_afsx;7 u' x' Z, \$ p1 V
assign mcasp_aclkr = mcasp_aclkx;% c& D4 X; l2 n' K7 r# \
assign mcasp_ahclkr = mcasp_ahclkx;
' l1 x' D) o6 lassign axr1 = axr0; 7 T* j7 c( \! ?, |" W
; y- q9 s# j# a& q# k7 H; V
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 0 J5 z2 J' B* S6 _3 m, F
static void McASPI2SConfigure(void)6 S9 p& I' D; \: N! e: F9 i
{
; f4 C2 D' `/ ^' P" u* d3 WMcASPRxReset(SOC_MCASP_0_CTRL_REGS);8 t. L0 m" v" f; r. n6 t8 o1 V
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */( |2 ~' q' O4 ?' Q5 Q* j4 F
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
9 \- G$ m1 ^7 V8 A& e4 }5 MMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) l3 V0 o) _ R1 ]
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ J3 }& k1 U6 d4 R7 A( v. @
MCASP_RX_MODE_DMA);
7 {1 ~4 R/ t) f, m2 JMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 }/ I) W, Y4 C4 EMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */. p- C( {$ A: d, Q
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
0 j. c. K6 J: ^7 l2 _- u6 l" jMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);, Z/ _7 A$ \# U8 C# W% w
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % r0 C1 Z. r; P: b2 O7 i7 N, ~" e* Y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
; P: R, i8 L3 P1 R9 k0 V; [McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 M$ v4 T9 y* b* u- s& G
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
" y* D. V. N2 J% g" `, eMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,* Q. k# Z% `% c
0x00, 0xFF); /* configure the clock for transmitter */
" x' m( i! c& z9 Q! z0 d2 R" gMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);( {& L6 H; q4 o, r
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' X; X' d, E( p) [' S: l: F& O) C4 aMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
4 u& n. a% {3 k5 U0x00, 0xFF);3 ]& H% [* b/ { B# Q
: q) m5 r$ P$ Q/* Enable synchronization of RX and TX sections */ ; ~) G4 d$ `* j$ W. m
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */& [6 ]+ Q* o3 R$ s6 o
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
9 o8 G, H0 [3 r1 ^# R- A" KMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*6 X1 K! ]5 Q. m( S/ [6 @) y. X' z
** Set the serializers, Currently only one serializer is set as
% G" Q) Z1 T: D3 S+ ]$ n0 E- @** transmitter and one serializer as receiver.% U3 B0 d! }& |/ V
*/
4 ^0 C: g% O7 QMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);7 W5 a! W9 N8 y! Z% Y
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
! m1 g+ z9 R f3 F7 C** Configure the McASP pins : Q" P% R0 ?3 |( e
** Input - Frame Sync, Clock and Serializer Rx- [% R- h5 C0 \+ h! Z+ _
** Output - Serializer Tx is connected to the input of the codec # p: M" p3 ]+ f* T- E7 z! u, c! @
*/
( f' ~, s% g, Q! Y2 CMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);" U# b7 c4 ~) u! B% H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
+ n: W0 n- i) n1 z5 R ~McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX% q: A$ C% B" I; H$ U/ Z7 V
| MCASP_PIN_ACLKX0 E& A# [$ C' L/ a
| MCASP_PIN_AHCLKX8 B7 A6 Q5 L: G5 J) x5 O+ h2 E, X
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */) _( p/ z' \' |
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR # E" i( {* i3 J2 y7 ~1 K
| MCASP_TX_CLKFAIL
5 y1 i4 ^# Q5 L& C! |$ `; P! Z8 B9 Q| MCASP_TX_SYNCERROR
. ^6 `1 V, g. s$ V9 X! Y ]| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 1 O" a0 Z- X9 y& A+ r4 N D! k
| MCASP_RX_CLKFAIL
5 i7 G2 l* M1 p' X8 E| MCASP_RX_SYNCERROR
+ [3 Y6 t8 q0 \5 K3 @! G| MCASP_RX_OVERRUN);
' j ^- [$ q+ `} static void I2SDataTxRxActivate(void)% n: R" E! o/ Z9 ]+ o
{
0 r. w1 @2 X6 o6 K" q/* Start the clocks */5 b- _3 ~) P/ |
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. D' g# H" p' i O5 \% X! l D7 TMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */( p+ X3 L# @# k+ j: P7 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! D6 s8 ^) ?5 d1 }: oEDMA3_TRIG_MODE_EVENT);
- y+ u/ r, ~% T! vEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 ?- N5 `1 `( o, {& [
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
: X+ O. v7 F0 A+ }/ E- _McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);. _8 a" v2 ?# `( d9 _
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
, |5 V: r: k! j4 f- r- o# ywhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */1 Q9 c8 _0 H6 k' k
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
5 S. d! C( q% a0 k& GMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);: h1 M' M8 i: X; c8 k9 Y1 U9 F
} " e o0 D7 u; Q# d: X$ d* k
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
% T9 E# }$ q) U h7 r |