嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 n  B0 a% Z( d7 p2 Z  D. Rmain文件:2 Q/ n8 d, Z# x3 ~* @* b4 [) {& e/ K% ^
interrupt void interrupt4(void)  ) i; o2 W7 B/ B0 P6 G8 G
{
* {2 I% _& C6 F. j9 j& X  Uint32 sample;
" s3 I! |5 S% l' J  p
6 T" t4 \1 I% V% t7 u% ?4 g& N' Q  sample = input_sample(); // read L + R samples from ADC& j2 w! R7 Z* q
  output_sample(sample);   // write L + R samples to DAC
+ r7 s+ Q# H6 F$ U, j5 u; i  return;% m5 U, m9 G* T' K
}
" e2 d1 Q, F' u$ ~
9 s- R2 j' }# Z* Wint main( void )
4 \1 p5 E  e! K: j{8 _3 y0 I% X5 U+ W

: M, q. u; P' H. w    /* Initialize BSL */
9 C. x) w( N  }$ P    EVMC6747_init( );& R+ J( n: Q. n# X. `( Y! O0 a1 p( {% x
        /* Call evmc6747_intr function */1 w7 q' R! d2 y
    aic3106_init( );- {# _/ T1 G, Y
        while(1);! T  {$ l6 g# n' [
}
5 e9 ?- [2 W1 C, _  O% g7 b2 }4 M+ D9 P: I0 _6 a5 k! M; {* v

$ C( J* w2 B: daic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ g0 d2 p' |+ D' P! c; M0 j/* Initialize MCASP1 */. L7 Y' a" ^) Z5 \! c6 t6 z$ X! J
    mcasp = &MCASP_MODULE_1;
7 D9 [) G0 O" j. |+ X. \+ `- R2 `    mcasp->regs->GBLCTL  = 0;       // Reset
* O! x# H7 q+ s/ [. d! Q    mcasp->regs->RGBLCTL = 0;       // Reset RX
- B0 g) f+ M5 A! G- h/ i    mcasp->regs->XGBLCTL = 0;       // Reset TX! R8 O7 Y# _9 Q& _  X2 m5 C
    mcasp->regs->PWRDEMU = 1;       // Free-running
( e+ W/ U; b1 T% V0 i* F   // configure McASP0 receive registers
1 I0 t  E% A2 m9 C6 q' `+ y    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
2 o3 \' ]  o  Y( ]. O    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* I3 W$ z% p) S! E% a% X    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word) K: z2 [( _# l5 @
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 F' o0 `/ O/ d$ g6 D  B
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)! k1 O  e, }' b1 I# a0 b9 e
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
8 T- a' e" J/ z5 Y% R    mcasp->regs->RINTCTL    = 0x00000000; // Not used
# N0 B; ]4 }0 B) s( M" O4 m    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* M1 \0 _! b; U% k! z& Q7 _9 U) H/ `" S( a8 C' z7 P
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used- f2 P$ Z, U9 ~( F  w
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# W' P% R& c* B( H( d- [+ S    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 y& d) ]% s: Y. R' z4 x    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 h+ y4 V. \7 c) h    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
6 ~/ x/ \0 }0 W8 E2 y! m9 z% ^6 ]    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1/ f) @: U* k, d) T/ R
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit- L& e5 M* ]4 u+ @! l
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! G+ e4 U+ ]( J' ?7 W* D' }6 R
- P5 h( o+ C. V1 U! p    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN; i& O4 c  B; E( W: l- o2 T0 b
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT/ `) c3 Y5 o% }3 K
    mcasp->regs->PFUNC      = 0;          // All MCASPs
5 ~% R! Z( v3 k    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 ]' n; H8 y6 k! p. `) g" @" ~* F. O7 F# W3 G5 G* V" J$ K. [
    mcasp->regs->DITCTL     = 0x00000000; // Not used  V5 b( j8 t* [
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
# a  v  P7 d+ K. A    mcasp->regs->AMUTE      = 0x00000000; // Not used! l) X) t& K- w7 a# d
0 e# ?* y) @: J5 Y
/* Starting sections of the McASP*/0 K  |8 G2 G4 d8 e7 ~& z
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; : t& \' I0 b. v/ R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  " |- D5 k+ ]& S/ W7 E* Z
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
: V8 y0 i# `% O* }( A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
  m3 v. [. @( ]! {8 p8 f' X6 X" f& x1 b, s7 z9 S$ k) r7 p* g
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 4 e6 Z; v+ t" U5 T
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ F* h" ^7 k. j* c; Z* f/ D+ N    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
6 g  N# {8 r+ F7 g    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
. w, _- \8 z( s! K. ?6 d
' e; g) r; T5 b$ V# t    mcasp->regs->XSTAT = 0x0000ffff; ; h! |8 o# z7 f; F+ I" A8 n  Z' s
    mcasp->regs->RSTAT = 0x0000ffff; 7 E9 z: O1 V$ j1 N, N/ B

7 L- V/ t9 Q+ G* d7 R7 ]    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- q3 t: s& X% A7 H    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );8 Z! {8 M# {/ |- J" R
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& s$ X. ?3 s( q% {! _% U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );# @7 p( X5 L1 D. N2 R4 ^4 A7 ]
7 ?. N; L8 k/ R# c: `: n
    /* Write a 0, so that no underrun occurs after releasing the state machine */
8 W" @- ?) [7 o) ]: ^( ?# S* {    mcasp->regs->XBUF5 = 0;% S& v2 Y6 V) t4 Q
    mcasp->regs->RBUF0 = 0;
9 `/ g* ?) z6 e" M) D& i' @
9 L- f: [6 M' P: a/ x; C    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; * d# Q( y! ~# P3 l, o1 ?
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );7 @3 S  E" g  G9 A2 Y0 ^
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 l4 x8 G( U9 _% n$ S# I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );1 R/ n1 V8 B5 j; t! f! j" j

- q' L! j8 X  ~' ^& N" h    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( _% ]( ~5 E1 W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );! R- K( j' v: z8 n: h
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 4 G0 v+ H2 ]; c: ^  J+ }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );4 T" d7 f$ X( E: v' G
+ ~6 u1 v1 J6 H9 Y5 n
    CSR = 0x0000;, X7 M& z& r' f4 ]2 J
    INTC_INTMUX1 = 0x3d;
; U2 P- j6 y1 n" |1 H    ISTP = (unsigned int)vectors;7 j( E' }& C' u: F- e- {5 }$ O
    ICR = 0xFFF0;  
$ _7 w6 B/ `% Y7 U5 v. z8 G    IER |= 0x12;  
/ c% E' R* T" v  W9 ?3 p    CSR |= 0x01;  4 I' I9 N! j  X0 T2 g8 ?
$ q; s" [' O8 z; q4 u& K; j
% B  i& ?& {1 E/ S6 |1 j

( w! P  [: q& V1 A2 x还有就是两个输入输出函数:
. w. L3 q& Y! y7 e7 H2 ~7 q) xvoid output_sample(Int32 out_data)6 J  @, V5 Y5 k" n8 ^! V  l' M: y
{% {/ f, g% X9 n4 E  n+ Z# }
  AIC31_data.uint = out_data;  
' b) {3 K6 ~8 G" g  MCASP1_XBUF5_32BIT = AIC31_data.uint;
- S- Y& L# y* g9 n) l- ^}
- _3 x; Z% l9 J5 R) y7 t( z% W& a0 _2 p; w9 g/ W+ y" H4 k
Int32 input_sample(void)
9 b% c) M( |, O, z. Q' k2 t{  
# d4 H3 [5 w- O' B4 S4 z  AIC31_data.uint = MCASP1_RBUF0_32BIT;* B% ^/ j$ J' @- ]. A/ B
  return (AIC31_data.uint);
- u5 F9 S. ^( T( V}
6 V1 J) A3 Z" X. @2 h
& ]# p# Y- _/ W$ {" p5 @6 j
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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