|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
2 P- Z$ k$ y- ?. I5 t5 sinput mcasp_ahclkx,7 R) y. r! o0 z
input mcasp_aclkx,) e c4 r3 f3 D6 p4 @* M2 A
input axr0,, d+ s( h3 G& S6 C
# |* }) y4 g8 b1 i2 C' A& ~
output mcasp_afsr,
w! w5 S* m) x2 C5 R4 Uoutput mcasp_ahclkr,( Q2 X& I A- S4 A) K
output mcasp_aclkr,1 Q5 ` v2 y& b/ Q
output axr1,
' [( M4 z. p" w7 W7 G assign mcasp_afsr = mcasp_afsx;/ I4 i8 @. k9 o; _
assign mcasp_aclkr = mcasp_aclkx;
* I; T$ y X( e) kassign mcasp_ahclkr = mcasp_ahclkx;
( H7 Q9 Y7 U; S2 k% ^assign axr1 = axr0; ' V, d! Q/ J' k7 o- }. D
. @8 e+ ?! {" R" d4 z0 Q在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。 ) u- V/ M1 v% K- h6 _' G
static void McASPI2SConfigure(void)8 D3 s8 B2 ^6 l
{$ f; k' r- D* W5 r8 q
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
) t8 l& |1 ?3 cMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */
c9 x3 C$ W+ ~" L2 jMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
I/ X4 X2 f! A& X9 C) e$ ]McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
* |) m: _' j: K0 r/ R+ eMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,7 U, N/ ]$ E6 j: y
MCASP_RX_MODE_DMA); O7 @8 u$ C' C7 b" l3 ^$ E4 D
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,( j& F0 r" [- S1 T" A% P' l2 r
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */$ ^3 v# C- F, j
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ' k/ Q& O- n+ M0 \
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
2 L- V: H: a6 m' O! nMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
/ J: H- x3 V( u( _" ^MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
L Z1 n- z u2 |/ F' VMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
) v. F4 e/ i3 ^% @, ]McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
& C. b' k S" T5 kMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,; w% s. p( P/ b' Z5 u2 e
0x00, 0xFF); /* configure the clock for transmitter */9 l& z6 p2 W* j# e8 \
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
1 T/ y( r4 Q& K$ S0 r& QMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
$ d4 h* Q; U3 L" IMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,6 K+ ]( U9 i6 R' z$ T. w- \
0x00, 0xFF);; L- m# m$ k) U1 q- E2 B; c7 `
; B5 d$ i/ ^- Q( r- ]5 W! g: i
/* Enable synchronization of RX and TX sections */ % f& q5 d" v. W( J9 H8 C$ O! i4 T
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */7 H# b9 r8 u+ N L% J* \
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); ?% }# `; X7 O& ^7 O& | J
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
: r! @" F" r- q+ A% I** Set the serializers, Currently only one serializer is set as+ ?' S, Y9 L. R8 b V' J+ c
** transmitter and one serializer as receiver.% d/ I( U- i( i5 S
*/
: s" W2 H2 W, U* OMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);( T% p) S& v7 T9 b0 k2 A% t) z7 r& `
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
* }0 w% I+ N* v9 G% W** Configure the McASP pins
' u( K+ ], t% J9 A! R8 K** Input - Frame Sync, Clock and Serializer Rx& G5 Y n" O" u: |
** Output - Serializer Tx is connected to the input of the codec
& ]* y# n+ ?4 K1 X7 a7 {2 r*/7 Z, s. t% g" e/ Y1 t1 {
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
; t4 S Y# Y& \+ h5 F) x7 DMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));" u9 k; ~% z( [
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
9 N0 q- z; E0 w! `. c| MCASP_PIN_ACLKX
, V( H' {9 q+ D6 }; U& N- K| MCASP_PIN_AHCLKX
4 y: e. m, E0 H& c; _, Q* Y+ Y! }| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
; {- A/ X+ V5 C, l# s8 ~1 [McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ! o$ y6 ~* z+ y' }0 A% I7 G
| MCASP_TX_CLKFAIL
{+ S1 S7 W- w+ o+ W6 W9 l) N0 v1 ~| MCASP_TX_SYNCERROR0 V, F1 x& K! p- j* z8 E2 L9 C
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
T& A- q& ]) W# S+ |/ G2 U| MCASP_RX_CLKFAIL
4 e* y4 o3 ~- z9 F1 u- x2 ^! x| MCASP_RX_SYNCERROR
1 {0 H7 e& V$ \& L9 a( E/ _" q/ H| MCASP_RX_OVERRUN);" j, ]5 L/ R0 k2 N8 C+ _' F
} static void I2SDataTxRxActivate(void)
7 X5 D) M) x- v# i5 }{
. N3 m, A) [9 J$ ~4 g$ _0 @' H$ T B/* Start the clocks */% @$ t2 T$ E* v' C$ V" X, K
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
! \5 F( K/ d% S; B) o) FMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
$ Z* d N) d- WEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
* e4 w6 m. h5 c6 a* Q1 F' ^EDMA3_TRIG_MODE_EVENT);# Z6 ]% M: u$ r, X
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, / l/ D+ A: t! ]5 v$ ?3 d: n
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */" V) w3 O) l* m* h( r
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
, A8 ?* w, c3 V! `- TMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
. u( I: O2 x9 I f) o8 lwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */$ N# U, d0 S) O) ?/ T
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
* O- K2 r# p0 Q! _% ^5 g7 zMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
. O5 f: m4 a9 T' B2 C7 ~& z}
$ [/ \' t4 u( P8 O: Z6 M请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. 2 g2 E! D0 N3 P, B } c
|