|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
. f# U3 I7 R4 S" J& B. b5 O4 K9 Dinput mcasp_ahclkx,- R, r! C. `0 u: B! T9 I
input mcasp_aclkx,0 D" O# N2 r8 d# u2 j
input axr0,) d, Q: t9 A; p
' J: E" Z# v F( f/ V E! T
output mcasp_afsr,
8 E& m9 Z% O* g* ~3 U4 m+ Ooutput mcasp_ahclkr,, c' I+ E% U+ D- |6 L! w$ w3 t/ }
output mcasp_aclkr,8 w# p# Y4 v( v, H
output axr1,
" t$ V. q" a& k( i/ M assign mcasp_afsr = mcasp_afsx;1 A$ T& @0 n) l; e6 Z1 y+ \6 I
assign mcasp_aclkr = mcasp_aclkx;9 j- R E5 t" L0 N
assign mcasp_ahclkr = mcasp_ahclkx;
. I U- X8 C3 W+ L4 o# Passign axr1 = axr0;
- @) f0 h M! A" t: S0 X( u% |- Z
. ~0 i' p9 t: K6 q, l5 A' r q/ ]7 L3 u在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 1 |+ w1 I: o, ~% T! c
static void McASPI2SConfigure(void)
% q. `$ M) R" `' O/ X{
- q, o+ H( K) f* u$ }6 EMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
1 V* o5 }2 g# Q6 v9 ~McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */8 R" v- [* u- B% N
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% x+ N8 O% I0 o5 _McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */( m9 ~) k0 Q) `/ p$ r) w
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ @5 [/ s( Q3 D2 M# q
MCASP_RX_MODE_DMA);
- @2 Y3 X \6 ?6 KMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
4 V0 Z+ D0 X& ~1 L% G' \MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 |$ @8 A8 b( d; h# `
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, , C% ~3 D* C+ q- D8 l+ B1 B' J
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% E+ W$ ~ D) t% CMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
2 W$ H0 V6 d# b6 F; H2 C& jMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */& r* H) ~+ R) i( `1 E3 g
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
& ~- `' l# q! mMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
) U+ s1 ]0 E% Z% SMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 L0 B+ g8 h$ A: T4 A0x00, 0xFF); /* configure the clock for transmitter */
# K8 a" \2 R, l9 i$ f; H# `2 DMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ W6 n2 }. i6 r# E% ]8 `
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
2 u0 |% E7 O6 o8 w) u% P3 F+ ]: ~- NMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,- _4 e; q7 u: s9 h% o6 b: t, c: u
0x00, 0xFF);
# ~: V* W/ k; l) d2 F( k$ Z. s
4 |9 Q, Z4 S2 M# b1 I N/* Enable synchronization of RX and TX sections */ ) }4 |# D+ Y# B+ q. G4 P& W
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */ \* E5 z$ X* V' j' h1 u
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. d$ j8 y8 Y' s! WMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
E, \* _3 d1 ]6 z** Set the serializers, Currently only one serializer is set as7 d7 z, N) e* I9 i$ F' k. A' [# V
** transmitter and one serializer as receiver.
9 L2 O( J- \: C$ E& u*/
9 U v% E7 {: o* k" \/ RMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 |& M9 ~ s/ }$ b0 q# v7 x. | YMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*6 u1 S) c8 e, n# j- D9 F
** Configure the McASP pins 1 E) w- E9 z$ s) m
** Input - Frame Sync, Clock and Serializer Rx" p6 x7 q: b/ y% Z+ N7 H
** Output - Serializer Tx is connected to the input of the codec " C6 i: |! c3 y
*/2 i1 u3 B% `" i, O( M6 q
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
% e- t; p1 a3 @" Q: y2 ?+ ZMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));5 j+ y5 A+ B6 _ `: ]0 F
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX! {; X# I( Q8 \/ j2 Q( _& v2 i
| MCASP_PIN_ACLKX( u1 s7 Y9 K9 ^
| MCASP_PIN_AHCLKX
- W- O/ d0 j0 \ Y4 A| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
# c5 N; v6 s/ M sMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ }! k) U! |- T| MCASP_TX_CLKFAIL
( L6 z3 S; t: K! p1 ?+ I( C| MCASP_TX_SYNCERROR( N+ M3 G: F9 |, l8 W% p' {; Y
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
! L! L* G' \& y/ S| MCASP_RX_CLKFAIL
. I4 q$ Z1 J' Z& c0 e| MCASP_RX_SYNCERROR
& M" F1 C/ b6 M+ ?* i5 O| MCASP_RX_OVERRUN);
5 _5 O! i& c6 i$ n7 D} static void I2SDataTxRxActivate(void)
9 R) F! N* D1 p$ X& v. A{5 `5 J2 }3 ~6 w! |
/* Start the clocks */
) l$ E+ G; `6 c. c; D4 g; o: f2 EMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; p) R# O4 p8 c5 C/ R) h) _McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
# T Y8 k% i, q. M4 tEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,6 _/ V0 _ q, v
EDMA3_TRIG_MODE_EVENT);
/ j0 w+ E/ z( }4 x7 JEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 X3 v6 b% A+ V0 R, u" p* M( o. x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
" ]& x8 B3 }8 l! }9 k7 qMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);$ t. u6 d+ {7 p
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
5 E2 M" G" @3 _# N: f7 i7 k0 F7 Iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
0 i8 I$ b& C- u- D7 r" FMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);; K5 x; f; I5 X5 J8 C3 E% d
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
* G! Z# w v5 l$ P# ~} 5 o2 @* z3 s, U! `. }1 q
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. : p. z7 n* \% ]" N3 b- I
|