|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
; F) y& R( ~/ R4 i! Ginput mcasp_ahclkx,3 @/ c9 T( K* ?+ _6 Q$ p
input mcasp_aclkx,4 t+ Y' z: Q! |# a4 n- _
input axr0,! V; F/ `% ?: Q# x* y
* j$ V& U C, J8 V5 Y' A9 }0 Z9 [output mcasp_afsr,: Z% n ]* c; [# X' v9 o6 b
output mcasp_ahclkr,) n/ ~( M6 R* F w
output mcasp_aclkr,
5 m# v; m# `3 f a# l3 boutput axr1,
' B1 V( M$ Q+ m& Y4 N" |" V) n \* U assign mcasp_afsr = mcasp_afsx;& E& G2 b" `3 `, \& J
assign mcasp_aclkr = mcasp_aclkx;
, F; _; y+ n1 U, r! Aassign mcasp_ahclkr = mcasp_ahclkx;
8 F- D' P/ J' p* w' |- Gassign axr1 = axr0;
5 q8 ]/ ~# q4 W Q' I3 l' i; r' M9 |) U+ ~! G2 o
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
8 `( ?8 S( f# `( U5 E4 n, n. Sstatic void McASPI2SConfigure(void)4 @3 b2 K r0 C" ?: |0 K
{, S" m* d! w7 W
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 @8 Q$ W) y* G# ?. n; N, HMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
/ X) M, N; d- B" aMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
2 Y2 G9 R/ F% }- s: H& c$ L aMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */$ n6 T( G7 a3 C8 }8 i0 f
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,6 u: D$ d4 L! I8 m/ N" [
MCASP_RX_MODE_DMA);
3 ^' a, |9 G$ g9 H9 e5 ~McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,; \% |, b3 |3 U- \9 S
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
6 e) m5 a) z" i- O0 ]McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, * A6 k m+ Z0 l6 l' V9 K
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);2 W+ u) l. Y* q+ x5 C, j0 V
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
' X3 @5 R+ O. ?) p: B% GMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
, A9 O; Y5 |7 b( p( g& QMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);& X9 X- [7 q# W$ y/ J% Z6 r
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ; ^3 o( r6 }4 P/ l0 @9 D/ n& M
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,5 l$ j) w3 y2 j3 ?( ? @8 ]6 H* F
0x00, 0xFF); /* configure the clock for transmitter */
% N8 O; k' J, N% Y( cMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
, x5 h$ S2 S5 r1 B6 T0 V! Z5 e- n" bMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
' O$ V! A+ h, v0 xMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
6 f) M# j" t0 S# N! @* s0x00, 0xFF);4 |9 P) o2 a+ T5 s
: f S0 E. [5 Z: ? T# X" G
/* Enable synchronization of RX and TX sections */
2 r. Y8 i0 D. V' Y+ g" w9 Y$ K( ?McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */! i2 t- z" U. n6 _4 U
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
8 q/ h& D" Q* i1 D& \0 T0 AMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
) p5 c: s+ T5 f& J** Set the serializers, Currently only one serializer is set as
! f. |5 }) r( f. M! N** transmitter and one serializer as receiver.
- F+ R, e2 U4 ?' L n! ]1 a*/
! l' L- [- K) _; W: JMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
, ?6 _# V5 E1 ~McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
9 m% g- l# |& w+ u** Configure the McASP pins + M( w, u; p/ o& f+ X8 x9 e
** Input - Frame Sync, Clock and Serializer Rx, m0 Q) w' a5 W% z& }9 F- V r
** Output - Serializer Tx is connected to the input of the codec ) d: P7 R2 F! P; k# l6 S( i$ f
*/. g4 U2 I& ^& a( X* \& V0 d
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# t4 ^7 l5 e& dMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));7 A" r( d8 \7 R! k$ o! e; E
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
1 E, `! P# m4 s7 Y* }& Y$ C| MCASP_PIN_ACLKX$ `! a* c% H( s7 |( I- {$ R
| MCASP_PIN_AHCLKX$ S2 i' v$ u; b$ H4 o5 _' d
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */% i2 Z6 W# p& I$ J0 e
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
6 v6 S; V/ R3 _- \/ }' \2 q| MCASP_TX_CLKFAIL
0 z2 `+ R% I* N8 ~% v2 V# || MCASP_TX_SYNCERROR8 g% b& ~ g+ N
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR * Z% G" \* k* H
| MCASP_RX_CLKFAIL7 R, p' f0 p4 g, B! z
| MCASP_RX_SYNCERROR # i/ Z/ k' Z. \8 Z V3 Z
| MCASP_RX_OVERRUN);
( D0 [0 c5 S, `' d' ^' T$ C} static void I2SDataTxRxActivate(void). }! b9 l+ l# X
{
- ~ ]1 U. o8 G/ M! W/* Start the clocks */( b1 |+ w( `! N) E) `* d
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);. E9 I5 b( h( I* k3 L0 K# T
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
1 j& u4 u$ e: `1 sEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX," C; J: D) \; s9 O( m
EDMA3_TRIG_MODE_EVENT);
# b b# n, I% BEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 ^, ~- m, J9 @EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
; u E9 d% @8 V: |McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ R# A$ K$ X5 {& c0 _5 q, KMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */+ r: S# b0 e" Z9 }
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */5 r2 C5 v% W0 h( X% ]9 C
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
8 O3 b# D7 g9 M" q4 C0 i, o0 c% |+ CMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);/ B0 i$ j3 y/ t
}
( @' p8 U' F: J$ W* N% e- h请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. & u: h% d: a: Z0 F! D5 B* b
|