嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,+ [" N; j+ A {
input mcasp_ahclkx,
0 {5 m7 f- A3 F$ Y* X: A- @$ linput mcasp_aclkx,
; Q( P8 S2 c+ s5 f2 S( `input axr0,1 a- G0 g5 q9 }. V
9 O) \) @% Y9 q! K8 r7 X- noutput mcasp_afsr,( @. v& A, f: h0 Z1 L4 W! ^ P, E
output mcasp_ahclkr,. h: C3 B& `4 e" q# l
output mcasp_aclkr,* c& \/ Z$ A; \0 R6 \) e0 k( P
output axr1,0 f3 m; T+ d3 |2 ^' m
assign mcasp_afsr = mcasp_afsx;' i+ ~7 X0 \- B8 O/ C7 S! t
assign mcasp_aclkr = mcasp_aclkx;1 U2 ^, s2 @8 d! [, i8 e
assign mcasp_ahclkr = mcasp_ahclkx;( b) i+ X+ R; X7 j: ^
assign axr1 = axr0;
2 s. a9 t+ A4 r. T& r& y6 i/ M
; u1 {3 [$ E* S$ [6 s3 f- l在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
7 E3 f+ F# ~' h7 `- y0 n" J7 A
static void McASPI2SConfigure(void)
# [/ m# |7 g, i4 K2 A" P{
* J E! l5 N) [! `% pMcASPRxReset(SOC_MCASP_0_CTRL_REGS);
9 j; l* s& F6 Y! }McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */
7 ~! D* s6 f! K8 G: c. j4 xMcASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
6 Y' a! R8 o8 _& B4 |McASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
! A0 v7 t' k; O( c3 pMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
6 ~0 `( x \1 s7 S# ^' hMCASP_RX_MODE_DMA);
& w/ a/ t; X- g' `9 r: xMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
1 c' w5 W/ I. c% E0 rMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */8 e1 R* K) U- d/ ~7 J# k# `) V
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, 4 q" G+ a& M. q( z5 H( J2 O$ ?
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
y0 o- }# e% Q7 n4 E5 VMcASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD,
5 j4 x8 D- z% kMCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
1 O4 X( ]2 N: B% u RMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);1 n" W2 q& x% G- I+ ~: B; x2 n/ e
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
; q6 E3 q0 n0 f4 f6 ?* JMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,( ?% t% y5 h6 D& C
0x00, 0xFF);
/* configure the clock for transmitter */# W& k/ Q# c! }- ?! Q
McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
$ [" b$ v! D* }% `/ i& aMcASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); F; Q" e9 p! c) o4 E- F0 f
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,4 O# d" n1 _+ Y
0x00, 0xFF);
% _+ |: F+ W4 Y3 @8 K6 P
9 g! q6 s3 J5 l7 E& N" g/* Enable synchronization of RX and TX sections */ + a2 P# B- |- D1 [- v+ A
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */. U2 c1 d0 G% i+ q. i- \
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
. V6 k; `# [2 lMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*& c( h, F( R5 U. r
** Set the serializers, Currently only one serializer is set as7 y& o/ S9 Q! J+ Q
** transmitter and one serializer as receiver.
: a) H# ?0 O: \* Y" ]. G*/
3 C8 p7 r: P; ^* P4 tMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
& I# \( M6 `8 }) x3 hMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
5 s' t, e) T% N% p' [& I** Configure the McASP pins * Q3 _( Q# q& J- n/ r
** Input - Frame Sync, Clock and Serializer Rx0 v5 R3 S+ {( i2 Q* V7 {
** Output - Serializer Tx is connected to the input of the codec
7 e+ d1 n* Z1 q*/
+ C5 W8 C* E6 U0 q, S* `McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);& m8 u' ]8 Q4 Z# s2 w7 _) ?
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));' Q- ^: s# U- i* m5 r& u" { Q
McASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX5 Q8 X6 H- D8 M& z# ?0 t
| MCASP_PIN_ACLKX3 r. w$ j" n! f4 @9 H- O
| MCASP_PIN_AHCLKX
4 O7 E! f2 D/ d4 d| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */' a( I8 z5 u1 E: X( n
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
& Y; O: m8 y5 |" f; \0 c& M; d0 K! P| MCASP_TX_CLKFAIL
; T# P: ?) o, }2 z| MCASP_TX_SYNCERROR+ a# \) C% Y2 N5 E: s
| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR
5 G1 g0 I& k* p' ?| MCASP_RX_CLKFAIL
* R# p. b* c# g/ H4 _0 }# v| MCASP_RX_SYNCERROR 8 W; _7 `- k1 {$ A" S! l
| MCASP_RX_OVERRUN);
+ _/ Y( Q- \5 s- @}
static void I2SDataTxRxActivate(void)
3 b3 m4 ~6 L6 }/ @{0 @; H1 S: Q0 j; s$ o P
/* Start the clocks */( i, q3 Z3 d m, U
McASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);
" n8 |: d. q0 K: C X! X3 U$ b mMcASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */4 \0 C$ ]$ |# G6 \1 I+ M
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,( T5 Z' v* E* y
EDMA3_TRIG_MODE_EVENT);
! x: l- ]! f3 b% }, O& YEDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, 6 q% |% a+ _+ g. {( M
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */( q0 |$ p9 N/ D3 O9 q" i( ]7 ]
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);- P+ }4 j& P0 M+ a
McASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */6 O$ k2 o* f9 c: |/ L
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
" f* v2 T( e$ ^8 s9 ~* }McASPRxEnable(SOC_MCASP_0_CTRL_REGS);' n- d# x6 u# i# {# p( ]# e+ p
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
# _& N, u* b- q# a; D}
w6 [& _0 P1 h5 u请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
* d8 K0 O, y+ R. G
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |