嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ d( k/ {4 Y* D! |main文件:
5 z5 u8 `) h0 s4 b: c+ ?interrupt void interrupt4(void)  
* ]% ^9 ], G8 G9 q% ]  B) O{
- k; m5 u  J1 [( n  Uint32 sample;
& C% E/ c! e5 j. a6 P: j; v( O, M. y; A2 v3 z
  sample = input_sample(); // read L + R samples from ADC
+ }+ \* c: V1 t  output_sample(sample);   // write L + R samples to DAC + w. v. p6 i9 A: n: T$ ~5 P3 w. J5 q
  return;
. l" f6 T6 J% [. y/ t$ s" x}
5 l7 [1 r( X8 T( h! |+ _) J" y6 w4 m( y1 y
int main( void )
4 V- f7 e$ w+ k# K8 |  K{( {9 e% B& a6 ^$ v2 A

6 u3 z- l9 v' Q' H1 d( U6 f+ t    /* Initialize BSL */
" d8 Y3 P4 _  Y* T    EVMC6747_init( );1 ?) Y; w$ r/ K: I# {
        /* Call evmc6747_intr function */
! `' D" B5 D4 r+ T* L/ E    aic3106_init( );8 r* o' y- t& O) R! v
        while(1);
; v6 k1 ^6 R, B. N}
2 p8 Q( Z5 k/ _; P% y6 l3 h4 @; t  Z% \* n. d  ~
+ k* [# q7 t8 e& l8 l
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ {, ~, @* m3 A! B- I  T# m$ _/* Initialize MCASP1 */
' D! U1 B4 W5 s) F3 }    mcasp = &MCASP_MODULE_1;' [) ?- _/ ^( w2 _" q/ c
    mcasp->regs->GBLCTL  = 0;       // Reset
5 U9 E7 k7 [, y' m    mcasp->regs->RGBLCTL = 0;       // Reset RX8 p8 y& O. P' R% J' J2 F
    mcasp->regs->XGBLCTL = 0;       // Reset TX
) K+ T1 N! J  n/ r, \    mcasp->regs->PWRDEMU = 1;       // Free-running! A% y3 Q2 l4 B* }" o: G
   // configure McASP0 receive registers
4 K, J: N) h3 E    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
  v: u- w! p  w6 t" j    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 a  _9 U7 z2 I
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word3 N* h# P! p/ H/ x
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 H& {( o2 K+ E+ Y! ?& H
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
* j) U$ D) h% w4 [) F6 I" |" K% e    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
  H: I& N: d- s( |    mcasp->regs->RINTCTL    = 0x00000000; // Not used
4 M: Z% g$ N, ?1 E+ h    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" J" F6 X  l0 V% `1 t% ]5 p; m* m6 K  S1 v' _: j
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
' x4 b  F3 |0 ]7 H    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 }. ?* a) o5 k' ~$ g( s' e; G. t    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& L$ }& l1 B" @7 @) U) J( }7 u    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 e$ U0 y. X1 A; Y8 W    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
1 M, ]8 W, i+ s8 u" a# I) G& y7 M    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
; F. g$ K3 Z5 K7 ]+ B    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
! s# Z: r! d, b' v7 T3 U4 c    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ I  }6 R9 F: v  ~
8 P) s  S0 [) {- M% R' q) K6 J0 C    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN' G% q8 n! j" r/ n. o5 s
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT. [8 N( R9 P% r$ S3 k/ a8 D( u4 ]
    mcasp->regs->PFUNC      = 0;          // All MCASPs
- X5 T0 O: V/ d! Q) s5 I0 n    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 Q' y$ G, m8 |$ U5 J
$ G  B4 A4 S* M' u8 B" Z    mcasp->regs->DITCTL     = 0x00000000; // Not used
) o' O* {" W3 A+ V    mcasp->regs->DLBCTL     = 0x00000000; // Not used" j0 b2 G: p4 V  t+ _$ h
    mcasp->regs->AMUTE      = 0x00000000; // Not used9 G( a  ^# }9 y4 N* f! d
7 {: U! I  z" H$ o3 ]
/* Starting sections of the McASP*/( L- R4 q% N" R* T
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; $ C- B$ B- z' S% u9 d; C/ v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  , H3 E+ Y, h+ z
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
8 e/ h4 B) T! W* p9 v" Z+ g" o    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );, H7 v- Q3 K7 u% ?/ W* U

& |$ W, g" L# @0 a    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% v# |. f7 K2 Q7 |2 ]1 ?    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& W- S" ]( m+ n2 @* ~1 s
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 D2 Z: C8 b6 g% z/ L* z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" `1 q1 b, i& O1 x+ v' a6 Q
# u0 c( P" z' h" d) h. U" e    mcasp->regs->XSTAT = 0x0000ffff;
/ M& N) b# J. |  P# d# ?/ j    mcasp->regs->RSTAT = 0x0000ffff;
( B& s: O: _/ W* D! c2 e7 r0 J. j( B' I% q6 }
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;" c, R& f; o' t/ j$ v2 m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) f* N/ f5 _7 O3 Q1 @( @
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& o4 L: x+ g& X% A# k    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 Y+ [$ |4 Y9 y; n( h
/ z5 l) Y% |6 Q/ w    /* Write a 0, so that no underrun occurs after releasing the state machine */7 e* D0 P; H( H# v
    mcasp->regs->XBUF5 = 0;
1 z6 p; H$ L6 a2 {9 v: I3 p    mcasp->regs->RBUF0 = 0;
: h& O/ o- X! e+ U: J* {+ [! A; q; l
7 f  S! M- E  J: V1 w, ~4 H    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# u  ?3 o& F) c2 F( _1 ^    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 ~0 G3 z. D( \# B' @/ `+ ]    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' O5 l& L+ h* V4 Z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 ]2 S1 n- P8 U  j
; J( ~3 \* o0 i9 n  \
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ u2 a+ }1 d8 f2 Y5 j# A    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, ^) V0 w9 o  A2 F' p
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % d) U' B. v3 _# H1 W! l; x
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 {; `6 p% Z! M7 [
" b% a; a; u4 n7 i    CSR = 0x0000;
: b, Y& v5 ]2 x" U- k0 P    INTC_INTMUX1 = 0x3d;3 u6 Z  M- c( a3 q  B' w
    ISTP = (unsigned int)vectors;
: W7 h* V( ]3 M    ICR = 0xFFF0;  
% @8 n/ ^" @8 \. U$ b4 I    IER |= 0x12;  
2 g3 q  [! h$ d( `1 i0 h    CSR |= 0x01;    Y, M: s& {7 z- i9 q

9 v: g( D1 q  j! }8 ~1 I  k
* @& ?: @7 |" m3 R, w/ ?
% `9 E1 x4 _. x还有就是两个输入输出函数:
4 {1 O0 D# [" P# ?9 kvoid output_sample(Int32 out_data)
* M+ k$ @: ?. e7 j8 k{  D- O; k3 _! k0 S5 f6 t
  AIC31_data.uint = out_data;  
! l  _. [" p; M  MCASP1_XBUF5_32BIT = AIC31_data.uint;
) |# ^# v' U# J/ D6 N}  d2 z) I$ C" d( [" d

- _8 E/ F8 Z9 j. B6 Z) tInt32 input_sample(void)
' S; U. s6 ?3 l0 H2 z{    O+ T" G# F, A: u0 D9 j
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
' x# j8 @. Q" L' [: T% [  return (AIC31_data.uint);$ s" U- S4 D6 \1 y8 }1 \
}
! O: L& y& l. Z& v& }' ~( @6 ?0 G& i1 a0 b6 o- b% `

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




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