嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
, u1 K! N4 u4 a! S$ D$ f- Pinput mcasp_ahclkx,+ r7 F7 q+ P% S8 N+ G! M- X6 [/ m
input mcasp_aclkx,# y3 r' Z  H( @2 O  J
input axr0,4 n: E; w* D. C: K" M9 D

) Z" i* ^+ K) G' Qoutput mcasp_afsr,
3 T+ L9 W2 ~  F, s3 P! _7 n6 koutput mcasp_ahclkr,, Z8 N4 W/ ]5 A+ q
output mcasp_aclkr,8 b/ e, z& R" ?+ w
output axr1,
* K, |" |- ^/ @* E5 m5 r) P4 G
assign mcasp_afsr = mcasp_afsx;* s. G, T/ h: G2 T% P2 W
assign mcasp_aclkr = mcasp_aclkx;! s" z, p  X5 r6 e
assign mcasp_ahclkr = mcasp_ahclkx;
- t. i2 _/ g4 ?8 f( Tassign axr1 = axr0;
# }9 c3 Y5 z4 R
; }* m# T* {7 Q; r
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 r, O8 r. ^9 }# W6 y1 H3 a7 I3 y7 S
static void McASPI2SConfigure(void)( Q, J- L  D5 {% |" h8 Q. N
{8 Q$ K) L7 a  u- U' p" t* p; ?
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
% o, f- X" h9 {2 |+ |. h) K* N+ m' f- _McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */' V8 W9 p2 n9 r6 I) e7 K8 ^) D
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);. \, I1 @7 o  b  ^1 c- d8 r
McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */, x3 X; v% t+ W$ h, j9 H
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
, b7 E* T, g% |/ f) ?/ RMCASP_RX_MODE_DMA);6 R  f9 H+ C+ U1 t! e
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
$ \( @+ a) f% L7 s1 f8 EMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
1 O: f2 U4 q2 [5 @0 s, }# {2 C  a! }; `McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
, b3 K4 C+ F1 x) `" I, }MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
7 B, F( K2 h0 A  l1 K3 z6 `# `McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 5 V4 K+ J( E0 A% W
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
4 e, |! F1 ~  k1 {, A' [& Y# YMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
- m! [6 ]( D- MMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); 4 o) G) A: h& y& s
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
8 r* W" ~- c1 j7 m5 A0x00, 0xFF);
/* configure the clock for transmitter */5 r+ k# ~8 D1 \8 v# Z# M( k( Y
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
) p) S" W5 ?( HMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 9 r9 R. h  x6 F) P3 d: u; K5 b
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,; }% w- B9 C0 l
0x00, 0xFF);
: v, G/ n, R7 x% C3 Q: j$ O
) f8 ~" M/ @, i; L0 w2 ?8 e* q/* Enable synchronization of RX and TX sections */ ! L. x6 @# U9 ]- i3 _# A4 _$ v% [) n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */+ R  q2 L( a; n/ W8 ^6 K
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
' l* F& W; F2 b) B. ^McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
: f3 V* t0 N# `! I& O! j9 d2 A# i** Set the serializers, Currently only one serializer is set as, k5 l0 ]7 Q( I+ k! W  M& F
** transmitter and one serializer as receiver.* `# B! h! v; I1 M- \4 S; l/ t8 M8 m; `
*/) X& _& G: F& L+ V" y0 M
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);+ l. C: t$ m) N" o
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*! n9 ~/ q. r% V
** Configure the McASP pins
& d  G/ F6 T" J* E** Input - Frame Sync, Clock and Serializer Rx+ [1 J  M9 Z: D/ l" r8 y
** Output - Serializer Tx is connected to the input of the codec & N) F8 t2 [( t$ C( n: x3 v3 j) c
*/( z# |/ N  B7 P* {' r4 M
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
* }! O) Z, A% u8 N% dMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
2 T* J- F+ J/ _5 fMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX8 B3 [. X" `: n: U9 \! L& J
| MCASP_PIN_ACLKX0 m' L$ q. p  k' }; g
| MCASP_PIN_AHCLKX
: D9 V0 e. ?- y# J( g| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
+ k! K$ @/ d8 E( w# C$ \& y7 E, ZMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& Q' Y- w  \7 L( q3 ~7 h4 y" {- P| MCASP_TX_CLKFAIL   ~- N2 l) n" {7 j
| MCASP_TX_SYNCERROR
' T0 d9 u, |0 E' g, E| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR 5 Y' u4 O+ i9 r
| MCASP_RX_CLKFAIL& H5 o3 F' M+ n( j& K' q; v+ _+ C
| MCASP_RX_SYNCERROR # \& x& X1 v: H5 T' |2 i7 M
| MCASP_RX_OVERRUN);* e6 _: H7 A8 @( e9 n9 u
}
static void I2SDataTxRxActivate(void)
; \5 o  b, d! n8 r) s, M5 ?. |{
% z2 ?5 l, ^& m5 A7 B7 \/* Start the clocks *// U- W$ e% C1 Q
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
0 a1 k6 c; f  p2 H0 qMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */" c- A1 N9 y7 K$ ~  `' v$ F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
6 c* b0 J, H3 S, t$ _. R/ I! ^, i1 ?EDMA3_TRIG_MODE_EVENT);" l9 N0 ]5 x) d5 z# d
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 2 U# R& Z2 B+ ]! ]+ }' b9 F2 a# A# v
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */% H" L& M3 V$ e7 q
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
! G0 l  c/ G& V7 _) H' JMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
, k2 `  X- Q; a. ]( xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
0 ^" J4 b( o( L) T9 JMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);
! W! v/ C) W+ v6 v, R. uMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);6 j( n4 ?! h4 A* z7 y; J; a
}

- U1 L7 t7 A$ j$ t7 q) X3 n
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
4 a; V2 [. w" p1 S/ h





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