|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,3 T9 P* a$ Y$ T2 G6 D! H) A! S
input mcasp_ahclkx,$ {& m" h/ Q5 J5 d
input mcasp_aclkx,
1 G6 C& ]/ x. z% N K8 V! m) h, [input axr0,
2 t B" n$ f. _$ y4 z
6 ^8 F- U/ ]" H+ z$ ]4 o; f! xoutput mcasp_afsr,% ?! j5 x, g# \/ M5 o6 H% E
output mcasp_ahclkr,
8 x& k1 ]9 v' ]* d1 ^; i, u2 Youtput mcasp_aclkr, `8 L- M5 D; g2 [; S
output axr1,+ q) z* h$ j4 ^. i
assign mcasp_afsr = mcasp_afsx;4 @7 g3 a2 v- s6 z1 y. u
assign mcasp_aclkr = mcasp_aclkx;
3 ?. S9 P5 ]( F' d, k4 Iassign mcasp_ahclkr = mcasp_ahclkx;' S8 \4 l6 |& ?5 _; k$ H! _
assign axr1 = axr0;
' @+ q/ f6 M) a9 D2 p" @* X: i: {3 ~5 s
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
; y5 H+ K5 `% E- s) K9 ostatic void McASPI2SConfigure(void)& y) G# G' r0 ]6 L
{
4 C5 y8 u: a4 J3 G, X3 iMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
! z7 Q( `- z0 A4 B* q6 OMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */- O% q7 _7 S* [2 h" U
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. T1 Q2 l9 m! y2 c8 ~: s5 X' p8 ?
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
/ k+ G# {! P: iMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
0 S9 G+ y1 [2 s3 d( u2 s& Q0 [MCASP_RX_MODE_DMA);3 y7 \' \# F6 e1 f$ H( n7 ~# O
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,, ^. X: n: S$ e3 s3 L$ n
MCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */ F+ w# p, S8 S; Q+ R0 s
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, % m+ E* h6 ?, c- R8 Z) T
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);& ]& S h6 |) e6 O4 H+ y8 {5 U/ K
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
+ ]$ B7 W4 q: A1 {MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */
! W4 s9 q- E) Y% a% E. v% tMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
: m5 p8 h9 ^! K. S4 w( C' i! o& E' RMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); * u9 m0 I: R& Z8 T e6 a0 Q, P
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,! D) u5 X8 Q4 b& y& D- S4 ?" s
0x00, 0xFF); /* configure the clock for transmitter */) e% t7 r+ N% q6 n2 _- a1 Q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
0 ]2 Z2 j$ L' O2 s4 |McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
1 w- D$ @2 N9 M( f9 I- X& tMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,, D* _8 T/ e/ v- G! [* a
0x00, 0xFF);
% i! o5 P5 e/ K4 {- q$ ]* |4 U2 i6 S/ c; |8 r8 N! l- @
/* Enable synchronization of RX and TX sections */ / s# A) H O& a* w9 N% a
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots *// B9 C0 a2 N2 C
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);; C6 m) B* R2 H w" N
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*/ k1 Q8 a# c. q1 `. a+ b& a' m- y
** Set the serializers, Currently only one serializer is set as* p6 }$ f( h9 Q _0 h
** transmitter and one serializer as receiver.
* B0 e3 D4 T- L; o* [*/0 N: w8 |8 D3 P2 l( k- ?( y
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);* a' b: d$ H+ p& c+ B- w& A
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*; i0 t4 ~1 _# U1 ]
** Configure the McASP pins
6 G, m' R. R7 E5 j7 K. }4 u/ C** Input - Frame Sync, Clock and Serializer Rx/ ]* \( c0 Y7 H6 \) t
** Output - Serializer Tx is connected to the input of the codec
# e9 O6 k' i- J% v. F' x6 u*/& G' U. i3 D9 U5 \- F7 Z
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);( Z: d* j2 V% ^3 M% w
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
Q. p: g- u0 X8 j/ L- r. mMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
H/ v" t3 g! S6 q1 Q| MCASP_PIN_ACLKX
; F; @2 n/ B; O: X4 n| MCASP_PIN_AHCLKX
, b& Z7 z; x' g| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */
+ h; C: L- V* E" mMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR 8 |) {! J' a# z. Y* v2 i
| MCASP_TX_CLKFAIL - N; K, g! M; e+ `2 _6 G" x* T( x
| MCASP_TX_SYNCERROR6 X' P& [0 |, \8 T% W9 b3 c
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
& \; Z% A0 l% y/ O. Z# n| MCASP_RX_CLKFAIL2 I* W4 z. R" |. r- ^4 W
| MCASP_RX_SYNCERROR
! P. w/ N' A# b- j2 B| MCASP_RX_OVERRUN);+ d( ~( c' |7 I( N8 a
} static void I2SDataTxRxActivate(void): r3 c6 Z2 K0 w
{& ]7 O. `4 c9 I1 P$ }0 u
/* Start the clocks */
' l0 w; `" b6 }5 ^9 D5 o3 R' x- ?( h$ ZMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
. a" j# |- f# l# V2 G2 D0 W9 C: uMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer */
& K9 o& z6 I, S1 E% i, G8 ]EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX, O" k2 H4 ?5 e: ~5 [4 B! R
EDMA3_TRIG_MODE_EVENT);1 l( y X# @& ?& f" ]# w' p
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, ' F" o, S: C' {2 y! G
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */5 Q* d" q7 x+ \7 f/ W
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: y7 r8 e) B0 \7 u2 DMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */
6 T$ }- G% s: ywhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */& [# I$ k- U# z7 x
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);9 p V, E( C: X: p3 M) w" C/ K
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);: }6 q9 l+ j J2 Z! ~2 ?$ ?
} % _0 n5 p0 @' {' B6 G( c @
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. : p! f1 c/ L/ X. q
|