|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,# J( p' M" s6 E7 ?% q) j& p5 B
input mcasp_ahclkx,5 u- F6 I( W: B+ \* T R# }
input mcasp_aclkx, V, S8 A/ v/ H% X4 @; f+ m
input axr0,, y/ k! u/ R6 U( r
/ P2 c- w: p% s. G2 r: I# n9 C- `6 k9 F
output mcasp_afsr,
* |( `$ ^0 ~0 i2 a1 B: k4 Eoutput mcasp_ahclkr,6 C1 R+ b+ j1 N: m# c" ?, Y
output mcasp_aclkr,
3 H1 @* d( @& zoutput axr1,
% s- | `3 ~* u" Z# O! e( | assign mcasp_afsr = mcasp_afsx;
$ ], Z) w- w- z5 j5 P I% qassign mcasp_aclkr = mcasp_aclkx;- M0 _: r( a! t* X9 k# K
assign mcasp_ahclkr = mcasp_ahclkx;
% L7 Q L1 Z1 s5 {5 j( t1 t+ d, ]9 R) wassign axr1 = axr0; ( i4 Z; {/ X5 m/ y$ t& M6 M
4 q+ l0 @9 g) i5 m" e1 m9 Z6 y- {. Z
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
0 P5 e8 ?9 F. ?8 {static void McASPI2SConfigure(void); n1 y7 I% ?- F5 G* G( N
{
, a" G/ w3 `3 z, p2 gMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 @9 O; v h2 ~: X7 m6 i6 jMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
6 _$ T- K+ A' \# H6 w* q) g' VMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 N8 j6 ?" Y% C# c0 y% w% fMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */! @' v0 o) p$ G. f
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
: J: P C$ U/ iMCASP_RX_MODE_DMA);( D) r" h1 g0 N) \# T+ F
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
" S# a( `/ {7 \MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */1 J5 X4 w% f% h) e {! D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 a% G3 V- r9 u( O; K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
) N' @4 b: L. F6 S- ?9 xMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
* [& m4 e' C5 C3 s1 AMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
% _3 T0 d& |& W2 q* iMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);7 x7 q9 M/ }& Z( U' U5 E
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ( O) O3 w6 a' S: S
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
$ a0 S; s( e! ~( j0x00, 0xFF); /* configure the clock for transmitter */
& b+ e! ^# r6 R0 L; w2 ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);* Y6 `" `/ P2 Y H
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
) w! E% ~8 G q/ o& |6 sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,' T D- P' @) N f* {* j$ K
0x00, 0xFF); E( w0 r4 b: T/ \9 O
. B( H, f C3 ~+ C/ Q& S# u* P/* Enable synchronization of RX and TX sections */ # d; a7 ^9 v# s8 E
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
" }' Z1 o( ]3 h9 F, oMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
8 |8 @5 u) Y2 r9 V5 S% v8 kMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
$ f- B# J% U# J7 } V2 F** Set the serializers, Currently only one serializer is set as! P7 c5 |6 [: h5 e! T6 R+ N, |+ [: z J
** transmitter and one serializer as receiver.
/ _) h+ Z" e$ I*/
) g# u6 T9 l* K0 R7 dMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
6 o* h4 ?( B, kMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*" v2 X% k+ \: [/ w) L6 u4 H
** Configure the McASP pins $ r- t z* I" M5 Z% p9 B. v3 j( l$ L
** Input - Frame Sync, Clock and Serializer Rx
* Y- n$ n) B" O** Output - Serializer Tx is connected to the input of the codec
' m$ D/ W1 E$ p0 i; u*/6 k* j- J% q' I; n2 l' Y+ A/ J
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);. j1 s; E w W! |$ t' ]
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
/ G% Q$ f! y- e2 F: s# J! x+ z5 {5 q, RMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 q1 ]1 c" d) T| MCASP_PIN_ACLKX1 C4 C3 t7 L5 {) b( k2 N
| MCASP_PIN_AHCLKX
6 @" O) K+ @/ u- b) G5 l2 B0 }| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */+ s- N( F. ^1 S4 k, a3 Q
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR , {; E5 C& k: O$ Y* W3 O$ r" h
| MCASP_TX_CLKFAIL
8 I7 d1 R2 p6 s! @. e4 z) V! _| MCASP_TX_SYNCERROR0 K! U2 Q# u& \* a, \9 ^
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR ( `5 E6 x$ _* f6 w G- r0 n
| MCASP_RX_CLKFAIL) f, a! R# Q5 H& I3 b
| MCASP_RX_SYNCERROR
( c- b# f1 Q$ e| MCASP_RX_OVERRUN);! v. N; q. ^% ^7 E: ^
} static void I2SDataTxRxActivate(void)
D4 X( |7 @! y4 L{
8 t- e( ]# [! b6 v/* Start the clocks */1 Z) v* \# Q# H
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
, M b n: {# Q3 q" fMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
" E$ r" T2 _% `' }EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,0 S/ Y/ [' M. V; f
EDMA3_TRIG_MODE_EVENT);
9 {3 o) B3 d( \9 m- B( Z1 t9 _+ rEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
0 V# H. e: u! d" `6 {3 [; OEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
& k; H+ d# t1 o6 J0 wMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 B; u7 }: k! [) Y; u& ?0 GMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
% c: o' C+ ~2 S# k; }' Qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */3 L0 H& E7 E+ `" O Q
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);, ?6 n: `6 |+ D* g+ U" F; [6 R0 r
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);: e3 Q W! a" X, f* y
} * `3 v) G9 P; u2 `
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. # f) d% m/ }7 S: [
|