嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
) h! x1 h7 g( g0 Xinput mcasp_ahclkx,
* V2 p2 k' u7 @% s: ?% Tinput mcasp_aclkx,
7 u- L8 F  [1 O3 `0 H8 r* q9 kinput axr0,: h' r. {9 m$ h6 V5 j, s

( d( \9 d/ N* m- _output mcasp_afsr,
  e% |) ?% \6 m5 t. ?: z" s  doutput mcasp_ahclkr,
% @6 F! B9 G! e# V8 Eoutput mcasp_aclkr,
" ]5 _# C0 J" N- uoutput axr1,
. q; ~' n5 K) S
assign mcasp_afsr = mcasp_afsx;3 |( f6 E7 m3 K* Z" T
assign mcasp_aclkr = mcasp_aclkx;* c; i* Y2 X; j/ ~$ n
assign mcasp_ahclkr = mcasp_ahclkx;
6 Y+ y( R3 c; H4 Cassign axr1 = axr0;

7 b1 E5 F" i& o1 f
. z9 H; _, t5 f  O4 H
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
/ _- e5 C% c8 f# S4 M5 v
static void McASPI2SConfigure(void)
/ O' s( k8 b, R$ e5 N{% X) H, s8 H7 \
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
- M2 a0 s% B# ?  k7 y8 YMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */( z& _' h# _* w% Y! S$ p' k0 @* `
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
  G, `+ K' d% ^, K; z2 t0 BMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */; _. B! j. N' ~- H
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
9 T7 e3 s5 s  t1 \7 n+ ^. v0 }# ]MCASP_RX_MODE_DMA);2 K' H' Q0 m, [2 n& _* k5 U
McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,4 m8 F5 a' e- j& M3 e" Z
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
* y$ _  t; y  ^& `McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
* q; I: Y) x: d9 \) f5 [. \MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
6 ^7 O6 ^6 x, B+ CMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
3 ]8 F1 g5 x) c8 V3 u+ i. H% uMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
; r" K7 Y7 c6 f# M1 t7 hMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
6 _3 C: T( k0 X# X' [7 z" o* gMcASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
' I" R& r0 @( g  ~McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,- E* d$ C8 O1 V( n+ a4 ]- e
0x00, 0xFF);
/* configure the clock for transmitter */
/ U; o. X7 c2 O) u0 {+ EMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
  ^: {: T* u( H. z" R% lMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE);
9 v) ]" b: L6 P* g% w6 }McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,0 ~( O# X# Z# w* s
0x00, 0xFF);
- p! o# T  K/ v( e
" ]8 s5 z  l8 e, C/* Enable synchronization of RX and TX sections */
& s2 p+ i) A$ @0 |& o0 rMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
2 T/ ]" Z# \0 E9 s6 {McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
% n# r* u7 {- D7 ?, G7 G% C+ w6 EMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
$ j/ G# J$ H& |/ Y  r; I- S* d** Set the serializers, Currently only one serializer is set as$ e! @1 Z' U! o: }5 P3 u
** transmitter and one serializer as receiver.
! {$ G7 ~; B# W: }4 ~  X*/
' c: _; O6 [: W2 e' V4 q7 H: zMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
  @% W) n; ^# J2 E) `: c2 y) XMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*1 a5 j3 u+ U  j/ Q: H4 T4 D
** Configure the McASP pins 8 |" d; s7 M) b" J( ~8 q4 z
** Input - Frame Sync, Clock and Serializer Rx
  {* x( X, }/ s% Y+ C; E: P** Output - Serializer Tx is connected to the input of the codec 6 b+ Z9 F2 s( q9 v
*/. b+ l7 W3 J  t
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);* Z, N% d/ Q  d0 |; H
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));% ?  x6 ^5 B$ i9 z, Z) u
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX/ Z! d! H( a9 W, |4 y+ \; `
| MCASP_PIN_ACLKX
: l% |: @/ N1 {' m& i| MCASP_PIN_AHCLKX
' T2 {% Y! u# \: k| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
0 }- c* X, o7 j. O& QMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR ( h* V0 @8 o" R2 _1 M' L
| MCASP_TX_CLKFAIL
% x$ _/ r- ~7 N3 k7 N8 e| MCASP_TX_SYNCERROR
5 @1 w+ Z5 R+ X3 V3 u| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR + w0 h8 l# w, \" ^' J" }
| MCASP_RX_CLKFAIL
8 t% B" m: @" a0 d6 Z: p| MCASP_RX_SYNCERROR 3 H  F, N7 R( o) l
| MCASP_RX_OVERRUN);% z  T6 A/ _  x( s  ~$ k
}
static void I2SDataTxRxActivate(void)3 e! ~  g; r' D7 e* t
{
% I) U3 q7 @- ?* L* p# r/* Start the clocks */
: v  x& h+ d6 D: A( n, bMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);/ A1 H% F; u+ y
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */, O$ H# n6 H; O
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
% I, i5 o9 d; A6 q6 qEDMA3_TRIG_MODE_EVENT);
" A8 m0 y1 I( i% C2 NEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
1 N9 A& s# f( Q$ C7 f2 ZEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
/ V; @* Q) B7 n4 \4 p4 q, |. fMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);* J  N8 }: i7 H/ R1 \% x1 b
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
0 v0 C6 k9 o, o* z( ^" xwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */+ i6 o$ L. R! k: N6 S
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
+ n  k' b) Q- p/ mMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);% C! z. n) a4 L. S. Y
}

* H4 [7 z# I* v  D8 ~
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

: p4 L9 Y9 t6 @% b  @3 c! c/ _& i7 q




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