嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:  w9 U. `) y: q. W
main文件:2 I' @$ v/ ^: U. k- b- A: b# X
interrupt void interrupt4(void)  - D8 e& ^$ ]$ n$ p% [* T- p8 S
{) f$ d2 P# h4 A
  Uint32 sample;
; }1 F. |" T! q9 {: F7 }; ], g* v
  sample = input_sample(); // read L + R samples from ADC
8 l! H. A  b/ S  output_sample(sample);   // write L + R samples to DAC
' h/ q& O: g8 C- f& e  return;
& |  a  _& J0 |! J. u+ }}  Z4 Y" I/ p* ~' f2 u% t

% \7 d1 H# C+ `9 q% y9 eint main( void )
% j6 _4 k, d9 F7 H  q0 }0 P; Y3 j{% w- O$ }! o5 M) I

& F$ g/ b8 u3 T: P1 A    /* Initialize BSL */
7 C2 P  `6 G' w    EVMC6747_init( );6 s9 E/ x  ^5 M; ~% Y
        /* Call evmc6747_intr function */
8 _0 M8 W, Z6 y% ^, |0 G7 h    aic3106_init( );  A- m0 q% k* T. V1 k
        while(1);
) C4 G% @+ R4 p; T. C9 ?}, s7 x" V/ a) ~) A

8 ~5 ?- A9 L8 E2 _  a0 T1 G+ y5 b  a
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 L, Z( C" \! n# F/* Initialize MCASP1 */6 K3 Q0 j* U( [2 k1 x
    mcasp = &MCASP_MODULE_1;
) d( D: Q+ {' A2 B' u. e" F  f( v) r    mcasp->regs->GBLCTL  = 0;       // Reset
' t( f* r! T# l7 x    mcasp->regs->RGBLCTL = 0;       // Reset RX) k$ p5 ^, R5 v6 @$ y0 f
    mcasp->regs->XGBLCTL = 0;       // Reset TX: o& f2 q) U+ ]" ], H0 O
    mcasp->regs->PWRDEMU = 1;       // Free-running
$ Q# D/ M% K3 y+ {' x6 @   // configure McASP0 receive registers: b  J( G  _( `: B6 `. y
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used/ F5 T1 v% y8 K
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, Q- f1 |, M8 s  d( p# }9 E
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
- M# S' ?- C- @    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side); D0 Z9 d; y' m# m% m% E
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
: T. L) b2 W7 |% [    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
  F# ~: u0 s9 ?4 E6 J    mcasp->regs->RINTCTL    = 0x00000000; // Not used  o1 P, |- }6 i7 r  s# o' B9 I
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256  r" z# @  R: t5 J. K
9 Z0 t" N7 _9 f: l- _" d
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
9 e+ ^  r2 w" d) B    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 g  i4 L! ?" C6 F8 h
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
! F) Y! u- N5 t, [& w+ S- W& A' F3 d    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) r' r: d5 y( ?  d- G    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
$ J( s" d% q  T# |/ g; Q. i    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1: x: {; T! s  q
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
& ?9 L/ h) h+ ]% f4 B    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; Z  j) V' y' N- d/ O( s8 `" s5 Q2 H7 A0 \
. J; A& F2 y' B# a
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN! M' N/ Y5 b- }$ O! |* P( @
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT9 n' r" V& N) Z5 O- H4 _; _1 |
    mcasp->regs->PFUNC      = 0;          // All MCASPs
