嵌入式开发者社区
标题: MCASP自环配置。 [打印本页]
作者: wapdasta 时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,
% f" z/ S: | r1 @- g, _input mcasp_ahclkx,2 z p* i: u% F" ~) P8 h5 F1 e
input mcasp_aclkx, t0 i! g; F( P5 V* o3 j
input axr0,
- y. {" R8 ]" o0 |1 n- w y' \: v! I: @, n q4 D
output mcasp_afsr,
2 G$ y2 y/ ^% @5 }: koutput mcasp_ahclkr,# P# I8 {9 [2 p
output mcasp_aclkr,, C" c/ j3 @/ c5 s7 O
output axr1,
$ Y/ e* ^: o. D L R
assign mcasp_afsr = mcasp_afsx;& I5 z2 y" g- C- b
assign mcasp_aclkr = mcasp_aclkx;
( i/ [- u# _! passign mcasp_ahclkr = mcasp_ahclkx;$ C8 Y! r8 H V1 E+ G4 n( ^# F
assign axr1 = axr0;
, Q& x. T8 O+ p+ p
4 S2 H; z4 b+ f) c在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。
# E8 H" [# e- n" H1 X9 w5 ?static void McASPI2SConfigure(void)8 R. I6 u/ j5 ]7 X0 L
{7 N: y8 C' g8 q( R
McASPRxReset(SOC_MCASP_0_CTRL_REGS);
6 B: y. W% O/ K7 w5 JMcASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */; X/ M, D6 ?% H- \. @. b
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
% I9 [/ `3 I9 wMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */
; S8 t: S, f% o x! ]( Y" G' PMcASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
/ e/ C7 u5 I9 O! Y- f7 ]; X# U" tMCASP_RX_MODE_DMA);
- |; j8 R: Q' R- |6 h+ i0 LMcASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
. x- W0 @/ r/ `. i W% kMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */; l- Z& D* _5 ?# D
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD, ( ^" S5 X7 V8 Q. V H5 {+ H
MCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);
% `/ v, z3 X: ]McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, 1 W W. [( `! y* |8 A( @: S, j" Z
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */
( J& f2 J8 ]8 C3 G9 Z7 t; z; |7 VMcASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);# J. j( l( c3 C R( {0 p
McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE);
# I& X( [. G" h3 N4 qMcASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,7 d f P9 h, b+ T. |( h% K5 z- q
0x00, 0xFF);
/* configure the clock for transmitter */
; B0 W6 E! d4 w* b9 F3 F4 B. yMcASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);
; H7 W& Z L2 \- B1 d, |McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); / X9 n0 m0 P4 ], t: y% {! A" m
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,
8 n+ b' \6 \$ n0x00, 0xFF);# q' S8 d G s) h, {- V: h0 @* [
; B1 d0 j8 _/ X! v1 w( d
/* Enable synchronization of RX and TX sections */
; `0 D {7 p3 |0 m8 oMcASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */
& _0 P; P- ?' |+ M/ [McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
7 l% e- R" u S4 N" ~- oMcASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*& X/ ^9 ~0 `. i* ^
** Set the serializers, Currently only one serializer is set as
4 E2 F3 B1 R* t) v3 J0 j" n9 ]& j( g** transmitter and one serializer as receiver.
6 U) L4 \1 C- k*/) p' B' G2 v, p/ y% c4 V+ c
McASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);
l" y7 b' i% Y! kMcASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*
8 s% C! A8 C: e& c** Configure the McASP pins x" E2 T/ T& o- Z& B! z
** Input - Frame Sync, Clock and Serializer Rx
, [* a. b" o) \" K8 ]** Output - Serializer Tx is connected to the input of the codec
$ B. y4 h5 G3 H5 k2 M3 B& ?! c6 U*/: Q; r) G: p" r/ N5 b$ r5 x0 _9 s3 V
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);
3 H( _& P# P3 F2 R6 TMcASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
. U7 V; V( r$ a% t: P# n8 n+ UMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
0 d- N' ? W3 n! ~& ?' l+ v| MCASP_PIN_ACLKX
/ t5 e2 r3 p4 |) J& h# O$ J| MCASP_PIN_AHCLKX* F. v# d1 @; f9 }' y9 a: j
| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */6 a. b2 z8 P( }- n* @
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR & { j+ z* @" Y; v0 f
| MCASP_TX_CLKFAIL / `& S, e/ I) c9 I2 P2 }0 J
| MCASP_TX_SYNCERROR
/ h/ G# I- X) @1 r! H| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : I! k% k1 C5 f$ U T
| MCASP_RX_CLKFAIL2 m& y6 F( H2 \ \: E/ {
| MCASP_RX_SYNCERROR
# ]( X; Y- c( r( l- j| MCASP_RX_OVERRUN);
: U' H" [ d2 C! v}
static void I2SDataTxRxActivate(void)9 l, _2 O- T0 s; D1 X2 H
{- R0 i: {( @$ `& y3 c
/* Start the clocks */
. v+ `/ C, a8 e$ M% YMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);2 a; K* {1 v$ l2 y! B9 r7 s# t
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */; T/ u4 }( z( |3 D# u2 K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,& ^, u# S9 j2 i- g
EDMA3_TRIG_MODE_EVENT);( S/ F. c, s: u6 a1 P4 Y( i+ E" K
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, & l/ X* x& P3 S- ^
EDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */ H: W8 i8 i+ ^% Q1 q2 J; L7 c
McASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
2 H) ?8 z' ?) _& u' b) CMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */- v) n# j( X% J2 j5 ^8 R
while(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
! h$ G, ? c' u$ C2 T7 jMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);6 @# ]" x) y4 B/ s
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);
' a" i @ p3 S5 ~}
1 ?6 t" V& |5 X8 K+ c请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
( X( l1 Q8 W3 V& _% c( r" {+ x+ E* T
| 欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) |
Powered by Discuz! X3.4 |