|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
% ]+ E$ |0 O- e$ G4 q0 ^9 minput mcasp_ahclkx,
+ l# k" p3 C" h3 Q: Z4 f7 J+ _input mcasp_aclkx,
g q p: l% tinput axr0,- K- L9 S7 x' u; n5 u
! r- h8 `0 q; E8 ^output mcasp_afsr,6 L( a: q3 E9 Y) s; [( n
output mcasp_ahclkr,
2 ~6 H; P# R8 Uoutput mcasp_aclkr,
7 {0 f# W: K* w) t9 L7 k, Coutput axr1,' m' _$ p8 w8 W
assign mcasp_afsr = mcasp_afsx;5 S; r. Q+ j& }9 I; L+ \, E
assign mcasp_aclkr = mcasp_aclkx;
1 r# X2 A7 M* b. Passign mcasp_ahclkr = mcasp_ahclkx;3 x# E" f& M7 @1 C+ |+ \: k' _* o
assign axr1 = axr0; : w1 f; W6 B6 ^) i" \, {
3 a$ B6 y0 F M5 D在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 % f6 O) N: h" ], w6 `
static void McASPI2SConfigure(void)
" `: r" @# W c/ c# ~) I9 a& u{2 f) ]# [0 M& X* m$ Y* W" N' z
McASPRxReset(SOC_MCASP_0_CTRL_REGS);* z' x3 F$ P* m" c n
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */1 W1 t# d7 R# l: A
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/ G% j B/ l$ T! pMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
! U6 ] F$ w( d: NMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 }( A }( l2 D
MCASP_RX_MODE_DMA);8 u* s/ ?( |8 L
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( Z5 f8 V+ C$ a! ~2 g
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
0 G! ^- L3 T4 c6 e5 z9 jMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
$ x6 ?7 i6 y* aMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& ~" \ J( j# H! t3 g6 k5 K) Z
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
% m: z2 ]. p5 h! d/ A' c! w+ f5 T1 WMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */- ?. h; E- U+ m9 X: D% @& @7 b3 M& N
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);! p8 Y8 D1 N# `8 E7 R6 f* {: H1 j: [6 r
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; @. a& G& c; t7 V. D+ X! r. XMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
, y: C7 C% }" X* g0x00, 0xFF); /* configure the clock for transmitter */& g$ W) v( z! P% O/ {
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
2 C( n9 c9 Q$ |McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 7 ]3 C! g* t0 M& ~/ c% Z
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 K# u3 K. s5 G
0x00, 0xFF);
6 [$ I- `* ]1 U, {, ]
3 |! ?% d5 a4 D6 z- H/* Enable synchronization of RX and TX sections */
3 g% q8 L/ U& N% v2 @McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */; P: G% Y' I. ?9 W V6 V
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
Q9 J: c& a/ a, o$ X: PMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*! t* a9 w( c, `7 W/ l- U
** Set the serializers, Currently only one serializer is set as
/ C: G1 |$ H9 Q( O" _' X, U** transmitter and one serializer as receiver.
% G: D0 Y1 A. C- _*/8 S" F' W! U. {- A: y A
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
- w: n$ E& J5 v$ y# R/ U/ o5 sMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*5 K3 v4 J+ t! A+ W
** Configure the McASP pins
6 k) c0 }9 |- ^, j. w7 m8 U** Input - Frame Sync, Clock and Serializer Rx
( g* ]. H& T1 P/ y& |** Output - Serializer Tx is connected to the input of the codec . j; b% c) H& H2 @) L
*/: p. ]; b4 |/ l. l
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);# c( p+ W5 J1 [9 \8 Y% A
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));4 q p6 O$ ]( W. y2 H R
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX+ }4 v) `( L. \) V) A
| MCASP_PIN_ACLKX4 z0 b ~, S$ D2 G6 S+ d- Y' D. U
| MCASP_PIN_AHCLKX
# B# K9 o s1 v| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */9 |* v" f0 ?/ ~
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 9 l9 }' U* l" W; e: x- i. i
| MCASP_TX_CLKFAIL ( _2 z) A: r4 W ]& T6 O
| MCASP_TX_SYNCERROR
% ?+ N9 w$ J3 s) Z5 N% n, O5 L, o| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR / x3 `$ ?/ I8 I5 z5 n5 c
| MCASP_RX_CLKFAIL0 q/ w2 Q* M0 G# l; S
| MCASP_RX_SYNCERROR
% \/ N$ ?' X* M! r( G| MCASP_RX_OVERRUN);
* L" a: D6 }/ m3 T5 Z, f} static void I2SDataTxRxActivate(void)
8 W) h" I" M5 g- h. g5 k{
% a9 B' m' v) c& r/* Start the clocks */. u2 g. @# v! W1 N# }! }: s
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
3 E' R z8 P; |; h5 @6 N% a7 ~McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */5 A+ a; [0 [+ E4 N$ \/ A+ v( i8 Z; y
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
7 N9 `1 y K& Q* A* g: REDMA3_TRIG_MODE_EVENT);2 s7 [2 R2 P# n4 O: A3 g9 ?$ \
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 V5 w" C, m$ U! l8 O; P% K7 }
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */# [" e4 }% G+ ~# Y. \
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 c% M! e) F! n8 w3 L) U: e
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) z4 x+ y# j" C6 T
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
/ y- F! A1 V: F0 D$ HMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);: q- r R. U5 n3 r! u$ d
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 l2 H" U) J: D+ k" c
}
0 f) ~1 P: P# i: t2 C请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
5 _4 E* y! ]: ]4 @/ A) o) { |