嵌入式开发者社区

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

作者: wapdasta    时间: 2018-11-7 13:28
标题: MCASP自环配置。
我项目上用OMAPL138的板子MCASP的引脚都是链接的FPGA,所以在FPGA这端设置的MCASP自环。把axr0接收到的通过axr1发回去。
部分代码如下
input mcasp_afsx,( B, r, Z# j6 i6 N) P/ H, |; J# X
input mcasp_ahclkx,
+ O+ {0 P9 B. Y& a, K0 f; }5 Dinput mcasp_aclkx,
4 P( ~5 p+ C9 Y# {input axr0,
, F3 \. e2 V& m8 B
  b) Q+ q! I" joutput mcasp_afsr,( W2 |  s+ B/ b' {. [6 l8 ~4 U
output mcasp_ahclkr,9 z3 o: k/ Y/ t
output mcasp_aclkr,, `1 d' O$ s1 h4 G2 J
output axr1,1 r0 o: k4 t; H" E2 g% k
assign mcasp_afsr = mcasp_afsx;1 A9 S9 {+ F: I2 d4 h2 V) g2 @7 C
assign mcasp_aclkr = mcasp_aclkx;
& u, c% m6 i& D7 x8 \assign mcasp_ahclkr = mcasp_ahclkx;
2 @) }4 B( P, E: _) d$ X' Aassign axr1 = axr0;

! T4 |7 M. n* x7 m" @  L$ a' c6 P, r6 ]) i: I
在OMAPL138这端,通过axr0接口发固定的数,axr1接收。
在配置MACASP的时候,发送全部取内部时钟,接收全部取外部时钟。
一直循环发送,但是接收不到。在FPGA端也没有看到时钟和信号的波形。
部分代码如下,关于edma3的部分未做变化。

/ ?4 X8 `; ]5 Q( P  a: Q% e( H
static void McASPI2SConfigure(void)1 I6 z) Y1 j. _7 H
{
* G( d" U% j8 }McASPRxReset(SOC_MCASP_0_CTRL_REGS);, I5 A$ [7 L1 S: Y2 l$ S6 [
McASPTxReset(SOC_MCASP_0_CTRL_REGS);
/* Enable the FIFOs for DMA transfer */6 q  Y: s" U  v1 g
McASPReadFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
* o( H2 q2 A8 x4 y( H$ BMcASPWriteFifoEnable(SOC_MCASP_0_FIFO_REGS, 1, 1);
/* Set I2S format in the transmitter/receiver format units */0 m4 y1 X) J+ F* z1 k
McASPRxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* b; m2 z: k) E* Q' L' jMCASP_RX_MODE_DMA);
3 f- o' p- z" ~1 ^: j& @McASPTxFmtI2SSet(SOC_MCASP_0_CTRL_REGS, WORD_SIZE, SLOT_SIZE,
* G8 G. u0 A. _+ V$ Q6 mMCASP_TX_MODE_DMA);
/* Configure the frame sync. I2S shall work in TDM format with 2 slots */5 x" K; A3 [# [2 d  v+ S! _
McASPRxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_RX_FS_WIDTH_WORD,
) c' p: P7 {/ ]! s' b; xMCASP_RX_FS_EXT_BEGIN_ON_FALL_EDGE);  Y3 R* k) @$ S) B
McASPTxFrameSyncCfg(SOC_MCASP_0_CTRL_REGS, 2, MCASP_TX_FS_WIDTH_WORD, + i! A# b" z& c
MCASP_TX_FS_INT_BEGIN_ON_RIS_EDGE);
/* configure the clock for receiver */3 T$ \: R0 D' a2 i4 r4 C
McASPRxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL, 0, 0);
, e) R" n3 H6 ]McASPRxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_POL_RIS_EDGE); & Z+ E3 ~' c8 E/ y) x
McASPRxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLKCHCK_DIV32,
5 m+ Q+ Z2 \3 B' C; J5 \# E0x00, 0xFF);
/* configure the clock for transmitter */
( `7 d+ ^5 Z3 J* ^2 l; I# r* b- ?McASPTxClkCfg(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL, 11, 1);. i1 I& r' w  J. C3 P2 B$ }
McASPTxClkPolaritySet(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_POL_FALL_EDGE); ( m7 x3 s/ G8 e  B; t. k5 V
McASPTxClkCheckConfig(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLKCHCK_DIV32,* O% i" s! }# b, F1 E- A# g
0x00, 0xFF);  [; F+ g7 y# }* O3 d

1 B$ n  `8 ], T4 m+ J0 s* `/* Enable synchronization of RX and TX sections */ 9 Q' R& ]% w- {% A$ N+ _; G' n
McASPTxRxClkSyncEnable(SOC_MCASP_0_CTRL_REGS);
/* Enable the transmitter/receiver slots. I2S uses 2 slots */: I3 O" d8 v3 I' D( B, O# R
McASPRxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);0 t% ]9 ]$ ~2 t' o0 z+ d
McASPTxTimeSlotSet(SOC_MCASP_0_CTRL_REGS, I2S_SLOTS);
/*
- h: H* N# [8 ~2 m  j7 R** Set the serializers, Currently only one serializer is set as4 i2 Y; _- F4 |0 ~! ^9 U4 e
** transmitter and one serializer as receiver.% r, s  R( L8 A( k* H% ?
*/
0 W1 a8 U3 F: K( T0 e# bMcASPSerializerRxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_RX);1 z3 d2 v- B: ?2 R
McASPSerializerTxSet(SOC_MCASP_0_CTRL_REGS, MCASP_XSER_TX);
/*5 N, n4 S5 g: e3 M1 u
** Configure the McASP pins
$ Z9 A  a% y$ S& X) j  V** Input - Frame Sync, Clock and Serializer Rx
  Q2 z4 V, D+ s+ K8 a** Output - Serializer Tx is connected to the input of the codec " p- o: k- n; \6 W
*/: d# S8 `7 \6 x4 y# F* f
McASPPinMcASPSet(SOC_MCASP_0_CTRL_REGS, 0xFFFFFFFF);  |! S( D* N0 B" z
McASPPinDirOutputSet(SOC_MCASP_0_CTRL_REGS,MCASP_PIN_AXR(MCASP_XSER_TX));
% Q& ]( x( [, H" Y, ~4 }% jMcASPPinDirInputSet(SOC_MCASP_0_CTRL_REGS, MCASP_PIN_AFSX
2 a1 `" U& S; d, r: e| MCASP_PIN_ACLKX
& R, I. A" N: Y, o| MCASP_PIN_AHCLKX
  ?, t$ I+ S8 {% _4 c: [1 z! N# q| MCASP_PIN_AXR(MCASP_XSER_RX));
/* Enable error interrupts for McASP */# J, z. F# k. A7 n5 m
McASPTxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_TX_DMAERROR
  G! f' g! K1 Z| MCASP_TX_CLKFAIL
. d0 o, _3 I. C8 ?) X- D/ M& z| MCASP_TX_SYNCERROR
; x* S4 [7 |% R, X* g| MCASP_TX_UNDERRUN);
McASPRxIntEnable(SOC_MCASP_0_CTRL_REGS, MCASP_RX_DMAERROR : z$ ^% `( V% Y& [* v- o
| MCASP_RX_CLKFAIL
( {$ [1 p) s* Q. Z7 k4 ^0 G| MCASP_RX_SYNCERROR
- C2 E- G/ |. x" Q. N- h| MCASP_RX_OVERRUN);! R* K% B: o$ n) _" k9 s% V( w
}
static void I2SDataTxRxActivate(void)* J, V2 X5 _) O; O, l& W+ U9 K
{$ ?0 F8 {9 V0 H
/* Start the clocks */
0 i! T" {3 d9 L8 k. zMcASPRxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_RX_CLK_EXTERNAL);$ H, X3 D/ _; m0 U7 G6 s/ q' S
McASPTxClkStart(SOC_MCASP_0_CTRL_REGS, MCASP_TX_CLK_INTERNAL);
/* Enable EDMA for the transfer */8 R4 t$ Z' C% z  J9 ~& j8 T
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, EDMA3_CHA_MCASP0_RX,4 @: f' t7 ~9 d6 t( j7 g5 G
EDMA3_TRIG_MODE_EVENT);" N. i4 G1 n# y7 \0 l7 N
EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS,
$ {7 i0 J$ [+ JEDMA3_CHA_MCASP0_TX, EDMA3_TRIG_MODE_EVENT);
/* Activate the serializers */
! S- W( s9 v# x* Z$ zMcASPRxSerActivate(SOC_MCASP_0_CTRL_REGS);
: w  j1 W( g) m( l* T; Z0 bMcASPTxSerActivate(SOC_MCASP_0_CTRL_REGS);
/* make sure that the XDATA bit is cleared to zero */
- X; y3 ]+ P2 I0 z9 }: X$ D+ o# u( qwhile(McASPTxStatusGet(SOC_MCASP_0_CTRL_REGS) & MCASP_TX_STAT_DATAREADY);
/* Activate the state machines */
0 N2 U2 m! F" rMcASPRxEnable(SOC_MCASP_0_CTRL_REGS);; R- E6 o1 ?- D4 k" q
McASPTxEnable(SOC_MCASP_0_CTRL_REGS);' r& x3 n: i, Y+ Z
}

6 y5 y' l) u8 A& _% f  b* ?% x( _
请问:问题出在哪了,时钟按照这样配是否有错。
另外我看XDATA一直是0,接收的rxbuf0,1,2里有一般全是FFFF一半全是0.
  e6 l' C: X$ E  l. S. `' m6 s





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