|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
7 a) q3 O; z$ K0 l! Finput mcasp_ahclkx,
( e8 A+ E6 o4 a0 \0 u" A0 ginput mcasp_aclkx,' P' E& x0 r0 l3 p! O# e, j
input axr0,; C% Q' \- f8 {& ]; _( P8 u8 ]% t
& d5 |2 j, k) _' Joutput mcasp_afsr,
6 V/ ~: B$ h6 koutput mcasp_ahclkr,
2 ^* t! ^' E4 W3 R0 Boutput mcasp_aclkr,
4 F; n7 f6 r7 l3 Foutput axr1,& p! n& S4 x4 V2 `5 u
assign mcasp_afsr = mcasp_afsx;. r. v5 }! }$ p# m; _ L
assign mcasp_aclkr = mcasp_aclkx;
! {- F" A% ~/ b8 N' _assign mcasp_ahclkr = mcasp_ahclkx;
6 m \! ?% l7 V9 g! Bassign axr1 = axr0; ( L" a# {& J8 e( J7 ^; `! G
7 R( O2 E# J" _1 g6 \: |在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
6 O' p3 L6 u$ p3 b: K0 U+ x ustatic void McASPI2SConfigure(void)
) a5 D8 s. _; i, ?& T{
: W1 b4 r- R/ N; sMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
. l4 P9 N2 w6 a9 I$ ^McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */* e. N0 x( A3 |& W
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; N6 N$ Z/ |1 k p3 p$ ~McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
" H. Z8 B! `/ @McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! ~( d9 s2 |# u; E+ m- h: ?MCASP_RX_MODE_DMA);
5 s. }! E/ i+ n- h: o5 _ P& mMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
& j' W6 {* l8 P: a* zMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */: w- ]! Y- v! z- }& J' G$ U
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
- O4 h1 H2 g+ h( zMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
7 O, ^: u. |) X: l$ t4 Y9 n1 D2 e4 FMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - q0 K* m; n* G, w6 T
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */3 R* _& I, a6 o! f" R: G2 F
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
" y: ]0 }6 I3 v+ }% y4 @! Q2 `: V: ?1 \McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 u/ h7 @. W& `/ Z5 {9 X. U$ c
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,0 [; @3 M# F/ T: m0 Q' E$ w
0x00, 0xFF); /* configure the clock for transmitter */7 z+ O) G; L' z
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);% l* f2 {0 E6 }" ~ Q+ D$ a
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 8 g* i1 `) K* P! K5 g. c
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,- c' B4 S- J. X, B4 m* n& i
0x00, 0xFF);7 O( T4 \2 E3 o( M! M# }# d
8 ~; B' [- l. |8 m0 m/ M. S6 o/* Enable synchronization of RX and TX sections */
, M- @/ I* c& w6 ^% a; cMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */4 z2 ?/ Y) ]/ [+ w u- g- {
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);" D( [% @8 x% t" u
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*% @8 f* B; a1 S- j0 {. c
** Set the serializers, Currently only one serializer is set as4 B: B9 X5 z V0 T9 Y& _9 t5 D
** transmitter and one serializer as receiver.
# a& P d& ~9 b3 {; u5 k*/1 H/ a# L B1 d6 o- @" I+ J' H' \
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);' P% G3 L1 [8 Y4 ]; |! a
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*1 ^8 T% y6 L1 n/ ?1 O5 j
** Configure the McASP pins ' n3 `1 Z5 g! F* F, l
** Input - Frame Sync, Clock and Serializer Rx
& r1 t8 N: T; c$ W** Output - Serializer Tx is connected to the input of the codec
2 t6 u* M1 H# l* K% L* M/ z; u*/. \6 ~& R% ~. }1 r
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
5 o7 S$ ^5 P# _9 V9 n4 @McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX)); f) [ b! y/ i; W- Z
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
x2 r3 P+ n, s| MCASP_PIN_ACLKX
' p! ~1 y5 m m l, Z$ y) t/ r| MCASP_PIN_AHCLKX# {7 h0 E: c1 ] u% W
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
( k: S" ^% k2 V5 r$ J7 Q9 Q& \McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
! }& ?6 O& Z9 m( h. Y| MCASP_TX_CLKFAIL
$ h5 B+ l5 i7 L| MCASP_TX_SYNCERROR, r4 T; \. K' P4 V% g) A4 G# v) F8 n
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 ?/ D# t' o; {
| MCASP_RX_CLKFAIL
5 r# B; h: t( h5 _# R. ?5 _3 g| MCASP_RX_SYNCERROR 4 S6 z$ J/ Z9 m
| MCASP_RX_OVERRUN);7 {8 w# @" ~# D* k
} static void I2SDataTxRxActivate(void)
9 q1 Q- q& L# D1 w! \- G4 S{" f6 g! e+ C h; e9 ~
/* Start the clocks */) L; u& M, T! Y5 n& X9 K
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);! [' B. K5 q' y! B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
8 Y" x5 _. ]8 ^- p# @5 B; N$ aEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
7 ?: T2 N' @$ m5 m, IEDMA3_TRIG_MODE_EVENT);
6 I) D' D. m( yEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
4 k; b; G$ ~, o/ C. z0 g @$ BEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
- C0 o8 X6 {. ]3 t3 f) {; R" W7 h2 zMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
9 E, Q% ?- m0 v1 Z4 \McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */3 ~, S5 y7 j( l4 \; @1 T
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
4 ^( F6 F3 I0 `8 W* h9 e. |1 f GMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);! |9 g9 Z& Z0 I0 I
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);8 V4 F/ G. O& c7 s: T
} ( u- p& O. J) R4 N" h# B( h4 Y' M
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
) { x- ]0 L; x# w6 f |