$ Q6 l  w! J* Q. H5 D! G( z    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1& f! O; r3 W7 C0 R' L- p- F* o

) f6 t5 P) i( D& o% h3 W7 \    mcasp->regs->DITCTL     = 0x00000000; // Not used" x4 C& m- q( u, T1 l& ?; a
    mcasp->regs->DLBCTL     = 0x00000000; // Not used  N: `" l/ q3 X/ `3 D
    mcasp->regs->AMUTE      = 0x00000000; // Not used
5 p4 l; g" @+ y. w1 b" J; J* X- s" x$ |
/* Starting sections of the McASP*/! ?% e% B( A8 X7 c, u+ ?+ d! Q  l
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 B/ X1 ]$ B# ~% S$ b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  % q1 }& m/ j% E8 Y3 @& }" w3 h
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. j8 L& n4 u& |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );( w; M, T# A8 j. r
! v( u2 v, i  I! m- Z' j6 i/ f& K7 P
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 a8 _4 F" d2 Q% u- o5 Z1 `8 c$ K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 m6 V& [* k7 K; a
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; - h4 @- b6 b: o: O% V3 w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );* |( O$ H! S+ ]% I8 K
3 a! U$ U* j. i( l' ?
    mcasp->regs->XSTAT = 0x0000ffff; + x" F8 s3 W& }+ Z" v5 _  }. q
    mcasp->regs->RSTAT = 0x0000ffff; ! W# n# z& ]1 ?4 Q0 e* }$ f! M

- X: n9 @/ H3 x) h7 J! N3 ^    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- n- n- @; Z9 q4 W. g& ?    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );" P1 v% @& [: C0 @+ q
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ' f1 t, I" l! h' {. a3 Y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );  c5 f5 H) A3 o
. k" U# R, w7 N1 a: x# N* R, Z
    /* Write a 0, so that no underrun occurs after releasing the state machine */
6 n' J, \0 c: F5 W7 x% W    mcasp->regs->XBUF5 = 0;
! h7 r9 m& E5 H    mcasp->regs->RBUF0 = 0;2 _! _9 [0 h  G

& b3 T" ?. ]" ]4 {    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / E% k; i, C# p' d) Q. ]$ w& k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 t7 `2 s4 Z1 L" ]4 E; F$ V    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
- q" r  B+ s7 j# S5 L5 o. Z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* l3 r$ |/ A+ S2 m' J' t1 s& A
7 d1 W3 \9 _- x" J" \- t    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 Q( _+ e7 C1 E    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );+ [, a' v3 o: Z
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 D  B& l6 }" a0 l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
8 `9 B+ Z& V7 L/ X4 p. N
3 }+ v( M& r  ?, W6 S$ i    CSR = 0x0000;
$ W. J& N- W/ M. ]    INTC_INTMUX1 = 0x3d;$ C$ Q5 r  p3 D5 C! a  e
    ISTP = (unsigned int)vectors;
1 ]- v- x; y$ b8 g* ^, R; l; o5 I    ICR = 0xFFF0;  - |) l4 M! A% s8 e
    IER |= 0x12;  3 _0 a" k/ L# p: m$ m$ L
    CSR |= 0x01;  4 n0 g! {% \+ ^& L8 t# \

6 A3 X! b) b# J) [& B( r
) j; k& A+ K( ~& h7 R
! Y* M# W& u* M+ x5 R4 x" {9 |3 [还有就是两个输入输出函数:' Z9 u/ W: @6 Y- V7 ~
void output_sample(Int32 out_data)
; [+ }. |# @% X' H! \- }{9 G! T9 R" {/ c) [% N1 F
  AIC31_data.uint = out_data;  
8 E" m9 I- S8 p  MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 R3 U9 o7 c; J: T8 x}
) `" C1 o7 y' d  B$ q' {0 \5 T6 \# c" X; f+ e2 @' G) K4 C% B
Int32 input_sample(void)
- b6 v4 y" p; H5 ]3 h) j{  6 q; L" l4 r1 v) i
  AIC31_data.uint = MCASP1_RBUF0_32BIT;( o: @, N* A+ N- J. d! k! k  c
  return (AIC31_data.uint);
4 e1 G6 ^- h, g2 k* d}
' }6 I% A2 l1 z' K' G7 K6 ~9 ^( H- z( ~6 ]/ w/ J$ x) `

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




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