|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx, e: i6 y% L \2 N$ w# N& s
input mcasp_ahclkx,
' _0 ]. X: A3 [% |input mcasp_aclkx,9 y+ _8 L7 @! Z8 X% o; [) i
input axr0,3 @! D6 ?. R: Z" j8 D
$ l0 A% y \3 B+ a& aoutput mcasp_afsr,! g8 u y7 u3 G$ j* D) L0 Y
output mcasp_ahclkr,
7 ?7 T3 D/ r* l2 eoutput mcasp_aclkr,) P0 T! l. u {( V9 K% E9 y
output axr1,) O* r5 X# W, P4 k2 B
assign mcasp_afsr = mcasp_afsx;
U1 V8 p" y4 i) @: z& Cassign mcasp_aclkr = mcasp_aclkx;7 S6 H8 r( u$ ^5 L
assign mcasp_ahclkr = mcasp_ahclkx;
. s/ k$ w4 `' ]* cassign axr1 = axr0; 8 } _: G0 A5 @- H1 K
: \" ? p$ L5 a# ], S8 a0 ?1 _! @
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 9 @: q2 o" j, Q; R k
static void McASPI2SConfigure(void)
4 T8 ~" q8 W% d4 G9 q9 P{
# l ]/ X( C5 X1 R+ tMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
* D3 \% O6 ~$ h+ Z$ M" [McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
6 u5 u' J" Z5 N& P% tMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
3 X/ s- U6 N1 KMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */) d4 o5 t, U |% X
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- b; [8 Y: Z- b: _MCASP_RX_MODE_DMA);8 |; |/ q8 y; w) m6 V
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,! T0 l- N# V/ i6 m" C z5 M
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */( ?# y0 L3 o& w% b
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 2 ~# e- ]6 h- z9 p2 V2 e
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);* o: `6 |% Z! ]# {+ b. n
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
" |. U) K3 |: LMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */. e8 i# X1 A0 n4 v( X/ r$ O7 I
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& _* \- k! y; }+ R* }9 M
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 8 H* b4 ~5 r- F4 r4 x, t& ~
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
, g, ]/ Q+ Q+ F( f7 D0x00, 0xFF); /* configure the clock for transmitter */
9 d8 t V4 G* X6 x$ kMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
+ E% g3 F( u" C2 r1 p f/ IMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 a: H6 N. C( ]/ O, sMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
, d" A* C3 u3 Z9 u) b3 s0x00, 0xFF);3 G5 [; d J: v
" E- {2 ?; W; N0 K/* Enable synchronization of RX and TX sections */ $ z+ I9 C: v4 q- N
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */
% r/ ~/ ^3 W' W7 R3 MMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* Y" x9 C' y3 v! ^6 S$ j
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*7 i* l0 [% Q$ c1 O: v8 B: h1 C4 z
** Set the serializers, Currently only one serializer is set as3 `, x1 W' D1 c% V7 j) x
** transmitter and one serializer as receiver.! g' Y4 K4 h0 D
*/0 t: M% l6 Q" ], F* c0 e) i
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( G$ i- J& f5 k0 A
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*# a* K- y1 @4 ]
** Configure the McASP pins " d4 q @8 @1 i& v* ]
** Input - Frame Sync, Clock and Serializer Rx8 K- v( x! H$ P6 [. k7 z8 _7 k) [9 Y) l
** Output - Serializer Tx is connected to the input of the codec
' ]9 {* o: ~* f; E$ O*/- z+ J7 N7 Q3 I( s. e
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 l" u& A! w, D& S/ h3 ]4 ?! P! _McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
, L8 M$ R3 U- \% K2 wMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 `; ?; p5 Q: L* |% c2 @* k
| MCASP_PIN_ACLKX8 x8 r$ w% r+ l( G, r
| MCASP_PIN_AHCLKX
. ~7 U) L) B. D$ u- G3 D9 R| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */( U) T5 i$ r; A3 f9 U
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
) [, h" X4 L" f# U2 I| MCASP_TX_CLKFAIL 3 q) L2 t" E4 d3 g+ i4 W
| MCASP_TX_SYNCERROR
% ^8 l: d# e8 }8 v% B4 z| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 4 F' U( K1 |4 C! V) z
| MCASP_RX_CLKFAIL
5 b5 y4 q! f$ d1 M) c, @| MCASP_RX_SYNCERROR
, {* z0 \8 m( U* O, V. e8 G- R3 M. ^| MCASP_RX_OVERRUN);
7 q$ s% N7 s6 c! C, ~} static void I2SDataTxRxActivate(void)
) a. V" r3 u- n{
! j# o& R% w2 H6 B1 z3 ?/* Start the clocks */
' ]' N5 e6 y5 ^McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);# K |# Q$ v, |0 {( d
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */* T- |' W% w& C! i7 J# }! Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
' t4 }5 u3 Y6 @9 y3 S+ o2 Z% O, fEDMA3_TRIG_MODE_EVENT);1 U8 B! w B6 }- H( K7 e, }3 X( G$ Z
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & X5 P) e' i; V' k% S! ~/ z% C
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */! U' G0 I# } t7 q0 F8 h1 P
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
% L2 ?8 S9 T6 x( E1 h* C F; SMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
3 F9 g6 E; Q) l0 R# E4 l8 Iwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */6 `+ q6 T8 R7 }
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! X2 A, W9 e" P/ u8 G) iMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);$ ]& P! f5 a g1 N" v
} / ]9 ~. p1 }2 q' D4 l* v5 x
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 4 u1 {' n) T( @
|