|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
3 J' e5 v3 o/ h# y3 Y7 iinput mcasp_ahclkx,
9 `& t6 w% J# F1 A% rinput mcasp_aclkx,
6 J0 r! v2 M+ t2 U) \input axr0,
; t% D0 y0 L" Z) m* w( A* S# a& R4 |% n) J
output mcasp_afsr,
& a# _4 k% t$ T& A2 x8 uoutput mcasp_ahclkr,
/ l2 N5 q S) ^output mcasp_aclkr,/ s7 E& I! J; Q9 w3 V
output axr1,0 d5 z4 F8 Y8 `0 j2 ]
assign mcasp_afsr = mcasp_afsx;
. W6 O2 \* C9 F3 C; kassign mcasp_aclkr = mcasp_aclkx;0 x& E' ^) O. {) d& a
assign mcasp_ahclkr = mcasp_ahclkx;
P: v4 \! |0 {- ]assign axr1 = axr0;
+ Q7 M& m- B8 ]
* w# A; j% V: @; }8 j% ?在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 + c5 o1 o% z5 T: Y9 G7 Y& @/ F
static void McASPI2SConfigure(void)* b3 t6 M9 k% j3 ^
{& u* j6 S( W" ]/ `4 \% [/ s& l
McASPRxReset(SOC_MCASP_0_CTRL_REGS); m5 p R+ f& j2 F) @7 P
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */# o0 a: H5 ^) x' G: s2 p
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
7 }) o- m/ j! h% D3 IMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */& f% b) ]( {/ K+ }
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, }: A' D+ J1 `( T2 c; z
MCASP_RX_MODE_DMA);" Y7 ?$ A/ w0 C# v- T& Z
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
' \2 j) o3 \# \* W% wMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
9 L- U" @( J5 Z# C8 hMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, v0 ~4 t' j7 V& Z6 M5 i. sMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);9 O7 [; Y/ W$ f$ N1 q" d
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 o8 W/ U5 V: M* H/ c2 `# bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- z. G2 e) R1 f% V# q& G6 h
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
7 r( W) Y4 a! }' H. S* m3 ZMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( W# Y7 [1 [% B+ H+ W4 x6 Z
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( V, B# o- g- @2 @2 e6 D
0x00, 0xFF); /* configure the clock for transmitter */* ?/ B/ R1 y+ _
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
: r( p. M6 o) C2 R6 ~/ J9 SMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
u. E4 P' \* XMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, D" v( |2 A6 R' L( J9 I1 |. V( S0x00, 0xFF);4 W; w! o' v3 ^% P; N' w/ _
2 m B; Y+ ]! R
/* Enable synchronization of RX and TX sections */ $ ]! U; t0 e. D% P; }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 ` s4 W0 J$ g$ _9 I+ VMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 T: I6 B" H8 e- s5 e( R$ i/ I
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
. z: ^, a0 u! h) ?# y$ E/ S** Set the serializers, Currently only one serializer is set as
9 o" P4 W% h* ~. G6 ?# ]+ M** transmitter and one serializer as receiver.
0 J# ?0 r3 u& a7 {: i% p*/
% r6 a8 j* e4 P' J0 pMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);) E0 z( `; O* i, _2 Y; o! v- m
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*8 O7 Q9 h# p; w) L4 u" {" U
** Configure the McASP pins
8 m6 V$ L4 g) b: E% P& T** Input - Frame Sync, Clock and Serializer Rx
0 e/ n; n, V3 \5 g$ Y- Y** Output - Serializer Tx is connected to the input of the codec : y- G" M b6 K1 E5 }) ]9 p
*/
7 S; r, I( J, }+ H. cMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
! c' `; x6 I& z5 LMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
) i& k/ f9 U2 p' F& G* p. E* AMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' z. k" s( a7 }1 A k
| MCASP_PIN_ACLKX
, Y+ B, I4 P- J* \' Y! g* h, Y| MCASP_PIN_AHCLKX
* w( j4 U& @! K" b Z| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */- u( g5 Q) n% c/ N
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 h$ F- }+ U) O% [0 O* B
| MCASP_TX_CLKFAIL
9 ]* F( Q* \: E| MCASP_TX_SYNCERROR. o6 Y$ a/ |. U
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
1 x, U; J- B! Q$ ^. i| MCASP_RX_CLKFAIL
9 H- }6 L% l$ ?; ^ I6 I| MCASP_RX_SYNCERROR : i! [2 X2 b' a8 }9 t4 o
| MCASP_RX_OVERRUN);4 C0 {! _6 F2 `6 M) L) P3 t
} static void I2SDataTxRxActivate(void)
b/ k! |) V; X' ^3 W2 |{
, z5 \8 A% u6 h/* Start the clocks */, d. Z. H1 [. v+ M5 I5 k* a6 V
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);( M- y$ D% p2 E( R6 }4 I' D
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */4 d2 Q- X- c* e3 \# L/ z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
) M+ g" @0 C, q2 F) Z7 j5 QEDMA3_TRIG_MODE_EVENT);
: o! H* G( x: X- z, EEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
3 {9 C2 U% W2 ~1 g* o9 X8 KEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
E: m. M4 c% g0 W H( g! X$ s3 ~McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);1 V7 |5 n0 s2 v X6 l' z9 e) u
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
' N7 P! v4 M" F9 K8 J% [1 [! Rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
# ]$ u/ V) X% k5 aMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ q: Q0 l7 u+ n; s5 L$ l: C
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
+ s: L+ u1 b! R} $ ~) \/ u8 s$ L: h4 M
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. - U7 P$ L8 }! ~
|