|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,& N6 b. }. A# V; j( U
input mcasp_ahclkx,
( I& i6 _5 s/ M. e3 z/ r" linput mcasp_aclkx,
& s' m1 T+ H) h. K: J4 Z+ ^' @input axr0,
( M2 @/ ^; s K" V- s
7 }) c- Y# `6 [3 c% q1 ]9 R- loutput mcasp_afsr,5 i* ~7 i2 Y' d
output mcasp_ahclkr,
4 e. l( j% `' v7 H* \: w' foutput mcasp_aclkr,
% Z# d$ _: g+ ^output axr1,5 q* N$ ]) C. Y
assign mcasp_afsr = mcasp_afsx;
0 C J) F" t2 _& Aassign mcasp_aclkr = mcasp_aclkx;
" `) h: v8 n5 }) M+ ~assign mcasp_ahclkr = mcasp_ahclkx;% e, f+ S. T5 j8 [' |& S
assign axr1 = axr0;
. O( V3 R$ Y7 m! D1 e/ I |
0 H+ e4 s4 n# I3 i" P' L在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ' P& @% k6 E; {8 n
static void McASPI2SConfigure(void). a& X' _3 I5 }9 g. Y
{7 L' r; b# W) j3 s4 _( @* O/ I0 a
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
3 u: R' P+ W! ^, \! m. kMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
7 B. z9 f/ q" }: JMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
1 p2 v/ A5 `. |. f3 b: o4 [McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
4 H n1 [ L: h6 e% z9 I2 FMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 m9 y2 L. q( j7 ]6 `9 o
MCASP_RX_MODE_DMA);! G: i, E! w$ V1 h0 a& f
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE, F+ l v0 Z" y- D$ I3 ]
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ G4 b! z9 @5 t: a* `7 c& r/ }7 o7 b LMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% b4 U/ h5 D. V6 j! X# tMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* u. ^; i9 H+ U* U1 g W
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, . M6 Z% I( J/ ?. ]0 z1 M
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */! k" L( `2 |- B9 p `0 t
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);" C, a0 j8 v' J6 t
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
* Y' }6 ]8 ?# b2 _: c% `+ B* jMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 y4 P) o9 I- ^2 V& d
0x00, 0xFF); /* configure the clock for transmitter */
8 C/ w! K. q8 I3 Y" i: y) \! u+ YMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
* m) j" b; ?. B0 Q( s8 O5 E; AMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); : b: k% D3 M2 B" P7 ]( T, ]/ B ?$ j
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
0 Y3 c Q# W( M2 K0x00, 0xFF);
) Z2 g! P" @" R* p; s% ]$ E# U( T! o5 ~1 }" a' ]9 x2 ^/ L2 n
/* Enable synchronization of RX and TX sections */ + B; J5 c9 U' {% z- }
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */* h4 F& O2 H; e9 y$ } A* ?
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
4 S6 d6 ^5 ?: S& \McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
" P J& {# Y8 Z** Set the serializers, Currently only one serializer is set as2 V% Q: `" d) _) P( {7 S1 X
** transmitter and one serializer as receiver.6 X% P4 b8 ]' M6 O& a6 V- _. N
*/
; A/ a- V& e/ g sMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; F, D. g9 I; b
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
( k- B N( ^: ?** Configure the McASP pins ' E+ U$ |; t" M" ]* v0 f
** Input - Frame Sync, Clock and Serializer Rx
- j6 g3 a! y' _# q9 O0 e7 d4 X. o** Output - Serializer Tx is connected to the input of the codec
9 ?3 Q/ Y" k9 j* E! @9 ?*/4 f9 J W1 q% {( j: n( `$ n8 b
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 m1 c6 [# w' g
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
4 w" B3 B( m7 c2 ]1 `; [9 SMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX2 K( S. ^5 Z: D8 ?7 D7 P
| MCASP_PIN_ACLKX" Z5 D5 |% V |2 d
| MCASP_PIN_AHCLKX
) p, A$ W6 Z) r$ h1 f6 E/ \: g| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
, Z8 _% ~3 \1 g' [3 z7 aMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
' ~& K @4 _8 r' i# a0 S; e| MCASP_TX_CLKFAIL / \' t% E4 u+ `( N* \' |
| MCASP_TX_SYNCERROR
; `( x# A- e+ f3 n3 q+ L" `$ r) w+ u! J| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
+ u% l/ Z5 J2 Z7 P% ?, `; z4 {| MCASP_RX_CLKFAIL
/ X) ?; R7 d6 Q& u| MCASP_RX_SYNCERROR
7 W+ e: z" r7 H9 H% y* l| MCASP_RX_OVERRUN);% i3 h6 }7 z8 C3 a2 u
} static void I2SDataTxRxActivate(void) Y( ?1 M T2 p8 A5 ^
{( F+ s& F. Z& ~% `4 F! y: \
/* Start the clocks */
; q/ O- n/ R8 g4 xMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; @6 r0 `5 e: f% ^6 p" t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */7 a% p, M6 ?0 c1 t6 j# W
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,% j1 p# [! \5 M# y" Q+ c% g
EDMA3_TRIG_MODE_EVENT);
0 b4 b7 d+ z! S/ j" E& [2 TEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; L$ h. N( u$ g
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */2 g& t4 c, X/ r. X
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
' ]% S1 ]7 Y. ]McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
9 g" j" `8 P9 Q" F1 f& G. U+ q1 dwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines *// `, ?& L. P \& o& a, \
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 i& z3 b+ A* L' q8 L) K& kMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);) E3 w2 r! A+ q% Z9 l: w
} 8 Q2 Z1 l& s3 v" G& c/ t
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. p' \7 C- a3 |6 C M! x
|