嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
( m- {; t% ^! J! Q, qinput mcasp_ahclkx,
) X9 S* S! Q8 g- `- f* q5 einput mcasp_aclkx,3 J$ ~8 w+ y$ r4 A; a$ L
input axr0,
7 w4 Z7 ^6 |! @  O5 W# C9 o
- d3 L3 e7 q. f( ?9 X, uoutput mcasp_afsr,
: g. d* y' e( c& boutput mcasp_ahclkr,( l2 Z7 @4 `' y0 Q) D
output mcasp_aclkr,
) P$ u6 O/ N2 H1 x0 g  U8 Boutput axr1,
# P9 Z5 y/ S) z
assign mcasp_afsr = mcasp_afsx;
  H, d: _8 m7 z9 P0 {, w! ^+ }assign mcasp_aclkr = mcasp_aclkx;! b, [' ^' G& t1 p! H4 v
assign mcasp_ahclkr = mcasp_ahclkx;
" N  ?, k5 S. t7 [5 _assign axr1 = axr0;
1 |) K) p8 k) ~0 v. t1 S- K
0 d% P2 t% a* O/ z
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

$ M6 y  o( @7 r: h
static void McASPI2SConfigure(void)# z& m2 R: A, ?: Z' u5 V
{
6 x2 M7 i5 O% d% t- p0 Q: _8 @1 OMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
5 m8 `+ U4 Z- IMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
3 }: c5 U( V. @1 U, v, ZMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);! K. t6 X, h; J& Y
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */0 V! a0 ]" S: W
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 Y" c0 }( n" H% W* V  @; u3 M0 hMCASP_RX_MODE_DMA);" S$ f* [0 Z$ v+ ?) X
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,* W. v. L( x1 H
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */3 {# O1 R& g& D9 C# A* H
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 9 n/ w& h7 Q1 N& @7 L7 y8 S
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);. ~8 M) Z# X) j/ f0 z6 b5 a( |# s
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, - h. h9 M/ K: x# d
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
* J: l0 r7 M, K7 O4 Q7 vMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
% x- U' E* l6 |  c; C  sMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 3 U# f  _5 |; |2 N7 v
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
  k/ e; C4 s0 c3 N$ e0x00, 0xFF);
/* configure the clock for transmitter */
1 s- H3 \9 B3 e0 _McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);7 |- l5 r' R4 T. c2 a
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
; }# W% J6 @5 w" [/ CMcASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,- u/ J" S1 j  D7 Q
0x00, 0xFF);' I$ |' m% G$ K7 E8 M( m

. q$ D& Q% @( U. e5 w/ p/* Enable synchronization of RX and TX sections */
. J+ I' }5 b3 ^3 IMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots *// ^( o3 z$ N# g  H" L# B
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
) x& c- {7 @: N% n+ @0 gMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
) w4 N5 _5 {: K) Y2 T* ~# d** Set the serializers, Currently only one serializer is set as5 r$ R2 k( k  r9 ]; y
** transmitter and one serializer as receiver.2 b- s) G1 S; U0 Y. W+ _
*/3 s: {: Z/ {1 o
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
% n. h9 g9 o  S2 k: S' g6 U- qMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*/ \) C) o3 Y6 {$ L8 J7 F
** Configure the McASP pins ' x% O+ J; v! |, @' V- r  z
** Input - Frame Sync, Clock and Serializer Rx7 x" `$ m( J0 H" ]" o" u! K* b" p4 i
** Output - Serializer Tx is connected to the input of the codec 9 r" y9 O' x; ^
*/
3 u/ A! G6 Z" h  r, }  K0 c0 @McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
6 c4 V. e4 E' r4 eMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% u) `. E7 h3 R% ~1 a( D* o$ {
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX' `: ^+ J8 N& M- i( J+ Z; Q
| MCASP_PIN_ACLKX% [( F' l' m' S# T
| MCASP_PIN_AHCLKX. p( ^' V/ W! G' w5 M6 ^& J
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
' Z2 A) n$ g* ?! r$ Q. x) QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & t& ]0 ~2 O  V
| MCASP_TX_CLKFAIL
- S3 N. W# a0 }4 O| MCASP_TX_SYNCERROR2 A' l8 f1 j2 D/ g. s- v  Y; Y2 x
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR + k6 T0 N& c2 y5 V9 q6 B. u
| MCASP_RX_CLKFAIL
$ S( A  B: n8 x| MCASP_RX_SYNCERROR
0 d( l0 \/ G$ o8 v" R| MCASP_RX_OVERRUN);8 s& ~: J( p" g. R9 M# v
}
static void I2SDataTxRxActivate(void)
% G/ E+ E" C) e{
; L- d, W! ~9 k/* Start the clocks */8 d2 P1 r1 T- B$ v) a4 z2 z  B5 _
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
; K: o+ A: o* P) V& T- ^# \McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
9 O/ Y/ `" s/ W0 L9 kEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
8 F9 y) x* H8 p9 h7 IEDMA3_TRIG_MODE_EVENT);# K- `. r7 l( L! }# i" l
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 0 G& c: r$ A3 l* E1 E
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
7 ]+ G) k% C, E9 j( `  ]. ~9 xMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);6 v0 T  D, [" m) F1 L& M
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
( I# ~( j% f4 Bwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
! i  e) T2 u  {McASPRxEnable(SOC_MCASP_0_CTRL_REGS);0 g) f( _8 d) T5 f! @
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
; U5 i; G- C( K, n6 \- R+ k}
' c. D2 Z2 t/ l! p- Z8 V9 J
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

8 f- |) c6 W0 [7 T




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