嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
# L. e( T3 N6 g+ |9 }, einput mcasp_ahclkx,
' o0 b! u' c, R4 G- @# u$ l4 Jinput mcasp_aclkx,& ^/ ^% X8 H- z6 S+ S
input axr0,% _6 e9 A$ j. |; N# S/ j' a' [
( W' k. Q/ H* T3 v" R
output mcasp_afsr,
) U+ W! O, \5 f4 G1 d8 N" Toutput mcasp_ahclkr,0 n( c+ Z& y6 f+ ]
output mcasp_aclkr,
& @* e0 Y  j! y% u! koutput axr1,
' J* `) T: {$ T. v+ f6 Z' [* p
assign mcasp_afsr = mcasp_afsx;2 U9 K/ }1 j  @' W+ k! d1 }
assign mcasp_aclkr = mcasp_aclkx;
: p$ {( k4 f, Nassign mcasp_ahclkr = mcasp_ahclkx;* u7 w* E; G$ M/ g. T3 L3 h
assign axr1 = axr0;

# e2 |; v/ [1 ~" W' ~+ _5 C8 X5 _2 b, Q& E1 V& @. b
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
  G+ J* t- n. X" d& M9 v0 L; a  d
static void McASPI2SConfigure(void)
9 H+ n# E% e6 E3 a{
" p& S$ R; E6 V) \3 B$ m9 w' lMcASPRxReset(SOC_MCASP_0_CTRL_REGS);% }3 e1 |% e$ ^7 R! ^6 f
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
  {9 }9 M/ [2 ~+ iMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
; S9 L/ z+ ?4 N9 lMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
. y/ v% a1 C8 J9 q5 y" iMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,- H& \$ y: \& a: L2 y. O
MCASP_RX_MODE_DMA);
/ l2 t/ C, R: }+ _" hMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,$ A# b$ s9 L" c+ a
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */
: |$ \5 X+ S  D6 F! @3 Q: }McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 1 q; m0 O7 G& a1 J# }
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);  D/ i$ J+ i) \$ U# i* B
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
) \3 V& b4 k2 ]" eMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */! i3 C7 i0 _7 \) ]
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);3 L4 |5 U9 o/ I& b1 c
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); ' c1 g1 O- m/ ]0 X' X0 c
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
# h1 b0 J  ~( f0x00, 0xFF);
/* configure the clock for transmitter */
  @, A; n4 p& o8 Z4 BMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);1 ^  k$ P3 D5 k  |1 _
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 4 r' h# x* r, _; N5 r
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
: n7 b! j! t% g( T" ]0x00, 0xFF);$ O$ r) o) f: z# _; P

" C1 W/ t; }2 J' e/* Enable synchronization of RX and TX sections */ : f/ d4 b2 [7 u# v* ~5 r
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
$ h1 G% P1 F+ j0 C2 u; h$ F# ^$ xMcASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);2 S) x. a* ~+ P+ ~# ]
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
3 _+ C2 v. r2 T. p** Set the serializers, Currently only one serializer is set as  N. a$ T6 A( D+ p" u1 n
** transmitter and one serializer as receiver.
5 c2 |) B9 D7 K4 _*/
" z0 V9 S; T1 U8 f8 R9 AMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
2 t9 V( h7 X# g0 H5 ]McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
$ T  C/ a& M$ P! S** Configure the McASP pins
. w3 M& B0 S$ C; l+ I' U2 b# c- `** Input - Frame Sync, Clock and Serializer Rx
# d  ^7 u. j, K; b/ n: v4 D** Output - Serializer Tx is connected to the input of the codec
* e# M( N0 _$ r5 ?; a: _5 U0 M*/! u4 e- t9 z. L9 o# v7 U
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
# r/ a! T; ]! O3 w7 GMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));( [" e; ~1 e/ ]0 `
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
; M! J! Y6 `7 O1 h4 b| MCASP_PIN_ACLKX" ]6 t2 n+ s, y( e% F! f
| MCASP_PIN_AHCLKX
! p9 L$ @: {2 D4 ?5 p| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
- }# p3 r4 d2 O! R2 g( g! HMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR " {; p! K+ B& k
| MCASP_TX_CLKFAIL 1 U  G0 P, u7 \$ a9 I
| MCASP_TX_SYNCERROR
4 \3 _# X0 e  j& J" }| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
" x2 Z! r) @5 l5 k( R- m) }| MCASP_RX_CLKFAIL
, l$ p4 q8 w$ T" G, p| MCASP_RX_SYNCERROR ( W# s) ^  w, q2 E4 U  s
| MCASP_RX_OVERRUN);$ e( I- m# V, S. X. R
}
static void I2SDataTxRxActivate(void)
3 u; j4 ]4 ~  |" L9 g) [{4 `: ~8 E4 q1 f' O. @1 i: G
/* Start the clocks */  e5 |& o1 y. o! n
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);+ z0 T& x8 b& \9 k8 k
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */
0 G/ r% A1 N# W) w0 y% K3 ^9 kEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
& X- ?, b5 p. V; v& w( wEDMA3_TRIG_MODE_EVENT);
7 K: c. x3 A2 wEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, # U, G% D+ J0 z0 M5 }) P
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
* J% ?/ `3 ]7 \  d2 J0 JMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ z; G. c: w* B. T4 k8 }2 jMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */, g- c% [1 z* Z
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */# B1 W, r: j0 \( n( B' D# d
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);
3 f# b6 Z# N$ g. PMcASPTxEnable(SOC_MCASP_0_CTRL_REGS);# n. P  d& Y/ H  R7 i0 G6 c, H0 V# w
}

, |: S) J2 B7 C8 E) e2 h3 {: O
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.

! P! C' x$ ^- K4 `/ I




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