|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,) Q2 y1 T7 }3 t7 X4 |% d
input mcasp_ahclkx,1 { k, P# A0 [$ Z) ?7 q6 C
input mcasp_aclkx,
( e( d$ P" r2 q: ~% Ainput axr0,5 ]8 j" _* W u$ q( t7 |
9 @ ], b* l* t
output mcasp_afsr,/ s% r+ C% H2 [" \
output mcasp_ahclkr,; G! @* G# a- @: c" x; z
output mcasp_aclkr,% P+ G7 F3 Y. y
output axr1,9 j) z% |9 ~- D$ t1 F9 d
assign mcasp_afsr = mcasp_afsx;
# ]0 w0 u3 n. u3 Q Fassign mcasp_aclkr = mcasp_aclkx;
5 x/ T7 n) G" _( t" O8 `assign mcasp_ahclkr = mcasp_ahclkx;
3 S+ s2 @0 L. w, g5 d( z+ rassign axr1 = axr0; ; z' i$ o% |" f4 f9 k9 I( n3 l$ P
0 f' p8 M2 C- r7 \4 {在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 - V4 ^- k) P* `+ ?$ X0 b$ Z& C
static void McASPI2SConfigure(void)# g. I) `1 U5 D7 S
{" g6 ]; ]# \' W" ]) l/ U9 B
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
; a [% `$ n/ n. ?! l' v% p% B- U7 P7 A2 CMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */: Y' m( I; c9 ]. i* A+ g* V
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); @( K! s1 \; ~: G
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
4 y: [- H7 h: W2 M# J% G. _McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" V' X& k. Y0 O" H: R2 s3 L0 _MCASP_RX_MODE_DMA);
+ w# D* B% P* {" ?McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,/ T9 E* w4 }. _' y" b" b6 M
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 W: d1 w5 h4 @$ [" fMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
# W4 c v% p0 T' S3 J; @8 rMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
* A+ d* q2 k- M. I SMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + Y; p7 m/ J1 j! m% L. F6 W
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
2 A# d5 V7 J+ B2 @8 VMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: j4 B1 G2 K& b; y: bMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' M5 ]% X: _% u" d6 v- N6 F
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
6 }5 M% U, P- w N5 V0x00, 0xFF); /* configure the clock for transmitter */
9 c3 }- P& n7 W( ]- R8 QMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);) }2 y0 T5 j Z2 X
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
2 m6 z! |' T9 u) PMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,# x+ ?+ I& m" P2 I$ j U
0x00, 0xFF);1 g) \6 P# }& v- ^3 F
/ s. c5 W, D3 S" i. G) j4 P1 w
/* Enable synchronization of RX and TX sections */
0 r" U/ x. R: X$ ~McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */5 N. f5 V1 l" M
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);6 G1 d8 v$ Q, X
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*+ H. P- B ^* _; B: r0 A
** Set the serializers, Currently only one serializer is set as
" v' [) |! L4 s6 r ]** transmitter and one serializer as receiver.' @) N9 m1 ~9 W; y
*/' N' H S* C. o6 h
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
+ j( S# G' F, E' JMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
^- {$ }( K$ ^1 }6 l** Configure the McASP pins
6 m! ~8 ?! p2 s {' Y/ L** Input - Frame Sync, Clock and Serializer Rx0 n. F* l3 a7 E
** Output - Serializer Tx is connected to the input of the codec ; M- ?: a, |/ o. q( [
*/
* @. @# C0 E% H/ D' D3 _2 @+ vMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
8 z/ P2 r6 p. g. dMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
! S# I$ M7 T5 t/ s, yMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX( _" \% y. v K6 ^2 |& c
| MCASP_PIN_ACLKX$ H* _1 J. }1 Y$ x7 ?+ n6 D+ n
| MCASP_PIN_AHCLKX( d& Z! X( G9 F+ F8 U
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */! B( l6 `2 U2 C
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ; c, [# K" Z3 R9 E
| MCASP_TX_CLKFAIL
3 \$ C1 H2 I6 K. X| MCASP_TX_SYNCERROR& |' k) a' Z; q0 s
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR " F! S# h$ J: a4 H" D1 P4 Q" B
| MCASP_RX_CLKFAIL
& W4 Y' D% j! k3 y| MCASP_RX_SYNCERROR ' i$ g5 z# p; ~. t
| MCASP_RX_OVERRUN);
1 d6 h2 K6 f& V+ ~9 r} static void I2SDataTxRxActivate(void)* A1 m6 E& }& r5 u1 q( q$ x
{
' N/ o* [1 l4 b9 w5 t/* Start the clocks */2 C/ C$ \& z3 ~! z
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, }% g8 G8 e4 z6 v9 |* Z6 iMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
0 d8 @2 I" |/ v: a& E1 IEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 K& I) M7 W! l" Y) y% o0 }
EDMA3_TRIG_MODE_EVENT);
' F% x, b' q P6 HEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% d" q7 ?4 i' V0 n6 _5 q2 NEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& t7 }' ], N& p/ C& X2 MMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
( b* Y9 Q8 J/ j. x5 VMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
! G9 X+ Q! x2 i& _+ t' Hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */7 s9 o* R: v# w
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
: _" s1 J% m* S6 S1 SMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);6 k- R$ p- x" _0 O/ ]5 b2 D6 T
} ; A1 r9 H# z2 B
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ' I5 W1 p, L) R& h t* C
|