嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* c/ J2 [3 D$ n) H1 Q
main文件:9 Y8 u+ }0 l8 m" S7 H8 I' @7 [
interrupt void interrupt4(void)  
* h. I" r9 a; A; \. @2 t{
1 O: K- T: M/ n; p# f' Y5 Y  Uint32 sample;
0 Q6 u- Y1 z3 a9 \& F% M1 o3 w$ I% o# I1 l7 A& l4 w/ V. C6 t
  sample = input_sample(); // read L + R samples from ADC
8 t# G# S& C. D2 a  output_sample(sample);   // write L + R samples to DAC
: {* T2 T6 h! g, q% M  return;
2 W, y6 f4 W  V- m/ P}
8 h) `1 _: e1 j7 {4 a
7 L9 w* n& t1 q  V$ [int main( void )
' y; p  D+ V! i& i+ O, Z{/ n! t" b/ f. Y, P; v

4 G' o1 W2 [1 k  S8 U    /* Initialize BSL */
8 a8 U# P! q5 J6 {! {9 r* Z! [    EVMC6747_init( );
( d0 h) l) |" L6 ^6 N$ {8 @6 @        /* Call evmc6747_intr function */3 l- b1 z& B* v8 Q4 n" a1 \
    aic3106_init( );) C! C6 n1 g+ ?, g2 t
        while(1);
8 X; \# q  S/ W' n+ }}4 F: t( T4 @9 g/ y
' a/ t% f" X9 m- a" `
0 q# G9 `2 t6 u& C- s, z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题7 O& L: D- K* `5 l7 I% }3 }
/* Initialize MCASP1 */- Y$ P6 h5 }! U1 g
    mcasp = &MCASP_MODULE_1;% V0 I; J4 H8 ~) \' {% U
    mcasp->regs->GBLCTL  = 0;       // Reset& H* D# r* S$ R" K2 }/ ^
    mcasp->regs->RGBLCTL = 0;       // Reset RX
, W3 B+ t7 s4 P+ V  Y$ c    mcasp->regs->XGBLCTL = 0;       // Reset TX
6 e; Z) Y" r8 x: f/ e    mcasp->regs->PWRDEMU = 1;       // Free-running, G% Y7 B& W$ L4 ^2 a7 d* b. V# `' V
   // configure McASP0 receive registers' m) Z$ T* _/ F6 V  T5 f2 z, u
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used8 ]6 }, U! X3 M7 k4 `
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 |/ }2 O9 D# s- C( m    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word  Z% a" f2 ]* G2 D5 u
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 A8 p1 }+ v: O8 P) G  l    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
4 F. F- y0 \" K' c1 {) [' X9 v    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
- ], D. l4 U. q    mcasp->regs->RINTCTL    = 0x00000000; // Not used' h9 W6 G- U# G6 v9 q
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- x0 k) v% m  G" H2 Y8 }3 B5 S2 c9 v) |8 W* E9 \3 A) \9 l) a! ^0 t: w7 ]# p
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
& ?! a, V, D1 ?    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ z$ }  H& w; a- v+ c; N$ ]* j# p+ A
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 b5 o! ?. d9 u* c3 C* p
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, \" C( j4 K! y% c
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
7 w+ B" i  c7 X3 c    mcasp->regs->XTDM       = 0x00000003; // Slots 0,14 \9 ^- d/ b/ P9 Q% |; M4 w
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit& [' x" S5 P! H
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' \; B4 f( j4 y1 |3 d: V# ^

0 b  }0 ^4 S6 s! [, n, q    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
: O# h8 ?- U5 z    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT' e/ }& l6 B; L$ L5 U
    mcasp->regs->PFUNC      = 0;          // All MCASPs
1 |9 h, i. Z" B- t    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1! h: ?; h3 m6 o3 F& \6 J: t

( z" Q; C- M8 d1 L1 r    mcasp->regs->DITCTL     = 0x00000000; // Not used
; s# @* m+ N% b- {    mcasp->regs->DLBCTL     = 0x00000000; // Not used! c; u4 W9 ?6 N7 k, ?7 L
    mcasp->regs->AMUTE      = 0x00000000; // Not used/ m& o( s3 F" w0 c# v5 ]
! c( I, f4 S& E0 h1 U/ [
/* Starting sections of the McASP*/: ^3 p# B# w4 Q
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; + V' z6 ^# N6 p& J3 J& z6 o2 u( E$ l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  7 s  x7 {2 N9 \5 d, d2 m
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * [$ m. L7 z" u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ ^+ O: Q9 N$ z8 O4 }) j% h
( E6 z. o9 A4 X0 P4 S+ c
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* h* w* f1 s4 b9 i    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ A, `% j- p' @# J4 ^% {    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; - q' k5 \. }! h* @- {2 ^8 U
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );  l6 v: j3 V' A+ T. G; j

) y% {- p/ l4 s9 S    mcasp->regs->XSTAT = 0x0000ffff;
# X( t6 H* M! a( u    mcasp->regs->RSTAT = 0x0000ffff;
0 V' e7 H$ a% x( ^: n4 r
( R" p! x6 _: Y- j  ], `6 Z    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& K0 \$ B+ [, H! V6 Q! l- T
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 \. Z2 W! y6 f5 X$ I    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& M6 U% B/ C) E    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 L  e( D# l+ z; P3 @: U; E
7 P* @/ ?( T* a, l, L& E
    /* Write a 0, so that no underrun occurs after releasing the state machine */4 [/ `$ `9 x8 ^( c) w+ w: \% N; |8 c- r
    mcasp->regs->XBUF5 = 0;8 D% A3 k& O4 @2 H
    mcasp->regs->RBUF0 = 0;
  k: J! N* x2 `" w( `4 c0 L* t5 d& A4 {* j+ ^1 x
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: q3 E8 O5 Y( E$ g* J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' [; P3 p1 H) u3 i# {9 q3 Y; M2 S    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ m) U3 L1 m  W' l/ [  B
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );, S+ o8 \. A" F) j" j2 a

6 i$ e% n# ]# t& t( H    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; * x0 c0 Y+ ]% ]. c: h
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( g% `& f% \; h3 Q$ S5 E4 m    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! K! h& }3 Y" V; Q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );  w' n9 t! f! }! D; a! B1 K2 X

3 ~) \( z# t' z; @/ y; j2 P    CSR = 0x0000;
5 ~" x8 R1 p# W! c0 Z4 C    INTC_INTMUX1 = 0x3d;/ q. y" J& U3 _, S+ x9 S
    ISTP = (unsigned int)vectors;
5 S3 {" C, m( J! m! |    ICR = 0xFFF0;  7 E9 [$ i: s7 u9 I  d
    IER |= 0x12;  
( ^0 f7 H! C! N, H+ s$ E9 g) q    CSR |= 0x01;  ' T& g1 u( R% V' E! Q

$ O* H* Z! t* M4 y* d3 K) D
2 }3 r" o6 z+ T: ~
) y: O' y# d) r& `9 b还有就是两个输入输出函数:
) |7 H: Y1 `3 y4 bvoid output_sample(Int32 out_data)
" r. }+ y6 O! ]' F. E{
8 g* p- Y1 T- F3 V  AIC31_data.uint = out_data;  
& o' u# ^0 |; b- ^: \  MCASP1_XBUF5_32BIT = AIC31_data.uint;
# j3 Z; Y# _  ~+ q}- {* U- j# M0 f# d# k& ~& c
- d3 D' q9 Z0 N- x; G. t9 F. l
Int32 input_sample(void)
9 q& `% v0 a( h/ m+ X3 g6 M: m{  7 ~4 S8 M# [7 @/ O3 B6 T4 L
  AIC31_data.uint = MCASP1_RBUF0_32BIT;% g/ ~5 [- u7 z' E9 k/ @
  return (AIC31_data.uint);- o9 p+ V- b5 P+ c& b" I
}
" k& e1 y* T0 h% t: C6 e+ l& k. N" L/ X7 J. z) b: r5 _$ N

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




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