嵌入式开发者社区

标题: MCASP自环配置。 [打印本页]

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,: n) g: }% b/ A
input mcasp_ahclkx,3 U( T. \2 H% B- m: T, U& L. N6 Z$ N
input mcasp_aclkx,
% a( g, X3 m- ?0 @/ K1 yinput axr0,7 ?' |9 a, O* B9 P! L9 }
& U% O+ z+ v& `5 V$ |& _
output mcasp_afsr,' M( ~0 O6 e# f! Y# y& i
output mcasp_ahclkr,, z! D# b. \. E) F
output mcasp_aclkr,
/ R/ e2 j! G7 Z$ qoutput axr1,! }% e5 h4 r, A: p2 a% E/ _6 o% W% ~8 D
assign mcasp_afsr = mcasp_afsx;
6 }8 a4 N; N& [4 o" Z1 w3 e# Yassign mcasp_aclkr = mcasp_aclkx;
5 ^. a) N/ R0 i- T1 M, @& passign mcasp_ahclkr = mcasp_ahclkx;0 {8 X: n0 C4 u/ v4 Q! w6 l
assign axr1 = axr0;
% Z% y9 ^$ m# p7 o( o3 B; n

4 B- t4 `: K& |6 I( z6 m0 e
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

3 L& k7 j/ d/ d: j. Y7 V
static void McASPI2SConfigure(void)
1 P1 w) |3 Q$ Z  U5 e0 d{
1 T+ d  d& {/ J0 B8 ?" T8 o6 nMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
( [) `, o/ P$ W0 w( s; R1 m1 ^McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
3 T5 m$ T2 `) J, o; ]. MMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
# i0 n! Q% X0 u! n4 y- uMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */7 M0 w1 N: u, k# L& n
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,  b" t* G" o7 j& l8 p0 f+ T
MCASP_RX_MODE_DMA);/ P5 v5 I, C) P+ N
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,1 L' B; }. F  X0 O
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
, A4 j8 ]. O/ m7 |; C" v" tMcASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, # L; M! Z! \% H3 V1 S1 n0 D% j
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);+ t& a# M) {& G0 }. j+ o3 ]2 h( v
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
. X7 r, K/ \# @1 R1 N8 H* X1 d: BMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */7 B' ]9 j. {4 ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
' q6 |  [# p9 kMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 5 c( Z; a$ O: O4 O$ C6 Q
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,, V; D; T6 a$ Q* u5 `$ ~) |
0x00, 0xFF);
/* configure the clock for transmitter */
. P% ~6 b9 Q. oMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);; `. q& s3 I( q5 }! d
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 5 U- K. S0 v# x& M* E- ?
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,( `: j2 a3 G' x
0x00, 0xFF);
, }8 |! p4 p" b2 J
4 H" M* \5 O. b% @7 E8 D/* Enable synchronization of RX and TX sections */
& u7 |, r  {! `  o8 D  \McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */1 B7 k/ e  O* X" e) [" \* V
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
; _5 @/ Y, k. y& O+ EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
8 Y3 Q, t/ B- n: Y* X** Set the serializers, Currently only one serializer is set as
  n$ q8 I* N  B% e** transmitter and one serializer as receiver.
0 C  S' r, W& o6 S*/" @- ?% _9 I% U
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);; [# k3 D4 `( R) t
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*. S' V2 o- t& l" q
** Configure the McASP pins   x+ A2 v. Z* V4 u+ \: y& F9 o
** Input - Frame Sync, Clock and Serializer Rx9 ?5 L0 V7 q. A+ X# R+ m: p, e
** Output - Serializer Tx is connected to the input of the codec 3 I# F% r+ l7 H# F% f. n
*/
. k" J: Q1 P6 _3 B4 kMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* D5 n8 B+ e- E3 J4 b. l3 M
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' D7 B7 l4 ?/ }( U5 {( X
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX; @( u/ h* }. B6 f" ^
| MCASP_PIN_ACLKX
( @5 Q8 x3 K: \) v5 a9 q& r' U& p| MCASP_PIN_AHCLKX
( l/ f* G4 h) ^. m1 g) O, r| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
5 a" E9 [( A# C# U; E. Z- ]McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR + p+ [# a1 N1 X" a/ q* a
| MCASP_TX_CLKFAIL
. I$ j' o  e, l; e| MCASP_TX_SYNCERROR. l7 @4 E2 u  v9 S  }: k3 [6 d
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
6 d' s2 F6 Q* [2 _| MCASP_RX_CLKFAIL$ [0 Y/ @& d  M4 K3 T3 E; F
| MCASP_RX_SYNCERROR # c1 L, z* |6 ]' V; L0 g% n3 @* }
| MCASP_RX_OVERRUN);
# j% I, A0 H0 Z8 l6 ]6 h4 k+ g}
static void I2SDataTxRxActivate(void)9 d8 x$ x) H  s( R
{3 B0 A* X% ~1 Y9 _8 ^
/* Start the clocks *// a# ?/ S9 P- t; O: C& t; U# o
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
5 }7 v. t; K' T# aMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */, d7 V7 g0 v) k- a, ]
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,9 F  A( |& V" C1 V" ]' X
EDMA3_TRIG_MODE_EVENT);3 i  V  T, m. |/ L
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
6 @& |' H: g; L! V6 }EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
# j# x7 \/ Y) E9 \% Z9 z4 MMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);' I5 R; q" `. i5 S5 E4 U
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
+ T% K0 j$ a# w  `6 H1 zwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */# B0 q' r% q  U6 e" g' ~4 l. U4 u4 e
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
2 t, G1 }, H: j! W/ e3 d4 {1 l5 ~McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' Y% [, d. _- x  |' E}
1 `; |2 b& |) A0 ?! f$ r
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
- L" a0 Y& _/ z3 U( I4 l





欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4