|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,! y+ m! }& M4 e- b( ]# X; s! W: l
input mcasp_ahclkx,
- }. m9 Q9 u% u- F7 \. Kinput mcasp_aclkx,2 S" x' g: u0 F
input axr0,
$ H6 v: V( h8 ^$ q1 A7 _- a
. @+ \) | W/ x7 g1 J- |8 Soutput mcasp_afsr,2 q, S2 A* J& {. @ q5 Q" J
output mcasp_ahclkr,4 R- Z: D! |# I) d
output mcasp_aclkr,
]$ E0 D% y. @( L8 @& Voutput axr1,0 U3 S7 B, I" u/ M$ z+ `8 Q4 B
assign mcasp_afsr = mcasp_afsx;
) ^1 B2 `& x" D& f' |0 p+ M* lassign mcasp_aclkr = mcasp_aclkx;. C3 d4 B: |; L4 Z: I/ L/ t
assign mcasp_ahclkr = mcasp_ahclkx;% q* V" F( e0 `1 [" `, P
assign axr1 = axr0;
; G; s* q0 l, t4 q7 \; o' M3 m
8 O# z3 t0 q7 R在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 - g0 _ [6 t$ x/ |: `, _+ V
static void McASPI2SConfigure(void)
, z* M- D8 F6 l) w8 F" W{2 ~+ a0 a2 a8 \0 {3 S8 U0 @; i- a
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
& V4 \% W+ H/ E) n7 B) iMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */; P6 G# O( |( B5 ^7 X. P4 J
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);+ J2 r* W7 @9 O0 n8 `
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
- B8 ^3 x$ T( y1 a% t' nMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,+ e7 U- U1 l* K( c; s: ~1 i
MCASP_RX_MODE_DMA);
. i9 m% ]. w# ^& c- W4 XMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ T+ S2 R3 R ]0 K4 k: ~. JMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
" t7 q* n# V* n3 u' P) } j" rMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, - D0 S/ m6 J; S$ ~
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
( T7 q1 t8 T% A) ?. vMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& f5 x* ?6 ~/ |. bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 ]9 @3 Q' h( i. N% j1 `
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
0 C9 x! D* g ~McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# U, x2 i1 E0 J+ b" CMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,6 I2 F J- r8 B5 x) Y
0x00, 0xFF); /* configure the clock for transmitter */
3 L; B' I% P# e6 C# m9 ?' uMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);+ k" @9 Y- x& \' F5 i6 E4 q {
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / T, I `. Q3 j; d0 o
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,3 {; n& c$ B% g' h( e4 o
0x00, 0xFF);2 H) f3 ?. I! k1 j% C; R
5 E; d: T$ z8 @# ^; j1 \1 f
/* Enable synchronization of RX and TX sections */ - ?# u- f. l, e
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
7 q: M9 a; \6 s; n+ c6 NMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);/ |* i- n. N) G7 q( R9 L
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*( c7 q3 x$ \, X3 j: c2 b1 t; @
** Set the serializers, Currently only one serializer is set as& n" Q6 k, Y; E( e1 _
** transmitter and one serializer as receiver.
# a3 z$ D: N) f*/
1 x3 C! y9 e" O: K. ^( y$ I2 ZMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
9 C# Y6 O1 o% X4 N& K- Q0 vMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*; a) j. A# D' Q, {4 a
** Configure the McASP pins
% J5 w4 h) T! B) D** Input - Frame Sync, Clock and Serializer Rx* r0 K% ^5 W$ c. C4 n }+ `+ x2 F
** Output - Serializer Tx is connected to the input of the codec
2 J" P7 h8 A) M$ \; z*/
# l- g: E* M- }6 d' U$ P0 O7 `) h+ C3 iMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);' y1 L0 ^" Y% U! U
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. _2 J, }8 c zMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ |7 D3 J* _. |
| MCASP_PIN_ACLKX3 K. V6 y. ~9 V/ p8 n: |
| MCASP_PIN_AHCLKX
% }( W7 F |' k7 R9 _* O| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */' H v$ J. U5 m
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
, a9 I+ _; K0 e7 h$ g0 b| MCASP_TX_CLKFAIL
# C2 D) X, f r8 Z* K| MCASP_TX_SYNCERROR0 M" [/ `6 z7 x# [1 c0 b
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
. D# I5 e. Q+ f c4 }| MCASP_RX_CLKFAIL6 ]0 g; |- s- P! c
| MCASP_RX_SYNCERROR
. U; q1 z5 \. j$ [, D$ G4 {| MCASP_RX_OVERRUN);: T; ?* h# e1 l
} static void I2SDataTxRxActivate(void)
z$ M* n( ^, }{+ o2 \9 K! o Q& t0 N0 b
/* Start the clocks */3 l: b, a" |2 p' o2 k% t8 k" P# z
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 ?0 {1 W. a3 F, O, l3 ?McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
# j. h$ T1 q4 N1 L6 t- MEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
. R3 [- _! S% z- Y6 ~# s8 w2 NEDMA3_TRIG_MODE_EVENT);7 L/ t" S8 n/ R" k& Y; [/ ]8 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ O2 @+ \5 a: u( R9 XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
E" z' ]- e2 CMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! ~0 T: C& m& d; p& i5 l9 s, FMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
/ Q$ A# e f3 [ t' g: |5 b. }while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
' w9 d; ?1 N6 h- x C9 Q* A: tMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
1 m" p8 y; l4 Z) O% n1 d, UMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% m* T8 s F% j, D3 N
} ) |' d* g) g' p' x& n4 x
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) s, G0 {7 X0 ~ |