|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
! @3 b7 M! {4 s) g2 ~: Q, ]input mcasp_ahclkx,, k* `# p5 J0 y' a; f5 m$ O2 q
input mcasp_aclkx,
6 r' c0 b0 s" O, M0 s( ~# Pinput axr0,
r% I/ ^& M) b) Q/ q% }- O' A% _: j9 m: e' I; X
output mcasp_afsr,
6 P% c* q! G; G% }7 @# \output mcasp_ahclkr,1 T5 g4 A0 x9 _, t% y
output mcasp_aclkr,
: Q: h4 w8 y8 q9 D% poutput axr1,8 Z: [6 M6 J) a$ j( W( {
assign mcasp_afsr = mcasp_afsx;
! J9 U0 n* F" e# _# n) [8 F% {' Sassign mcasp_aclkr = mcasp_aclkx;
$ s" |/ s. E" q# X M. |assign mcasp_ahclkr = mcasp_ahclkx;
" D, e+ H& q8 |( Massign axr1 = axr0; & c5 }6 k" x* g0 A6 B8 u8 i' H2 v
2 Q- U3 h! A2 u4 E1 ^% P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 5 N. n9 r( X# Q) Z+ F& r9 D3 U
static void McASPI2SConfigure(void)
! G# ~* j, E2 H W1 k Z{- p* [4 |% T+ ?
McASPRxReset(SOC_MCASP_0_CTRL_REGS);! @. e# w7 F1 z. p& O
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
( P7 P. d/ q1 \: G- XMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);) x/ K3 r6 }6 d, a; ^8 n
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */. M7 ~" z8 r7 S* G6 \9 C1 C
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,0 R+ g9 t4 Z Z: b& Q% [! P. c
MCASP_RX_MODE_DMA);, m! v6 Q0 r! C( \& @
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
5 T: N6 [" b0 i# A4 h( D0 MMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, R! Q% C( M2 F2 K$ zMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
2 B$ Z9 K. O, S$ n5 cMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 `& l. G' a* b0 q1 MMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
0 q7 b5 k# [: y- A2 V* a8 r& bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
, u) {2 C" g+ H6 m7 rMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- a; `8 X- ~6 ZMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
% g% T! [1 K" n" BMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 r% u9 ?' @. r+ L6 y) ]4 N
0x00, 0xFF); /* configure the clock for transmitter */: [% R$ i3 S [- x2 G' T& Q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);5 D# n# E0 A3 D5 c' Z+ J
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- [7 F3 i. O: a# O1 ~/ q9 q5 o4 c5 gMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( B- I: X' n4 I1 }
0x00, 0xFF);
; G% ~: K. [6 C5 g
$ n) n3 k+ r! c" J. Q+ H/* Enable synchronization of RX and TX sections */
9 i: t/ B% k' z3 rMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */4 Y' W, Q/ p, K! w
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
5 x( i# O2 [. `* P* `2 f2 RMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
- c& Q1 ?8 c0 |** Set the serializers, Currently only one serializer is set as2 H' X8 x. b8 q
** transmitter and one serializer as receiver.
/ w, t8 m, B' q9 i5 i2 G1 n) u2 t4 [*/8 z N2 }; T, ^2 J) B
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
* b( u& S- Y; Y' M; R. TMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
! ?- Q6 E- j+ B& b2 X d** Configure the McASP pins
9 @: K1 s% U7 n2 M& Z/ T** Input - Frame Sync, Clock and Serializer Rx" x" o+ t7 T" X' e' I3 \$ W8 I
** Output - Serializer Tx is connected to the input of the codec 2 L: Z" D; M3 _+ y
*/
B. c& U/ Y( q' O3 cMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
- O3 H% F+ {4 K% TMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, j/ g; J/ F) |0 C, O6 m xMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX6 o& z1 S. }+ _
| MCASP_PIN_ACLKX+ @' Z3 B) X& p$ ~; D
| MCASP_PIN_AHCLKX3 A5 W: ^. d# w1 Y3 a6 x
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
4 w1 W; l4 K8 v0 f2 ]; N# t% UMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR / r4 K4 i4 o# @
| MCASP_TX_CLKFAIL 8 m# D I8 i0 K: ~1 l4 s. N
| MCASP_TX_SYNCERROR
) d: ? L9 F k; }+ d| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
* |% L% r; A$ w+ @$ L9 T: t| MCASP_RX_CLKFAIL6 A% {1 H& m9 t
| MCASP_RX_SYNCERROR & C. @' ]% ^: Y, n
| MCASP_RX_OVERRUN);2 I: y0 u! A) B! t. i0 f
} static void I2SDataTxRxActivate(void) N6 B1 y" z; h* y% Q# n& v* {0 W
{
2 P$ a0 K9 W0 s3 d/* Start the clocks */; E; j' C7 M( U/ H
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; ?/ _6 ^0 v& l4 s! w5 K: lMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
5 Y3 [8 t. K9 ~5 SEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% K1 X- U# S2 l0 \EDMA3_TRIG_MODE_EVENT);9 h' S5 s N/ K/ o A: n
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # H' b& D! M2 |) x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */8 }: v; F+ [/ R0 }# F2 m
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);8 v9 [# ^7 x" u6 B2 G4 {
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
+ P. k; J5 _5 ]4 Kwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
5 n u9 N6 b F2 d8 `( v ^McASPRxEnable(SOC_MCASP_0_CTRL_REGS);2 x# z9 d6 N1 }. L. M8 E
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
: F3 Q3 u- L. S! d} ' Y$ @& P7 i3 A+ }' }. w
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 8 C2 s6 J, V) ]0 W$ \0 ]1 p% u/ b
|