|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
( `$ o/ i9 t9 |1 kinput mcasp_ahclkx,# y/ U5 e D2 Q3 U' f; ^$ `
input mcasp_aclkx,8 l. R0 Y8 z2 P% C( ^) V
input axr0,6 W" u& v1 [ `' i$ |3 b3 k
2 d; r5 k2 F: K$ k9 Joutput mcasp_afsr,
/ D: n1 K7 Y8 [8 p" joutput mcasp_ahclkr,
5 p) x/ ~: Z7 i0 d% C" `output mcasp_aclkr,. s+ N& @; X m9 O0 F; ~
output axr1,( y/ L0 R/ X' M; b
assign mcasp_afsr = mcasp_afsx;- A: X8 ^( D+ `- ]/ v2 e Q
assign mcasp_aclkr = mcasp_aclkx;
3 D% v& D* r" M, j* ^2 Vassign mcasp_ahclkr = mcasp_ahclkx;
1 ]0 D9 n& ]4 S" ?' D8 w; q( ?7 uassign axr1 = axr0;
7 e$ D2 D1 a' I7 f1 `. r9 O) W
, ~* T8 {- K% x9 I在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
; R* P: N2 F9 U- G r) c' lstatic void McASPI2SConfigure(void)" j) l) @: m- f Y: M# Y- P
{
- s; I! ^3 B$ J UMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
4 Q( l" G' [9 R7 x& u0 kMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */& l1 B8 b& k C) T
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
k$ C e$ F J* \8 LMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 Y- z) p! V) q9 l( }
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
) t* H' r. y2 m1 ~MCASP_RX_MODE_DMA);; h' ^) ^5 W! e' Q; N5 F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; [' X- k. w6 f. p. [
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */4 i1 X7 T" {- I. ?
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 Z' I$ ]7 q( @. n2 N; u) {! P
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
0 j y' O) ]/ H$ _% {5 O) F3 bMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, % y' E0 y* v) h, p2 o
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */0 H- B$ ?' t) w- a* M( d2 |
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 D( b4 S; m" M9 y! a! m
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# A0 t( p9 Y: k6 R; N5 ]) wMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, B6 x3 q4 U/ v/ b7 u
0x00, 0xFF); /* configure the clock for transmitter */
5 @ R0 \' M4 I6 oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);4 w# T: W, q2 M& l" [
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
- c& ?# `9 Q" ^2 m3 |3 gMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 ^& Q1 ^/ N- Z6 K3 g( f' d( }# p0x00, 0xFF);
: _) j2 y5 c/ q4 v; C* @+ A* ]! X2 H
/* Enable synchronization of RX and TX sections */
3 W0 I# g* g! r; V" k0 q# z5 OMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */1 [; w. |" R/ E! ~, c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
2 ^4 _6 d$ }, Z9 Y) }9 ?McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
/ C4 `) C+ ~9 s** Set the serializers, Currently only one serializer is set as% A# _& @: N4 M6 A. M% U7 m
** transmitter and one serializer as receiver., ~% d) y6 U. V5 [/ u6 p( G) ~
*/
! k {5 J( z5 l) \5 Z2 F$ g4 A- i" p: ?McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
1 w# b% [+ E# pMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
- k* y: G4 `( f3 Y( n3 L3 a** Configure the McASP pins 0 a+ S1 L3 Y5 i; W' |
** Input - Frame Sync, Clock and Serializer Rx# `+ v, C1 }; \( ?. F& X$ }
** Output - Serializer Tx is connected to the input of the codec ) j y/ x1 b* X9 @! U0 ?/ c( G
*/0 }! ?# `% M# M9 N3 W& a* L
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);4 e/ R+ G% ]! i @( l
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
$ i- [0 a4 N5 Q% uMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
) }1 L$ E/ n5 x t| MCASP_PIN_ACLKX. Q5 E1 r; c# M8 d
| MCASP_PIN_AHCLKX z, [1 t8 i, V
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ F1 k2 @$ r: Q3 \% i' |+ k3 p
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
2 s7 G' _) U' C- z; Z2 w( `| MCASP_TX_CLKFAIL $ G/ v1 y# q/ I1 q- H8 d0 c9 N& X
| MCASP_TX_SYNCERROR
7 W' g6 l5 s0 c| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
9 j" ~4 W( }( e| MCASP_RX_CLKFAIL
# e d$ ~$ f& t6 h8 F! q| MCASP_RX_SYNCERROR
0 A* h: N- r' ?6 }' _4 Z| MCASP_RX_OVERRUN);
( E# C7 f! r1 K( c} static void I2SDataTxRxActivate(void)
1 g& I4 Z' `3 d2 E{
k& r, k, `6 H$ y0 B, r0 k/* Start the clocks */* A7 q6 u% v' O7 n) n" i; U
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 l7 R3 ]9 P. U+ t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */: ^$ e% H" ]/ S( p/ z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
# }2 o# B% _ \' b$ X7 a6 R+ hEDMA3_TRIG_MODE_EVENT);: j6 K+ T; K x+ |4 \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, $ B, D; u/ M5 @) r1 o: e
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */, T+ I1 Y6 t0 U" ? l# y
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);6 \7 ?9 n9 e- V* L
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */% |8 a+ c R3 C9 g+ m: b5 a6 ?9 I' I
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */( Y8 h- ]2 Y' [ R; R
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);$ t. d/ r/ N/ `2 w" j" F" ]
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; h% g% s0 o+ L}
2 B+ t; d/ { H0 V) N% h+ ~请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. ! Z4 n8 ~2 A" Z0 I; Q6 ^# u/ @( o5 q
|