|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,, ?1 C4 G3 u; g5 p8 P; m8 V( b+ s7 }
input mcasp_ahclkx,1 q4 x' O# t- @" W
input mcasp_aclkx,! X1 ?& j9 t l. o; z
input axr0,' Z- o ]$ U/ W8 v$ a2 E u0 |% ?* p* F
5 I: W; q* [; i0 p
output mcasp_afsr,
2 ^0 n8 x. `7 z% @' ^5 ^$ n& v" joutput mcasp_ahclkr,8 D9 I0 @0 _: j
output mcasp_aclkr,: L" H x$ @- x4 F# ^( [$ j& C
output axr1,2 z7 s; c; X* M( y
assign mcasp_afsr = mcasp_afsx;" v. Y4 V0 z! |/ A( s- u
assign mcasp_aclkr = mcasp_aclkx;
) U4 }, n- x4 n3 Q( J7 ]assign mcasp_ahclkr = mcasp_ahclkx;2 i# H8 Z6 ^, K6 h. R
assign axr1 = axr0; $ T2 O7 t% I/ H5 E
- G1 b+ n" }; i# [2 k) e% H
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 $ m3 z' c. s2 W$ x2 c6 v& U1 {
static void McASPI2SConfigure(void)
7 ~* @) e* H% B( y8 J8 i{( h t) o* g, r4 x1 K+ g; r( [
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
7 O: h5 | l# v( wMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
. I! i$ t9 `, p/ xMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);6 t4 ?" E- Z9 x! i( l! o4 e% l% k
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */. ]6 x! d$ x9 ~/ z( z; ]& N: C+ S' t
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
+ \% C2 b* y0 [4 D) uMCASP_RX_MODE_DMA);
4 }4 ~" L8 t9 n$ Y/ [' C+ yMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 P9 C( @1 k) G7 G8 N
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */% u2 N! C( X+ ?; C
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- s; F7 i1 f& L1 i& h5 z KMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
! H- `7 C2 W% Z% [' ^: zMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, ' _6 w2 b2 s0 R$ m
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */: m2 l. H! X* X& ?5 o" |
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- X7 E- S0 t+ w" Y6 i! zMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); % c8 n+ C2 T, \* _! M6 j8 Q; b
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,# `& q! k: q; M/ |9 D9 n) B- {
0x00, 0xFF); /* configure the clock for transmitter */5 T, [4 S: Z7 U! N7 v* _8 @% b
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);' _' f( P, u- Y. n
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ' d8 @ O) N3 ~* c" d8 `
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( b! g: r8 K2 ^+ N/ ?0 h2 N
0x00, 0xFF);
0 W0 @4 y, `! R p; \) e, Q( D
! k) @8 w( I; S9 }: n/* Enable synchronization of RX and TX sections */ . P! r: f; Q; W: `
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ [1 g& M& R( x: C& p- vMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% ^. t% E" R4 @% lMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*, j2 Q$ z( U& a3 K
** Set the serializers, Currently only one serializer is set as1 W. ]# G1 g9 c9 |5 F9 ?3 u
** transmitter and one serializer as receiver.; c* I$ H' u; }& ?7 f U9 q! E
*/2 G% @) J; ]: U
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);6 ?5 U; D) D; k8 b7 u5 n# A- R! d
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
- d6 y) f9 M3 M+ _, x** Configure the McASP pins
]: U$ O' _/ D! d6 b! U** Input - Frame Sync, Clock and Serializer Rx
: `! p4 j2 R7 U1 w0 j) v** Output - Serializer Tx is connected to the input of the codec
% t& O0 [( L& ]9 F) {2 i1 T*/
" W2 o& P9 M* i( @3 ~/ JMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);% H1 r& z' o; {3 ]/ \( s$ Y$ t
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));! ]1 L" i2 B2 e* F8 z( n- P, @ Z, n" S
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX# ]; D; Y7 b. l5 M, q- j+ c- M
| MCASP_PIN_ACLKX2 R8 B$ [/ v) P
| MCASP_PIN_AHCLKX/ p$ B) W; C1 ^ m4 J8 \
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */, O4 E" R5 v% H; N5 h
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 t g- u: H) }. }4 C% ]
| MCASP_TX_CLKFAIL $ s% f, \, [6 I
| MCASP_TX_SYNCERROR
. q* h5 e- x% Q| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
W5 p+ Q1 N8 @0 v) A! T) h| MCASP_RX_CLKFAIL# W. P: i- N/ p: t* f% S- C
| MCASP_RX_SYNCERROR
( y; k. _. B- \* o( b| MCASP_RX_OVERRUN);
; c e; Y, E' i7 s} static void I2SDataTxRxActivate(void)
0 w9 o8 x" @1 J2 z{+ H( R2 ~' q- H. O9 Y4 \7 P5 y; i
/* Start the clocks */
: d/ ^" t$ p ZMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);" _3 W, |: s9 {" B- v" ~3 ^' x
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
3 n% m# @/ M' g, M3 WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 Q8 B1 h+ U7 Q. ?, k3 B, m
EDMA3_TRIG_MODE_EVENT);
4 u; U0 f" o( A$ E3 U; _. W' cEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
# J& W: }( y( t: b8 XEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
) d2 s) G8 T. d0 ^9 KMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);5 E$ Y+ g1 O+ U5 |! o! d
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
7 q z7 P' O! n$ o" @' rwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */* x- P* A/ T9 I
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
4 A; b( B! g9 j# \) nMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);; E: x& I2 [7 p4 l6 b
}
, [2 Y5 E2 i/ r8 e. ^) R+ X; `, p请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 5 A6 s7 \- q( }% q* i
|