|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
+ N$ G* }3 W$ J: Qinput mcasp_ahclkx,
( O) T9 X* v# finput mcasp_aclkx,( @4 H4 t4 T9 m- X% W
input axr0,
/ Q0 z3 Z# E( [5 b
6 R5 Q* ^: a3 R! R+ s+ E, O5 toutput mcasp_afsr,
% Z3 i; y( @0 V: M1 Youtput mcasp_ahclkr,5 ]: j9 n) A7 G/ @. J
output mcasp_aclkr,
0 ~4 {7 z" j+ m1 |% b" u Qoutput axr1,
( w+ V8 y4 `/ L7 L2 t+ { assign mcasp_afsr = mcasp_afsx; s6 }) ^& Q) p+ D
assign mcasp_aclkr = mcasp_aclkx;
6 P8 s9 j7 U% \, w3 h/ M; wassign mcasp_ahclkr = mcasp_ahclkx;
# `( t b2 U. ~% S/ Q( D' fassign axr1 = axr0; ' T S7 W% @: I0 @/ s% @8 ?
. I0 j# _$ T! `. g! u$ l* n
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
9 ?7 S2 U. e* f) C3 U) J7 O- O# gstatic void McASPI2SConfigure(void)' [7 }, C# L+ v
{
7 ?" F. l9 H1 F1 x; | TMcASPRxReset(SOC_MCASP_0_CTRL_REGS);2 U+ v1 M( q! R6 T, d4 f
McASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */+ i% [) R% V- P3 p ?: ~* ^
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; ]8 Z# X' i: rMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */' T' w" [+ Z5 g0 v3 _2 d8 T5 l6 j
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
! g# U. M& l9 q3 HMCASP_RX_MODE_DMA);; T, n* Y, J2 ?8 ~
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
8 r' e7 g7 M f/ O& t' V+ B2 ?MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */
$ [2 f- A* z& p( T' YMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, " F9 h. O% d. d0 z! C
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
$ S: k0 I* e. W$ n5 Y* w' r) \McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
& w7 ?$ c' } Q# y, ~1 p/ r0 bMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% l5 r$ Z8 k" K" [
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0); z2 u+ A) o0 D, r, B3 h) }
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! D2 W+ E+ X6 I/ kMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
. t: V7 c/ U# y" k j0x00, 0xFF); /* configure the clock for transmitter */
3 C0 e7 i$ ]- O/ M, N# x: sMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1); m( q V/ S" Q- O' t- R- d7 x
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
6 t2 W) A3 M. ~5 m# w# l: O" |McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,% b- a; ?# ^* D# `* a7 t
0x00, 0xFF);
; o9 Z. `9 }, H3 ^& X8 [: E8 [
+ X$ p m: A# O. k" x9 J/* Enable synchronization of RX and TX sections */ / Q9 R4 L; ?: J* m+ v2 }. x$ N% D
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */# t! K! s/ e( n/ G6 u, Y9 f" p8 n9 a
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 F# Q# d0 U ?# s: nMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*8 d m1 b$ m m! V9 E* ^& \
** Set the serializers, Currently only one serializer is set as
# U' e1 y( v' y1 e# A9 s! u** transmitter and one serializer as receiver.
5 l0 g1 F: v) h# C7 ^: n*/" E M. C: `4 j" G' p( H
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
' m9 I( m' W5 j; t$ x& U9 P* I" hMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*
5 j7 a0 r7 n4 [9 b# i** Configure the McASP pins " Y, m+ I/ P# J' b( S) i) ?
** Input - Frame Sync, Clock and Serializer Rx. M& P7 |- j6 l: [4 k; t# V
** Output - Serializer Tx is connected to the input of the codec 2 f8 h+ K5 k1 e, x. O
*/
" i/ {1 }2 a( R5 E3 n5 s6 wMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( m! J0 d, Z) D. ]2 S
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
0 |, S* G% j" x$ f2 z- m4 GMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 c+ W( P) c$ o: M1 X# M0 s
| MCASP_PIN_ACLKX9 X( G1 j: I$ u2 O. Y# P
| MCASP_PIN_AHCLKX
2 f" S" n5 Z% D% B| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 l; [/ a7 q- R, k
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 6 i9 U, M- y5 N9 y7 T- f
| MCASP_TX_CLKFAIL
. a$ ^# I4 P8 `; n, x! ~' Y+ g| MCASP_TX_SYNCERROR
. a: S' R4 Y* K1 A: V0 x' x| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR & k; C; J4 b/ E; `, [" I* V5 t- G
| MCASP_RX_CLKFAIL4 B% t% |+ c5 ]+ S p' r7 w4 y1 x
| MCASP_RX_SYNCERROR $ B5 r% y* S3 o% ]. ]5 l. d; z: e
| MCASP_RX_OVERRUN);; ]" m. p0 ?7 V2 N! Q
} static void I2SDataTxRxActivate(void)
$ J, j! s; u+ H{
! R9 ^6 S. t8 g3 l$ ?9 v/* Start the clocks */8 ]( D2 t d2 u% i
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);- i4 B7 T& X5 M5 f; r( B
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
: T' F9 t' _6 J) Z( M" c3 M3 CEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
! |- ~; S4 F* a0 L) w. J. l; zEDMA3_TRIG_MODE_EVENT);4 P8 l! q6 R5 n- [( `$ a% H
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
% I% T$ g3 a8 u/ D8 PEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */
, _9 T1 H" j* gMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 ~& U6 V4 {) BMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
0 A3 F1 _5 S3 K# Fwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
, g: r4 x9 j) Y0 `/ L7 L* AMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
( F+ _, ?" g4 i, XMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);
% D/ F. G% T8 i. x$ u- z, Q: U}
) j ^9 I' a- n& L2 s请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. $ U, P; l4 u. `) W
|