嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
0 L; F% z" e, |# \input mcasp_ahclkx, c4 s9 L f( C
input mcasp_aclkx,; |9 W% V: m# F( y9 T
input axr0, w6 N7 P- v8 j* g( G
: _% ^, Q5 z$ i& R) k- K
output mcasp_afsr,
5 J# L6 B0 Y: w7 j) zoutput mcasp_ahclkr,
8 ?4 ?5 }/ `: D6 f# Woutput mcasp_aclkr,: Z* X7 K& V3 [6 Y. D3 _$ t+ a
output axr1,/ y% B1 c0 n$ E: c Q5 ~
assign mcasp_afsr = mcasp_afsx;, y$ G0 \% Y7 }, `
assign mcasp_aclkr = mcasp_aclkx;
5 G9 _* W6 v: c% z: q$ c- Gassign mcasp_ahclkr = mcasp_ahclkx;: a2 f6 H( L3 C2 r
assign axr1 = axr0;
/ L( n0 ~( c$ d9 x" I) N2 x
q* J( e! P# O0 Y- D1 m Y; t4 P
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
& ]( ]1 q) q7 e [0 h
static void McASPI2SConfigure(void)' e, W! Z! v8 h6 Q# F7 x8 k R
{! K$ F' s4 l# E* P ?
McASPRxReset(SOC_MCASP_0_CTRL_REGS);0 v5 P3 D% T5 s5 w* A9 m' V
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */' [9 y4 ^, a& o. a: |' `
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
+ r' u9 ^" {+ e1 K. \8 dMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units *// G$ o5 r$ O. y) ]0 { C7 I
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,) \* b) i0 z2 G$ e1 S
MCASP_RX_MODE_DMA);
' O! L* {8 ~) ]1 V. oMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,9 Q1 X: x* c1 {- ?6 |
MCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */. n) _4 j& `' R% g9 g" \7 K
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
; t# s# s4 R. Z2 y6 v# BMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);+ q. w* L6 H& l; c
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, & H7 \+ K) v$ b3 R
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
, z- k2 x' p- f# X+ K: xMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0); [3 a$ m+ c* u E2 X C; h$ K7 s
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
! P6 U9 Q5 E- j+ |% I$ pMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
4 m! w: w6 X/ H) L/ K& |0x00, 0xFF);
/* configure the clock for transmitter */: l- p; V+ g& t( W! g( f# h4 G
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);$ R- z6 W' J1 F. N
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); 0 U1 M6 `4 `3 Y( }9 U0 p) \& A
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
9 E# l- Z- h+ S0x00, 0xFF);% i T" p' U/ X5 _8 C
0 A4 `& o9 q3 o! A9 ^ j9 d
/* Enable synchronization of RX and TX sections */ # j1 L+ A( K- {
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */; L ^9 B" d: |. p
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
0 _/ u7 t! c, ^- o% ~2 D+ W- f( x' yMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*% x5 t2 d5 h: W3 C8 ~
** Set the serializers, Currently only one serializer is set as
: G, M- S5 a' @+ \** transmitter and one serializer as receiver.
; f/ ~+ H1 u# R# ]( A3 J; u*/
# ~% _, X# A8 ]4 Q8 J; S7 I+ uMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);! V2 W( p. m4 N+ ]" M
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*0 n" q( z! x& `& R
** Configure the McASP pins 1 y' L- h$ v6 L. i) ?) e
** Input - Frame Sync, Clock and Serializer Rx
# {: `; y6 t" E, I% y, ?3 S0 P% P8 a0 J** Output - Serializer Tx is connected to the input of the codec
6 _( E9 N0 P }& d1 |4 p*/
+ i/ p) ~$ Z+ _0 T7 w5 ]9 WMcASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF); n# Q; k7 t/ P! w* `" i
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));: X' F/ |# O' v/ W' g
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
6 O \/ _6 o' M+ V| MCASP_PIN_ACLKX& [* ?% S. g) P. ]
| MCASP_PIN_AHCLKX7 j L* {' H; E% _' r* q- f, @2 W) Q
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */
" t0 Y* K+ t0 Z- o9 nMcASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR . S+ q* ^# C% v5 Z
| MCASP_TX_CLKFAIL
6 U) M' F: I Z/ @! K6 \| MCASP_TX_SYNCERROR7 x$ \; ~* n( f* e" S
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
: H. T6 y9 n6 a1 || MCASP_RX_CLKFAIL
8 J+ z4 l/ b5 F! g+ J: o2 A2 g| MCASP_RX_SYNCERROR
' D- d) D8 r$ b, A5 U| MCASP_RX_OVERRUN); a# ^0 v- l' W, o2 r
}
static void I2SDataTxRxActivate(void)
5 d6 B6 X& J1 N6 b3 f* U{
, d- t2 q( p) D9 Y9 H/* Start the clocks */- |9 p* r7 Q U. E
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
) x/ y: m! n* M3 c' C$ eMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */: \5 ]: C" l7 F
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,
( z! j& Y& q* V& K& f+ i) m7 ~EDMA3_TRIG_MODE_EVENT);8 d3 v+ N( i5 L4 m9 q9 U
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
/ x) [6 y* T S4 BEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
" |1 z% a" z. T/ T0 D8 p4 rMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
/ V. a! a' t: A" I5 T( x) tMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */! n8 G5 F) C9 |* n9 [. I6 \
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */- C9 w! _: J9 N8 z9 N
McASPRxEnable(SOC_MCASP_0_CTRL_REGS);7 I# L! S! {; y
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);3 i4 O- f8 l) e; q; x& i+ y
}
$ H6 ~5 {# N& R0 B请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
0 W+ d/ J) ?9 U. Y# y
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |