嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( n5 g' u/ @0 omain文件:# ]4 g/ j0 a$ A
interrupt void interrupt4(void)  6 d# B. ^" |' g# v) V; R% j0 v) o
{. w/ [) i) p- N3 s5 `
  Uint32 sample;" t% t8 O: N+ f: O* p& A
! r6 b& g+ i& G$ U4 N; p* Y1 x
  sample = input_sample(); // read L + R samples from ADC4 M/ R" v1 t) C. N& v
  output_sample(sample);   // write L + R samples to DAC
/ X, ]$ w- K1 `! `0 s& G4 x  return;
: j; j1 O: |, r6 f% N}. K% d, e  x8 g7 u+ C

& n9 q2 M% [" q3 qint main( void )7 u) n1 {, z$ Y! U- [5 B- A
{
0 ~+ K& n  G; @# g5 F+ J* P# c( q' {& M2 K9 ?$ \
    /* Initialize BSL */
3 Y" L7 _; _5 j1 f0 E( L# P. Z6 H( z    EVMC6747_init( );1 A, s7 y; m3 f$ D) D
        /* Call evmc6747_intr function */
! h: k, w+ t! g3 ~$ g5 v8 L- h* n    aic3106_init( );
0 d* k6 i. g% |1 v# F1 k: X6 C        while(1);
- ~$ ~7 [$ m+ L1 d9 u3 |4 _}6 H2 k7 G" d6 {- p! d5 J2 d' L
/ J! d$ ~- Z+ o4 w3 l8 M; f

# `8 Y) [) E6 P  \; Laic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题# }. C+ k5 b- V, P
/* Initialize MCASP1 */
, J! z2 C% I1 V  V( \% \    mcasp = &MCASP_MODULE_1;7 \1 c# A& j. g% U- V; V" k4 |  l
    mcasp->regs->GBLCTL  = 0;       // Reset% K9 ?5 O4 t7 d
    mcasp->regs->RGBLCTL = 0;       // Reset RX
" O5 h+ K* Q& H" f, L% S0 L7 J) O    mcasp->regs->XGBLCTL = 0;       // Reset TX! ~! a" A) E3 h  a1 L- C
    mcasp->regs->PWRDEMU = 1;       // Free-running+ `) [! X1 @) Q, L
   // configure McASP0 receive registers
. r/ @- U* t2 m0 |# v; l    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
, A1 \0 R# v- N! J  M+ u4 l. i  U9 O8 `    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ X, F6 E( P; g1 a* X    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' y; x1 J& _  @' R    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)$ _( q8 A, X  q1 I/ m0 u
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)  A  @( C# {* v+ X! P1 o$ ~. M& k
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1: ~8 K- S: o+ Q6 m, Q' y2 f
    mcasp->regs->RINTCTL    = 0x00000000; // Not used, v! k. ?( |) U9 y" P, F! A
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 s, }5 D# i8 @) I- _- t% R& i- k
' V: w- G' F2 Y# P7 l5 K( y) V7 U    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used5 ?# @6 W( ]1 |
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 r  \. z* ?7 I* q' y& |
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 R( T' C9 O2 l$ f    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& j/ T+ {6 r2 R; X) E    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK! k* |) w( c) ~
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
; }+ K4 a' F! |: ]" o7 P. Q    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
/ o7 B- T1 g0 ^/ O8 ^' a    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: H+ p7 w$ I& Z4 u  c

& ]9 R5 ?1 t+ o. f    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN7 ~4 j8 y5 V3 J+ e5 ^
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
) Z, Q  f! Y5 {    mcasp->regs->PFUNC      = 0;          // All MCASPs
5 N' `1 T2 @" w4 x$ ]    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1, A: m  @" q0 x8 u/ K

, g. t# M  @" ^% D! k2 `4 C: a    mcasp->regs->DITCTL     = 0x00000000; // Not used, \  k/ P- q0 t9 @) w! }
    mcasp->regs->DLBCTL     = 0x00000000; // Not used; Q# R; x2 Q" {
    mcasp->regs->AMUTE      = 0x00000000; // Not used  a: y; Y1 t$ J9 {7 `
" f& r/ \) l$ J, N; s7 ~
/* Starting sections of the McASP*/
# J" k: \  ^" P; x$ N/ y; W+ z    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; & T* n: m/ h8 i% ?7 B, ]% b3 J3 C
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
7 M0 [- `8 n0 e8 s% I1 P6 J    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / d+ S4 m9 ?3 o4 i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 @9 j: n/ _- ~, u% U+ l2 }5 m9 J8 p
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( k: j8 x8 {  }( Y7 p% k3 t    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! }: d# f) A$ {* `( |* r6 V    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: A9 @, Y4 D. L) ?' U) R6 d) d8 l    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; j) l- _+ k2 r+ ]6 e: O$ i# d) v4 t1 Y5 V& t1 z/ ]
    mcasp->regs->XSTAT = 0x0000ffff; - y9 a) A- W$ y+ x, J0 k
    mcasp->regs->RSTAT = 0x0000ffff; ) C5 k1 t4 w1 l* j7 b9 f
; W4 U. ]: A: j3 w: L1 n) j6 ]; _* s
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;$ N: ?5 s3 }1 U& S5 G6 u
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, o( I% M# q+ A( o' \3 T    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: V) Q) H0 O+ I    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );# r4 V# v2 S/ |" H
7 W9 f0 S# M% [* X" n
    /* Write a 0, so that no underrun occurs after releasing the state machine */6 c1 z; B' T9 _/ r: M: _9 Y# B
    mcasp->regs->XBUF5 = 0;
/ q1 n4 f% @6 u; f7 u0 {    mcasp->regs->RBUF0 = 0;7 V- Q% c+ I  K+ }+ s$ e

+ g3 Y4 U5 v+ Q' i; G0 t    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 D+ X2 {* C0 _$ I0 {* q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 i' M% l3 y4 p9 [: c    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; + g! D0 l4 S" P7 }  c; z9 r
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
/ @8 u7 w! @: `/ R( d' B0 q
1 P5 Y3 s& }3 ^# h: _! {    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
4 l) k, E4 }) z5 z# j% @    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );& c' u1 E/ u6 `
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& G" w& s0 G5 D/ ^) a# g    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- C# w# H& g! s4 W- j8 i* @+ m5 r6 b6 _# b1 j7 ^4 ]0 ^) \6 v
    CSR = 0x0000;
3 L# U% {% _0 z( q    INTC_INTMUX1 = 0x3d;" s& E+ Y2 S+ [# U1 [
    ISTP = (unsigned int)vectors;
: K! T3 f3 ?$ f6 H& M9 P% y, O    ICR = 0xFFF0;  
3 |0 U0 h7 A2 `# |/ O  |    IER |= 0x12;  8 q/ F; |' Q5 P, D" }4 a
    CSR |= 0x01;  1 N- w- p, C3 f( X1 i

+ l5 |+ d& A0 L9 i; E3 R& Z) C) E4 n1 o( G$ W* \# n$ L1 e
- r0 M3 I2 P& q/ m  w( E' q# k
还有就是两个输入输出函数:
- H5 Y' J. s' X- a8 a9 w! bvoid output_sample(Int32 out_data): N& w6 Q) ]- H1 Q
{
- E6 u- C) c2 n2 q5 x$ j  AIC31_data.uint = out_data;  0 i9 R9 d7 t" c. M. T
  MCASP1_XBUF5_32BIT = AIC31_data.uint;4 x, @% B& R6 b# X
}
) O, F* Q7 K# c% z' G+ m. k0 Y5 m: K2 C$ U2 Z
Int32 input_sample(void)0 h' v) u: |8 z2 n' j2 R) M
{  : b* ~7 {* `" k1 Y& P: D
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 K3 n% i+ j+ G' u! T  return (AIC31_data.uint);
9 i0 N3 G) H8 s* o6 A}
5 h  |" l( \3 S9 m+ w4 V
- w$ W/ ~7 e) m1 `
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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