|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,$ |" R, {) q5 X# v
input mcasp_ahclkx,
j2 G* O: ~- E) X. {7 Zinput mcasp_aclkx,; l+ o1 X1 N! N6 H
input axr0,* X. d- r0 i/ x& m) d
: j6 n! ^ E- \ L! s( ^/ Eoutput mcasp_afsr,! n4 ~9 @. d% }
output mcasp_ahclkr,
5 G% @7 M U) O9 |$ Goutput mcasp_aclkr,
0 L, O3 ]0 ~8 {) voutput axr1,
- ^0 s$ O) Z4 x. Q assign mcasp_afsr = mcasp_afsx;
2 H1 u6 l1 {: @ L1 K0 A% g' N& A" Aassign mcasp_aclkr = mcasp_aclkx;5 A* y& R4 y' D( b. X! J9 Q
assign mcasp_ahclkr = mcasp_ahclkx;
- n2 V/ o, C2 G0 uassign axr1 = axr0;
! ~. a4 k& k6 g [& {3 r
; a0 Y' E1 A* d2 `$ i3 v" W在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 : q s7 x& Y# k9 V0 I3 \
static void McASPI2SConfigure(void)
- r9 Y; B+ s8 T5 B{
3 L! }/ q. [: q$ ?% t* zMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
) G6 J G9 a( g" [McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
0 O3 R x) t b! X$ ^McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
F1 l5 X; f, Y1 s4 tMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */4 ~( y1 F, u! l. e( z2 G2 U( W( C7 z
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 P6 L1 Z; i7 }% i6 ^' RMCASP_RX_MODE_DMA);
( N/ g, g; Q6 V! iMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
; R3 X6 L; r E& ^% _- dMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: B( ^0 u. q1 T/ n1 O- ?McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 8 H; v0 {/ D' H8 t! ~8 A7 x
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
; V, b# {& W3 M% T2 r9 {# ZMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, " `6 I) X8 @9 [& V6 ]
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */( a$ j8 y: S' P) d6 A+ u% h
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) F' Z7 Y9 R' p IMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
+ N! |- C) `5 |# q! T9 i6 b; `McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 }/ b$ J+ d# I1 @) o+ J- U
0x00, 0xFF); /* configure the clock for transmitter */
% w7 |6 j: u0 d* t# ]McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
6 v$ Q2 E% Y. ]0 d1 _8 |1 TMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
& l& Y4 ?5 R; b3 ]) n! N; V- X" aMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
a5 }/ o% w6 ]0 D7 y4 B0x00, 0xFF);
; [* }7 d2 l P. k
K4 F ^+ z+ D. K# u) e) v/* Enable synchronization of RX and TX sections */
( b* o2 A1 ^5 d$ e8 ]* w6 J" oMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
* W, C! c. l% AMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);$ R) t6 [) ?% |% X8 M9 o
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
. R- t" s) r6 `( l** Set the serializers, Currently only one serializer is set as. @. ?5 I- s2 y$ o% v3 x `
** transmitter and one serializer as receiver.
; j8 _3 o5 t3 T7 @*/
& ?, w; @6 I% C& r6 R# N MMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
! _; I- P% `4 _( jMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*1 s9 w! M- y7 C- a# t% ^4 W
** Configure the McASP pins 5 A( w6 |( Z; D. j M
** Input - Frame Sync, Clock and Serializer Rx
: p7 q2 V% i6 B& z+ h6 G** Output - Serializer Tx is connected to the input of the codec ' b6 T% d" z, _: }) X; Y& w! i
*/
2 U2 p( f0 d5 e+ X8 sMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
) Y5 h2 Q0 d0 D/ O! R4 B! oMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" D8 Z4 f* t: C% S6 F: N3 `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 K! ^1 k5 v3 k: p| MCASP_PIN_ACLKX# \4 F1 T/ I s
| MCASP_PIN_AHCLKX
6 e N6 ?- h, x7 c4 P. k# L| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
% \1 [$ y6 r2 ^" ~; N) I- CMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
+ Z+ |: X% P: z2 v0 p9 V8 D| MCASP_TX_CLKFAIL
2 Q# @2 }- k( x Q5 A1 m/ v| MCASP_TX_SYNCERROR4 I, f2 l n: y8 {. C
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
6 E# {" [: T9 H: S( F# ~" J! @| MCASP_RX_CLKFAIL$ [( F+ x, S5 d( j5 U5 R6 }
| MCASP_RX_SYNCERROR
* F# s0 y( K" Y$ x/ l; X8 l| MCASP_RX_OVERRUN);5 F$ T0 C( u3 Q- N
} static void I2SDataTxRxActivate(void)+ G4 Y! @! V3 H' T9 |! Z& Q
{
. l6 Z3 T) P# [# N6 ^/* Start the clocks */
0 q/ A1 A# t- Q7 EMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);; V$ j; n% y; v- B" V) {
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */9 ]9 N- K# Y+ \1 W" y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
; Y p1 r2 ]+ g$ u1 kEDMA3_TRIG_MODE_EVENT);
# n' Y7 m9 D0 b( ^" D' REDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ; u( m$ u- p$ A
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */# D0 X1 S W& g' U1 `1 Z
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);" f6 {3 g: `8 M% f$ |7 j( w
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% A! ~: u2 u$ }0 w1 Hwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
$ X4 [) {9 c, t, x8 `McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' y; }& O& r9 r( O5 }
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);: w# `2 Y7 {/ A% _ n/ P5 f
} & w. E5 t% _& u4 N
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* D9 }! T' i' D5 k6 Z+ V% _ |