|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
. j9 T) p$ y+ H1 ~input mcasp_ahclkx,6 b/ e9 Y' |& Q
input mcasp_aclkx," C4 B5 ?5 |& h
input axr0,
, ^! Z/ H$ C6 m5 Y5 K
0 \- A5 ?1 f- X# j0 eoutput mcasp_afsr,
4 }; Y- w4 H+ r( n d% {output mcasp_ahclkr,
5 Y% H7 K& M# H r) Z. _/ {output mcasp_aclkr,; E5 p4 k) ^0 Y# Z3 E E# K" z
output axr1,
7 t. s; p9 u' g- T$ f assign mcasp_afsr = mcasp_afsx;: ~1 y! Q5 T4 i
assign mcasp_aclkr = mcasp_aclkx;9 j% m) X" R8 |) h) f( A* G' M
assign mcasp_ahclkr = mcasp_ahclkx;1 L1 |! y9 Y; i' ?4 f
assign axr1 = axr0; 3 y: l7 w9 Q S
2 T! J- K+ a1 ]2 ]$ T% o
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 / N, S, a+ v _3 T& Y0 F! R% \
static void McASPI2SConfigure(void)
' X: J/ L" r8 T7 z{
3 R7 B( J9 X1 F' ]. vMcASPRxReset(SOC_MCASP_0_CTRL_REGS);# H. w, @& ^0 u! \6 ]! \# J
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
, X; y9 `, `. h! V3 e: z3 g$ z$ {McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);, ?0 v: @4 S9 a1 \: A7 ]4 r" s
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */2 b/ C: W5 k! @
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. K$ v) [$ I' m! A+ Y8 J! s) gMCASP_RX_MODE_DMA);! G, D' E" [# m6 E+ y) I
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( a2 ^' z5 u/ V! i: K
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* G7 b8 U/ N) F3 O2 VMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
: Y; T! [# U5 J# }1 A2 Q+ C% rMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);/ W1 A- j: V! C) @6 B$ z* ^% b
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ N' z2 S! H0 [7 w7 E- bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */* d0 W$ U L1 V# ?5 `
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
( F5 W: l% J% _( PMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* W# T+ l( m M, n( b" OMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,) s. Z. Q7 M- @# C4 R3 Z* v
0x00, 0xFF); /* configure the clock for transmitter */6 n2 b7 Q! e! T% g
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
4 `! s2 g+ q" q, |McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 3 u' H6 |6 ?8 y: x9 J1 w! l
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 c8 X4 E) J; f0x00, 0xFF);
$ }8 p/ k* ~- d7 a7 a8 w( Z& k* v: a4 \
/* Enable synchronization of RX and TX sections */ ; K+ ^0 j# z2 n# I2 b( J z
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* W/ k" F+ d4 j' H7 y6 j9 r
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" V1 Q% R! f# Z1 ~ E) {
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*1 c) E7 d( h0 R: h
** Set the serializers, Currently only one serializer is set as
3 t" B5 x0 G: a** transmitter and one serializer as receiver.
0 m- f# g# f8 c5 h: }*/: i# K& Z! j" A9 E: j4 o+ N
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 ^" A+ I/ l2 y. `& iMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*1 O8 g2 G* i2 s+ ~) y
** Configure the McASP pins
" V0 A" S! ]5 w* s7 e" n# `. C2 U** Input - Frame Sync, Clock and Serializer Rx
+ ~6 Q" Q A+ Q7 K& B' m3 @** Output - Serializer Tx is connected to the input of the codec ' R0 e8 F# Z3 r( s4 `
*/
6 \( B+ ?8 u- l) Q5 H f9 DMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);1 Y2 f3 y+ G6 k, x5 a% K
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
8 W. O: a. ~& p' ~$ VMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 a$ e- A; | K( [# ^2 ?4 t
| MCASP_PIN_ACLKX6 B5 a2 E6 v0 h4 o X
| MCASP_PIN_AHCLKX" T1 ^# Y* K# f. B; k
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP *// z% `5 ?& B" r
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ O! z- Q% M4 p6 ?: Z# t| MCASP_TX_CLKFAIL
' P7 u) l P4 c| MCASP_TX_SYNCERROR8 @/ e( p f- A. w. O$ l$ `
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 7 N5 E8 g6 b* o. c4 _
| MCASP_RX_CLKFAIL
* m0 @% Z7 d5 D$ t a| MCASP_RX_SYNCERROR 2 I8 {9 S4 [, ]* E+ [1 p
| MCASP_RX_OVERRUN);1 r1 P3 S7 e9 [( F3 ^; s0 |4 T
} static void I2SDataTxRxActivate(void)7 V4 x+ S7 Z, K+ t4 ]' U
{- n4 h v5 |9 x0 y' r
/* Start the clocks */
, f0 Q! ^, `+ o) iMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);! [8 P+ i" d7 \8 g& A+ j
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
* g( x' D2 J5 mEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,5 M$ `- L" J3 _7 u: Z9 R
EDMA3_TRIG_MODE_EVENT);
/ w$ ~( Q7 Z: U9 Z2 ?5 ]- V, J! BEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
3 [! O9 A. l O6 c: }' qEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */( d7 b4 D3 o9 h* E- F1 r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
1 s0 z4 p# X7 V' i9 zMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
- f4 M$ t) m; ]8 e$ T; P+ Z4 Ewhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
|- s3 k7 H4 {5 h/ |McASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 I8 z, e D4 v* N& l
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
, C6 {; C& F9 x5 n6 ^9 E) I! R) E} ! s8 y* x" L) v4 H J1 Q5 ]+ ^
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. % Q- G6 S& a1 G% T/ ~ \
|