嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# |0 |) J1 n; `) g
main文件:
" J9 Q' k# A. W8 t, J6 D6 Kinterrupt void interrupt4(void)  
5 T9 A* \9 D- G$ [8 D{! u. M# Q) w+ }1 m' P( T5 N
  Uint32 sample;
+ y# e6 s+ q5 z* y' C2 ?0 w6 l( D) b) C: _% {1 {4 m& k5 e8 [1 N
  sample = input_sample(); // read L + R samples from ADC
; I4 ~* N# Q: k- x* @; l  output_sample(sample);   // write L + R samples to DAC
3 t1 A; b, U2 X, c3 e* ~, ~! n  return;  \4 |) v+ O7 G# a! h
}
, U8 y5 X; Y/ q+ U  ?' e- g) v" y$ P$ G- p; q
int main( void )# d5 m0 X) v3 b2 F* Q+ v+ J
{6 R0 \# w+ T3 M+ I1 V# w
/ S& j3 d/ I* z( i
    /* Initialize BSL */
$ T; i: E1 D1 e    EVMC6747_init( );/ E8 b* q$ r( Z3 O
        /* Call evmc6747_intr function */" ^; M* Q1 P/ I' m' d( K: B
    aic3106_init( );
9 Z* p. g5 }, E1 t        while(1);
6 a; U2 p1 z2 {0 o: Y* ^( U}
  C, n. [( k* f* n  |- Q% b& S( `) |+ Q: K

; n/ t, @, K: m( Q9 a: iaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ @1 c# m& E. i/* Initialize MCASP1 */
1 L0 O* m$ o8 w. U3 L    mcasp = &MCASP_MODULE_1;- ^, c" o/ m" D5 R! X+ r
    mcasp->regs->GBLCTL  = 0;       // Reset, K6 o; q* X. A
    mcasp->regs->RGBLCTL = 0;       // Reset RX4 j; b0 i* ^* t
    mcasp->regs->XGBLCTL = 0;       // Reset TX" j5 A7 \) L0 @" G0 y9 j( G
    mcasp->regs->PWRDEMU = 1;       // Free-running# K7 W9 {3 B8 p; A3 y3 Y
   // configure McASP0 receive registers
% p2 q  z( g* ?& j! W5 L% S    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used! q  y2 S( ^& [
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ |3 [8 u3 ?$ p1 K" U    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, o( [8 Y& ?$ L    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side), }4 R4 I" X$ B& _! g5 G8 t# I# d
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)' }1 s% B+ B, {
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
  d4 o% ~  J+ i+ e) `+ K7 ~( F, Z    mcasp->regs->RINTCTL    = 0x00000000; // Not used
6 \9 X6 p4 h" B    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 Z" R7 I; L+ a) O* {; m8 w. c, A
: p+ i+ a0 M, m# i" p    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used" ]( o  M8 d4 ^& |
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 Z& Z0 J3 l0 `' _    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* v! O! o3 s) Z  q    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ i$ d+ B. ~* O* F- s# G- J( h    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK- I% F9 Y; H* B+ D2 Y- ?: l8 D
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
$ n( l/ g1 c/ z# E9 P    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
  p) V% \! L  ~. S2 I4 H8 R    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 c; \' E( p% V/ ^$ w: z; O

) Z  _9 f+ Q. ], C' J4 _    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
6 T. l  `9 Z+ H! l    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
  t/ w6 }8 k$ Y9 D; v& S    mcasp->regs->PFUNC      = 0;          // All MCASPs
, l! v7 n' c. P8 H, N8 I. ~, j4 H    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1  P& b; E4 E+ z6 u. Z
4 p/ |8 G4 v& q/ x, ~4 d3 d
    mcasp->regs->DITCTL     = 0x00000000; // Not used
& V- P0 _# V' f1 N9 f8 t    mcasp->regs->DLBCTL     = 0x00000000; // Not used
" D" b6 J6 a- R% z) F    mcasp->regs->AMUTE      = 0x00000000; // Not used
$ m2 P3 A- F7 n0 B/ N% r+ f! [# \! v% Q" I2 ?+ A' [1 V) Y
/* Starting sections of the McASP*/5 M  p! X3 S% @" V( z: o* m
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 Y( ~% Z1 j1 _6 Y9 k& S/ }    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
4 z; j- A% c4 d$ }* O0 I6 p    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : Z) |8 r# ?" k7 I" l5 `# v
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% y4 e' P: M+ N
8 D5 |. K- E5 o$ m# _% q4 k    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% y* i& A7 I4 k6 z( L    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ v2 W# U' T$ W  k) v2 e2 ?; w
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; - j7 M$ P* j0 _
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
2 a: m. H. ]1 P1 H+ g
  k' v; ~( B1 l& Y9 `6 c. ]# a    mcasp->regs->XSTAT = 0x0000ffff; ! l5 L) O$ K+ a: B! Y5 [: h
    mcasp->regs->RSTAT = 0x0000ffff;
/ [6 Q! @; w% y: r2 |( H9 H2 x, ]- W) V0 {8 O
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 [8 u! E9 H  ]1 z: O3 r! E    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 o$ N% T+ X  l; b+ a    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* P/ u! C) u& l" [, x    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ p$ `. Z$ }0 J+ x. e4 V' b9 R0 K) X. E
    /* Write a 0, so that no underrun occurs after releasing the state machine */
- q2 Y( ^$ V- }  a9 ~! [    mcasp->regs->XBUF5 = 0;7 w7 R; p5 e: ?) H  p# l& A
    mcasp->regs->RBUF0 = 0;
% q' F( t6 @* k: C* l1 Z. U4 D/ _
3 P% [2 g! X+ Y5 z    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 p; g/ Q! m1 D! }0 k2 [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% d' I& _" W, j: n$ T+ q) ~
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ) q7 \, O2 ?* m2 n4 J
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! Q; I* u) x5 U5 d; |% y7 y" V
+ o  i  F& _/ j* G+ c& O( t$ g8 l    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* W/ w+ \# f' h, ^    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& i  p3 ]* k! U    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 2 M6 ]1 Z  K4 A! D2 }/ k# N) Y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );7 Y2 q  j, z8 ?3 Z0 Y
: B( F$ H% a8 v5 M7 g5 m$ l
    CSR = 0x0000;
- S' l0 D. v  X$ M& [( \7 c& W    INTC_INTMUX1 = 0x3d;( h; C( U( z* r
    ISTP = (unsigned int)vectors;7 |3 B4 s4 {3 v' S( l7 Q9 i) S
    ICR = 0xFFF0;  , y, C5 O! g( j/ }; o% W  J
    IER |= 0x12;  3 a! |7 {* H. D: s/ v9 ~
    CSR |= 0x01;  - R4 e% w1 }: c1 U

! n; Z5 u' x0 n" F
, D# B2 a, b. ]/ T1 B! e0 q0 C6 G6 Y3 ?6 ~( p9 v
还有就是两个输入输出函数:
1 W: \5 S2 ^' g) W9 s$ H+ @void output_sample(Int32 out_data)
& V1 I& l8 A4 E5 S7 X5 j1 g{  ~7 t+ L" }( v" C
  AIC31_data.uint = out_data;  ) D" N9 W. B7 b4 b) O2 Z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;/ z2 ^8 n0 i# p  S' n+ {& w) c
}
" A0 a" N' M" [  k- J' D! Q4 d
8 M4 C/ L9 \: |6 j- HInt32 input_sample(void)1 J- l$ u8 y) D! S- I: j* a+ m
{  
2 V. G9 O  F/ m  AIC31_data.uint = MCASP1_RBUF0_32BIT;- d, i9 n$ C' u+ i
  return (AIC31_data.uint);! J1 v- X$ X+ h3 H
}  _5 s/ C' T5 Y9 e; J2 a3 s

( M) a3 c- x+ C8 y7 l" }  ^3 M8 j
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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