|
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。 部分代码如下 input mcasp_afsx,
) b. t9 L* Q# c p; z3 P0 V- Linput mcasp_ahclkx,9 G5 o3 e$ f" C1 f8 K: j1 _7 A
input mcasp_aclkx," W' W5 K9 h- @
input axr0,
2 D0 ^" M }2 O2 N. F7 S. ?) T% z% @9 f+ y+ u+ H6 C
output mcasp_afsr,+ |& u5 U" ~' r9 a3 z
output mcasp_ahclkr,
p/ D# y6 N3 Loutput mcasp_aclkr,6 t2 \: F$ z" J2 R& \
output axr1,
" Y( Z# i" s: }" _ assign mcasp_afsr = mcasp_afsx;0 Z6 O/ B; |) J h2 L9 R
assign mcasp_aclkr = mcasp_aclkx;
6 A# |+ M) Q) N! \ E Iassign mcasp_ahclkr = mcasp_ahclkx;
7 p& a; Y w, j/ Gassign axr1 = axr0;
2 g0 |- j. F. }; K" Z5 ~$ F/ s; h6 z+ D% c2 Z! V( U
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。 在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。 一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。 部分代码如下,关于edma3的部分未做变化。
' t9 Y9 r- b$ J; f; @static void McASPI2SConfigure(void)
5 s* p( L/ `" N q4 p" x{
* {$ ?% \- l1 P. E- oMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
% Z- J3 s/ n% R9 g4 MMcASPTxReset(SOC_MCASP_0_CTRL_REGS); /* Enable the FIFOs for DMA transfer */9 y* z$ w4 [1 _' G, [5 q
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);2 y I: _! ^- w+ _; D
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1); /* Set I2S format in the transmitter/receiver format units */
9 U( U% T" J0 {McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 k6 t: j% ]+ i6 i* IMCASP_RX_MODE_DMA);
( P7 `! P4 j) M- C% v/ i+ v. ?McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
( d% X# ^& R K1 P4 BMCASP_TX_MODE_DMA); /* Configure the frame sync. I2S shall work in TDM format with 2 slots */ l- K# @' ]1 e+ x2 \( I
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
% ]* }. A @- ?. H1 s4 m$ o1 OMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE); f2 L% _- M3 p% X$ w }& {% O
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
# `4 y, R# n% x9 R5 ?& U r* pMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE); /* configure the clock for receiver */% U4 x; m2 P9 X- k/ {2 | k
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# M2 }3 k- g$ Y5 \9 _! h$ ^1 s
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! M& s+ m# h. u3 a+ ~McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,2 K% Y* h, b# q, {, s
0x00, 0xFF); /* configure the clock for transmitter */
, f- M6 |7 t0 o0 T" M2 H: c2 jMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
o3 a7 v" }9 BMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); % [, |* c4 D' \4 C+ _4 v
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
- u# l, H! g3 R2 I* f* V0x00, 0xFF);5 f& }8 H$ l! w3 L' b
2 r- H+ b/ ]7 e" G/* Enable synchronization of RX and TX sections */ ' c0 t/ I; e8 z; D5 o- O. v
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS); /* Enable the transmitter/receiver slots. I2S uses 2 slots */8 Q9 D# C% d% E+ p" z) k
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);* q; h8 J' o2 P, A0 f# o
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS); /*
) j/ F ~' a( v- ~! Q** Set the serializers, Currently only one serializer is set as5 P4 x* B2 D: \0 Q
** transmitter and one serializer as receiver.
/ ? S$ i+ g0 f; N1 f6 Y*/
% d& K* I7 \6 T) E7 z$ ^McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
; D. g ` `! |# C2 Z+ RMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX); /*, O9 p/ d+ w" E9 I$ k
** Configure the McASP pins ( j; y) R3 M* z# J
** Input - Frame Sync, Clock and Serializer Rx( J0 _) j2 `. v4 h
** Output - Serializer Tx is connected to the input of the codec
0 l2 I9 k+ W3 @*/4 _1 F, x, r$ [ t( r8 }! [
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
8 f4 B0 A5 _- p6 V) p+ YMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. ^1 b( R$ J3 r6 y4 TMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX$ x& G8 c7 Z3 `+ n1 K
| MCASP_PIN_ACLKX; @0 V( j9 X" N3 u4 O: u; x) S
| MCASP_PIN_AHCLKX* ^: W/ d7 l% g* H3 _0 ?4 s
| MCASP_PIN_AXR(MCASP_XSER_RX)); /* Enable error interrupts for McASP */5 b" P5 Y l& ]- k2 Y
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
$ ?) ~! l( ~ [8 h3 F| MCASP_TX_CLKFAIL
0 S: |( W6 @7 B0 i| MCASP_TX_SYNCERROR5 ]; y! P: Q7 `6 O1 T3 K; P
| MCASP_TX_UNDERRUN); McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
) s8 T7 G6 C$ ]5 `+ R6 Z| MCASP_RX_CLKFAIL! ~. Q; u& k/ Y# b
| MCASP_RX_SYNCERROR
1 Q; X" e- f2 |" X' n0 i* }- A| MCASP_RX_OVERRUN);
' \8 a/ l$ \# P8 I$ Q. l* B2 G} static void I2SDataTxRxActivate(void): W4 a& O* M' e* f" h _7 R
{
* R" `! g* F: s1 X0 s' K/* Start the clocks */
! \, X& I* W" B* TMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);7 }! l H1 v% G- j9 W
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL); /* Enable EDMA for the transfer *// y. \! t( t" c# o
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,! ^. c. D+ v/ Y, K8 R( o! ~
EDMA3_TRIG_MODE_EVENT);
. _* {8 _4 V1 K4 |& C9 C+ CEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
' k v! ~& p9 D5 M( e7 g" CEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT); /* Activate the serializers */ ]6 q' p& r1 z- X
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
6 y: J3 _4 L$ i/ c; R: R' C) uMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS); /* make sure that the XDATA bit is cleared to zero */) d- ^8 V, v( y. G) v
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY); /* Activate the state machines */
@2 O. J9 n" vMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);- j7 A9 G$ K) Z* n9 j
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);2 T$ C% w, L4 s. Q
} ! _: N# Q8 ^2 c' I$ `1 [
请问:问题出在哪了,时钟按照这样配是否有错。 另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0. : a1 K; s7 l9 [- |% J6 S+ P3 B. U
|