|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
: Q# n/ g0 f5 a1 W9 [input mcasp_ahclkx,' Y8 {: y% B4 ^( Y3 g
input mcasp_aclkx,
7 z% L8 Y; q1 pinput axr0,! |; g" j7 ~4 ~" D+ M( H
+ ?% F% v ^6 toutput mcasp_afsr,7 N) Z! L) T1 X3 r9 Y7 r7 ~" O2 d# |
output mcasp_ahclkr, e- v9 u- f$ [: v+ |
output mcasp_aclkr,
) U9 \" V3 t6 ?4 Qoutput axr1,: n8 M9 [1 V; a, k4 @( G2 j/ M
assign mcasp_afsr = mcasp_afsx;2 C4 r" l( E9 G( K# N/ R7 O
assign mcasp_aclkr = mcasp_aclkx;; x8 R* _" D: ?, J ?7 f: i
assign mcasp_ahclkr = mcasp_ahclkx;1 S, i! G1 a! j, d% C
assign axr1 = axr0; 7 p2 H. d7 E8 V
7 d J) ?6 R- P ]( ?: `在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ! U; q* |/ @/ Z5 w
static void McASPI2SConfigure(void)' c3 I' N) @0 o8 F
{
- J" L" h' z9 uMcASPRxReset(SOC_MCASP_0_CTRL_REGS);* m& p6 ]0 D* ^" N! Z. Z6 M
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */+ A0 Q! k; B4 b1 e" H
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ v9 X4 `7 |6 V D
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */6 z* x# E' i( ~* M1 \
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- V8 M9 q: m5 h1 o" U5 @
MCASP_RX_MODE_DMA);
' F# o6 }' X/ B1 i) fMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ P) k& a0 |: | y, mMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */, P/ i0 ~% T8 j; \
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- h2 w1 @" G( g6 |. t bMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 z! w8 {) o& OMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 T) k: f% z% k7 g' ]8 ]; GMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- M$ \/ }, {; ]2 c8 t7 J9 E
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);+ @7 ]1 b$ A6 U. { B
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
0 f" X, `5 _* M. \McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
: p5 b/ R8 j& L% N1 c0x00, 0xFF); /* configure the clock for transmitter */
. J% }2 m) `+ P% j, p6 W- o: N& ~McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 I- t# z! V8 g
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' X" w+ a* H# d8 {McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 z* d- U+ i/ z* n
0x00, 0xFF);
. A" q2 c% L! [
4 y+ G% _! `# N( e5 f/* Enable synchronization of RX and TX sections */
* D' q; v' }3 x. x; a3 h6 [McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */" M2 F. q; Z! O& r2 N4 @* o' I+ T
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);( r0 ~; c9 k0 D7 T4 S! G0 `) Z" ?
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
4 ?) g0 E9 `. |/ C' a4 z** Set the serializers, Currently only one serializer is set as
1 X+ ~3 U9 x( ]( f1 }** transmitter and one serializer as receiver. J6 B, C* ]! X }/ j I3 Z
*/
3 ]5 z2 |1 G+ UMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX); `7 A' V: ?& [. j$ C" m; B
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*# V0 r& t8 f2 l) a7 v1 @
** Configure the McASP pins $ F% \4 W& M; E4 V" Z9 _
** Input - Frame Sync, Clock and Serializer Rx
0 _ t- W% G! \ K5 F# K' @** Output - Serializer Tx is connected to the input of the codec
$ b" s2 k# h( `/ O*/$ F2 A9 O# }6 [5 f) N6 p
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* B4 L) B9 U8 D, j4 tMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ H# }; V& s' P9 L) Z/ y, fMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
4 p$ k% I9 H/ S| MCASP_PIN_ACLKX) K6 ]7 s- }, ?7 m& L& R
| MCASP_PIN_AHCLKX6 J$ Q6 I$ X0 X1 o6 l9 Y' p2 Y- g
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
3 c8 |+ q( ]9 E5 MMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, U8 V5 u& F A" E t( O| MCASP_TX_CLKFAIL
! K6 F, Y$ d% a, y) O| MCASP_TX_SYNCERROR4 v+ D6 o+ [/ q1 O, H1 A& F
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 6 G2 \1 ]! f2 z1 \: r7 \' T1 m' {7 l
| MCASP_RX_CLKFAIL4 V$ g; V) O3 S% b# k, f
| MCASP_RX_SYNCERROR : F2 H% w0 l. D2 v
| MCASP_RX_OVERRUN);
: ?% g' E8 X6 N' t5 f} static void I2SDataTxRxActivate(void)
% k! F7 x2 i* U8 t! f{
4 t/ J6 N! B9 O0 a3 m+ \/ K/* Start the clocks */; N3 L. I. s8 I
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL); F- r c3 z+ M+ @$ k
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
) C2 Y1 M& w* E _9 B; y- l- fEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
}+ r) r. ]) p0 u4 hEDMA3_TRIG_MODE_EVENT);! {9 W+ T7 w4 h% T1 F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
+ z3 R$ b* \, B! C9 D. h& |7 ^EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& K7 h7 D. ]* z- W! c2 h( K1 U6 |McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- w2 x; D. ^5 _8 _$ L% O
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 c( e# D0 U4 h' mwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */: \& a: V2 b1 ~% \8 t) X& [
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
/ s8 W7 u6 J- p {2 jMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: M% r& {5 T% N% W* h} 3 q6 d; i& l; t9 _2 V0 N9 @$ u
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. & [4 h/ B* o- k) J1 }" C8 ~5 Z
|