嵌入式开发者社区

标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页]

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
  W6 X% Y* F/ a$ H& Rmain文件:
! u+ F: o( |& M' O& W* r; ^1 sinterrupt void interrupt4(void)  
$ Y0 e' E& ]  @4 b" S6 ~{
$ c% f. \1 V$ D+ p2 X  Uint32 sample;% }/ ~3 I, [% N/ i! j0 N

, K9 d- j2 h$ \' u) \  sample = input_sample(); // read L + R samples from ADC" C, [+ t  v* v; d% ]- ]
  output_sample(sample);   // write L + R samples to DAC
: I/ t' D4 y; B; o! x* W  return;
5 J7 b4 N" F" X}
! z3 x4 {! i. a; h. i1 U8 }& @& [/ ?  S9 g. Y" _$ ^+ g9 f3 H
int main( void )
) {/ t4 C6 T+ {( @: d1 N{& `' P" y) X  ?3 T

6 F5 D1 o1 A6 a* ~    /* Initialize BSL */
  g, H" \4 N+ w    EVMC6747_init( );; r, `9 X, m* F
        /* Call evmc6747_intr function */
- F0 O- N6 W, K8 a# i+ D5 \' y    aic3106_init( );/ D1 @3 y6 K! O, [9 x1 v! _
        while(1);
* c( K! u- b$ r$ E2 ?. O+ r}
  D7 R  \0 Q' l
) ?) S! M1 ]2 N- @( C/ ?9 @/ _4 d7 ]8 p3 r
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ A' [0 t5 A8 u( C/* Initialize MCASP1 */1 b; Q, n9 E& E2 ]4 T2 u& F
    mcasp = &MCASP_MODULE_1;
( b' ]( f3 J) E0 o  O9 l4 E0 v! J    mcasp->regs->GBLCTL  = 0;       // Reset% Q; a6 P( [8 a* R1 j4 i
    mcasp->regs->RGBLCTL = 0;       // Reset RX
. _5 |  G5 x" Z9 \0 Y    mcasp->regs->XGBLCTL = 0;       // Reset TX
/ q1 k' E: d6 j! V  |1 G2 k    mcasp->regs->PWRDEMU = 1;       // Free-running
6 q2 q& P& ~3 U- I+ Q   // configure McASP0 receive registers
1 T# E6 l0 X& C" J% n    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used, H7 y* m, x  Z# Z: d  u
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 S; W+ b2 b2 ]. r9 [3 x5 B  u
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word3 \- U  F/ _+ o9 Q1 ?8 P0 J+ k0 m
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)' O$ F$ C; O5 z5 h9 b) K
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
( M+ q; _8 f9 C3 m' f) H    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1/ ^* Q$ Y% q* v$ T9 w) m
    mcasp->regs->RINTCTL    = 0x00000000; // Not used/ b4 ~+ w7 B/ v7 T$ ]
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 E' ~4 f5 x8 d7 D) T3 _# w/ {
& j5 n7 k  m) S1 J# q
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
  K6 ?1 U$ Q. F& b% G2 v! }, H. u    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) l3 D0 i3 q( p, `
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word# d: s& u" q/ Z' m& q% P
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- P) z1 Q# B7 _5 ?) s& \2 ]    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
" f7 v% v1 g: {! K6 L& I1 L; }    mcasp->regs->XTDM       = 0x00000003; // Slots 0,12 e3 e! K5 D& e" B3 e# d8 p' [6 J# |
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit/ S. R( k4 {- U7 U$ N* b0 Y% M
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) M- Z. J! o* I& b! K  m2 e

1 i- v2 o- y4 r* v: j  C# L* m2 I    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
( d9 e) c* ~' X/ P' a, H    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT% m4 `' r% P+ u  s. J. h
    mcasp->regs->PFUNC      = 0;          // All MCASPs
$ f1 D& Z# p! {/ G' T6 k    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 l6 [3 O* A+ h6 r
, l# g, s7 I3 C) \7 z! K
    mcasp->regs->DITCTL     = 0x00000000; // Not used
9 v, U, I$ d. p% p% E4 V    mcasp->regs->DLBCTL     = 0x00000000; // Not used) ^% }+ [: y( ^. Y" d4 E
    mcasp->regs->AMUTE      = 0x00000000; // Not used, h) v" J' K" x4 Q0 V
9 k( e( o5 l; ~+ V4 R3 A4 f
/* Starting sections of the McASP*/1 O% x" R' P# b: @% X2 l* g
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# q4 R8 V# \3 U9 s, A    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
3 [& u2 |' T! U4 W: T" `& Q3 r    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' @6 N8 A9 F, r1 v& u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 j, [% h  L. E+ w
5 r6 q6 E6 D% e. Q' O6 c+ h    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ( w% M' d" H) X6 T  Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 U  s* M$ h: i" z% [
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; / D+ d' c! c7 d( H9 A
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );0 V' G; H2 }" {' u3 s. C* ^

% O  s, k% n" o0 h    mcasp->regs->XSTAT = 0x0000ffff;
# m0 d  j+ u) d. y1 M    mcasp->regs->RSTAT = 0x0000ffff;
0 o9 _$ l* m. {) `8 r; A' H4 G% ~8 l: e. Y' A; t
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( p8 j* K0 @5 ]0 i% H; r    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );8 _: v3 I+ g- \, V" I% F
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 R/ U7 h" {  `. h. Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; f. E' _$ }  h

* N3 p9 V7 l( z5 i1 i    /* Write a 0, so that no underrun occurs after releasing the state machine */+ d! ^6 @2 [9 U: p
    mcasp->regs->XBUF5 = 0;3 T' G7 \: j8 n/ a( r
    mcasp->regs->RBUF0 = 0;
, Y- d, Q. L% c1 U8 f9 k$ {- p
( A9 d/ M+ @7 n7 O' p; e    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 3 p' ^' i- F3 V& V; C0 k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );' [9 n: q" ^4 i5 D" N9 l- ^* N# O
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;   T) h7 s7 F" B* w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 ?. g/ F' r- i$ w: o- h
5 U5 O5 O1 i# S3 n+ w    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; Y# M2 \/ ~  p; R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 S, e% m: `) K& O    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 ^+ v7 t( X0 g( c( a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. ^$ l) S+ U7 m+ V9 b4 F
8 ^0 D. b- K$ W
    CSR = 0x0000;3 h7 b& ]% }0 q. D' v2 w
    INTC_INTMUX1 = 0x3d;
5 W* g; V5 Z& D% b7 u# L- N    ISTP = (unsigned int)vectors;7 P6 x; ]9 v% V1 V2 Q
    ICR = 0xFFF0;  * n$ i. t. [6 f
    IER |= 0x12;  
7 c8 ^# k4 q) ?' M  E# q0 M    CSR |= 0x01;  0 [4 \6 Z1 }# o& p- Q
) p; I; M+ l" P

  x7 {; P+ v# ^# H8 q
0 K; r' q* D- c/ A  ^* |; q还有就是两个输入输出函数:
+ [6 G, ~. U5 Y5 _4 i3 D' Svoid output_sample(Int32 out_data)* z- c4 D- ?2 n5 S$ M
{
; s* b  d; b" C! h1 K6 v  AIC31_data.uint = out_data;  9 ]) G/ Q  Q# [
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
; o* Q* G7 {/ F( B}
% r# C, V3 e0 V* t. n# K, f$ u9 ~: h% [. i# l. D
Int32 input_sample(void)
8 L4 I. r& W' P3 l{  
. b: y" A2 ^& L# e8 E, r) U  AIC31_data.uint = MCASP1_RBUF0_32BIT;* i- a# F; y- x5 {4 d; [
  return (AIC31_data.uint);
7 d- R# L3 O/ u; W}
. t$ t& K; X% u; ]' o: n: i- L+ a, p) S3 \5 A+ w, T

作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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