|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
2 L0 f1 Q4 [8 }; T% e# b! m* u( Xinput mcasp_ahclkx,+ x& f. a8 i' ~& p F* i* b
input mcasp_aclkx,
; d/ ^' {. m) h3 Binput axr0,
! q& V& X8 g' z
; y ~, H. L( X" L9 Foutput mcasp_afsr,
& p& _9 r, T f- xoutput mcasp_ahclkr,, T, }5 ]3 F1 s% S& r
output mcasp_aclkr,6 h# [4 J$ Q# I
output axr1,
) Y. @! t2 X. E) e- ^ assign mcasp_afsr = mcasp_afsx;0 Q- h8 p0 g4 l2 I2 l N
assign mcasp_aclkr = mcasp_aclkx;' V5 R, x9 k; A2 @: Y2 u5 @
assign mcasp_ahclkr = mcasp_ahclkx;
% `2 a) m6 Z2 `! B* ?+ ~assign axr1 = axr0; ( ~( _+ q* A1 Q) K7 c
. m2 p! a! _- ?( y在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
, Y% M) L; b2 Q( s) _! I" Gstatic void McASPI2SConfigure(void)0 |) D3 a+ z4 y, V9 f4 p$ c
{
; T! N P, k3 V: r! w0 m) fMcASPRxReset(SOC_MCASP_0_CTRL_REGS); ^+ x# t# t" F1 n V5 H6 |
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */8 h5 Z( J1 t2 ^
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# ?0 X, D4 V2 D8 t$ VMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */2 e9 D* m p ^) c
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 X, g1 Q& U8 F, R' J* T) [' b5 `MCASP_RX_MODE_DMA);; D3 E$ t( p. a2 I8 O
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
- {. O5 V9 d4 u$ t$ SMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */* D* J. _& z( w) l0 I
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 6 E0 \1 f, _& p
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 R1 @* {7 Y( q; c7 ?+ _9 u$ CMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 2 {( g5 n. W7 Y
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */7 p/ t& [3 p9 R9 @
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);4 X( W3 f6 @ f
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
7 w: I7 X6 D3 r& \4 PMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 K4 b- q- t. I8 U
0x00, 0xFF); /* configure the clock for transmitter */
; B5 Y# m9 ?5 ^- k y, W& }% OMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
& t. ~7 l6 w, o0 k, u4 |( }! ?McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 2 F; s8 z* G8 B6 u
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 s; v- P+ n F! @
0x00, 0xFF);
* o: N7 t! a/ z4 \- |8 [, M& [+ b2 U/ O. |( m
/* Enable synchronization of RX and TX sections */ 2 R8 J6 }. n: c/ R2 p; X: t
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */. c6 m3 v+ g8 c9 c
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); {- D# D9 g9 Z6 f8 i) g7 y
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*' g5 K% u" t7 f! H0 G
** Set the serializers, Currently only one serializer is set as" M9 j" n$ D" A
** transmitter and one serializer as receiver.
/ e; R3 A1 s# x2 G r6 b*/" A9 D7 N; _8 Y6 y2 T( ~3 C* b1 f
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
7 ^5 {9 T! ?" ]* ]& @McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*& I: F) A; H# R' r7 |, u
** Configure the McASP pins
- V2 P& J8 ~0 g* S* k0 z) T$ d" V** Input - Frame Sync, Clock and Serializer Rx3 S! J; b* Z* Q/ ?, X
** Output - Serializer Tx is connected to the input of the codec " m) H/ F0 X9 f6 o* }
*/
: z+ T5 A) j3 J+ RMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
( @3 K9 Z$ Q" uMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 O, @0 ?- o7 p. tMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX* v* t5 w2 X4 V1 ~3 f1 M
| MCASP_PIN_ACLKX
% b0 `3 Q6 w: M$ P0 n| MCASP_PIN_AHCLKX
6 D! q$ q6 V% k8 {; X| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
/ j) Q; H) T! T4 \$ OMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 0 s3 o S6 @" Y d1 |4 f
| MCASP_TX_CLKFAIL ^( Z4 b3 @- _# K* z) i) s
| MCASP_TX_SYNCERROR
5 R5 L8 A" R" o; \' i9 q" x6 K| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& u# x/ v, \4 s8 @. u| MCASP_RX_CLKFAIL, b' W# C, w5 U u" w
| MCASP_RX_SYNCERROR
0 A4 ^9 V$ D$ L$ E4 `1 P1 f0 p% u| MCASP_RX_OVERRUN);, E# {5 T7 N3 s8 r% [
} static void I2SDataTxRxActivate(void)
2 w M" N0 V |0 N& p8 p{
% z6 j1 Q, u4 a% ], r/* Start the clocks */
m1 G& Z. e) L: \McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) h3 s: B0 V8 c/ W" i1 S/ eMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */' r: Y2 E6 _' p2 _/ i
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
1 ^; K: C$ n& I# H- GEDMA3_TRIG_MODE_EVENT);. r9 P8 ]7 C3 ]: ~7 V1 q6 s5 w
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 9 W1 | O) w# ~8 x
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */0 i( {7 {1 M! h3 x- x2 W" v
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);2 R# r7 i1 m) ?- b/ R U9 N
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */% D4 w+ ~8 h" r+ b" d' d
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */! y! }8 X) W+ L3 U8 y
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);8 _9 G9 T' g: m- \) _
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
! J0 k" e7 w$ G+ s6 k; h+ }: e} 2 y4 B3 L# b& K1 z1 h0 `
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. / t/ c$ D0 v9 i* r% i1 E6 B
|