嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 ?0 w3 v8 F6 ~4 Dmain文件:
4 n2 M# l: V' E2 f6 s3 ]1 \" P8 Ainterrupt void interrupt4(void)  
! i4 ?" Y6 |2 R( g5 V& l2 E{4 t/ d5 s  D7 }' T/ i
  Uint32 sample;
4 j# n2 ~+ H$ N$ {) y
' x* t/ ?! b  A6 g+ V7 H$ ?7 n8 K  sample = input_sample(); // read L + R samples from ADC, l+ X  Y( n! J! Q# T2 ~
  output_sample(sample);   // write L + R samples to DAC
  `4 z9 x0 F! K3 v  @  return;
/ n7 E$ ?* T  B! P* [$ G9 Y# `) T1 S}2 H9 {" S3 q! Q% n" z$ |
5 V, b# ]2 K; S
int main( void )
+ {( f7 \+ `. K0 r% R{2 O- o0 s9 L+ P4 k4 R

! o/ g; j) {" d8 K( I  w4 D    /* Initialize BSL */# a0 X* Q$ T, `8 f
    EVMC6747_init( );6 Z5 p+ _( U6 ~( ^+ ~) g% s0 k' E, O
        /* Call evmc6747_intr function */
4 n/ X- G% J' x& s, i    aic3106_init( );: c1 @+ f' d' d& l7 u5 Z& _& w
        while(1);
$ v+ y' Z1 d' x}
$ E5 d& s& Q4 R
! Q$ D4 ^$ J3 U- M$ ^4 D7 u
3 c7 F% K- J  z2 i+ maic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 H. g: x6 U0 t  Y2 Z/* Initialize MCASP1 */
9 K5 Z1 J# n5 x6 m3 R( L  J    mcasp = &MCASP_MODULE_1;
, Q2 A- u6 T3 ^' Y$ \+ z+ B7 d1 Z    mcasp->regs->GBLCTL  = 0;       // Reset0 {  }/ E; u4 L$ i9 U
    mcasp->regs->RGBLCTL = 0;       // Reset RX
$ M$ @, n5 p0 w3 e5 V9 D+ ^! K& F. [    mcasp->regs->XGBLCTL = 0;       // Reset TX
/ S4 ?% l: P% y9 l    mcasp->regs->PWRDEMU = 1;       // Free-running) c" t8 P; ?/ E
   // configure McASP0 receive registers  C1 h' q3 M5 z& R! J
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used! ^4 `6 H' g- V6 a1 J( |
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 B- b# G$ g$ m4 V& `; e
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ E0 Q$ W/ Q/ W. Z. }  _5 A4 E    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' D7 G' W% e" _3 @    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
3 ~( }' A, h  J5 t1 ~    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 J; r$ ^' t: `! U  ^; |4 {2 E1 }    mcasp->regs->RINTCTL    = 0x00000000; // Not used
( O+ v" ^9 l5 r: R: q    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. w. h( o! v- y& _

1 x1 q0 K. z+ g' c! [' s+ I) e4 X' `    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used( a1 {1 }: g) b- ~: z3 w8 Z7 n
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- ]& C% O7 d$ t, x
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word- U# [$ v/ R. P/ n' |
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16+ m  }% t8 z( s' F- N& r3 X! Y
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK9 P7 j2 r1 X5 W9 m0 {& H
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1  s9 p+ x! r& d) [5 N) a( L
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit& Q+ ]" x; q1 J/ v
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 N9 R" v/ P5 ~5 U: {
" \, {1 h% O/ T7 @9 c' s    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN: t! f6 k  f, O5 g# a* g) Y
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
% t+ m( `+ M  s. F6 W  L    mcasp->regs->PFUNC      = 0;          // All MCASPs/ `# }, q7 H$ F, k0 O
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
  K7 j- L& b9 |8 y$ r# d8 g& D2 k* y4 [, m; a1 m
    mcasp->regs->DITCTL     = 0x00000000; // Not used5 x, I) A# s5 m" I2 h  H
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
+ U$ }8 s8 A! r# A: _    mcasp->regs->AMUTE      = 0x00000000; // Not used
! T8 I& H+ g6 F" o1 R1 M8 ]
0 I8 G" T+ o3 R$ J, F/* Starting sections of the McASP*/- S+ \5 F  q! @6 F0 ?! t$ g
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) @2 }" O( E0 l* d' ], @' `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  4 F/ Z1 o8 c9 k: o
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 ^& y) R3 S# F* p0 `4 t    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );. Q4 o1 D4 i/ R" J
+ M7 T  u) s0 ~! k' q
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % a/ {4 A7 s5 D3 Z0 A( |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& L8 \3 I$ S" @: j. U
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; - K' R! e5 h/ L# h4 w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! {& F9 h' z2 O
% l/ Y4 J  [- a6 N% J, e  P    mcasp->regs->XSTAT = 0x0000ffff;
7 r. |0 h1 f5 X7 A) c    mcasp->regs->RSTAT = 0x0000ffff; 2 S  ~9 W6 ?3 l! H! w8 m& y" \7 @
5 Q# V  ]6 o5 V) Z6 ^9 T$ G
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;1 ^. Z- F( R$ f" T. D* Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ n8 b( o0 S# s5 P    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; " j& A; U; I- [+ A# r3 v5 y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );" H, E9 B7 ^$ ^8 |, C% n5 C% B
; c6 Z9 [& H- s1 w' z# @
    /* Write a 0, so that no underrun occurs after releasing the state machine */+ _( K) G5 f7 \. @
    mcasp->regs->XBUF5 = 0;8 M$ u% m- }' X2 k3 x) N  k
    mcasp->regs->RBUF0 = 0;, s9 o) U. @7 X5 T

5 l% ]% d- B5 E    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 1 G( u% x" O+ y, O" f" W- |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! ]: K5 y+ R$ N$ m3 Z1 H& }# ^" c
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' ?- e* x1 M% E- P    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
  {# ^' v0 h) V6 \
& Z2 e8 V# ~0 [( a* p1 K2 |* p    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; + \* P  I6 X' [/ |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' y* G+ N1 Z1 X* `    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ E  y2 o  |$ s7 o    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );$ i6 N; s) ?, B7 d) [

, Z3 ]) e& t# E' u    CSR = 0x0000;8 L7 `/ M+ w5 q7 @6 t* j
    INTC_INTMUX1 = 0x3d;# A) h2 r8 G* ]
    ISTP = (unsigned int)vectors;
% X( }& b, C  N0 y" y+ H. g    ICR = 0xFFF0;  
9 O: e/ e& c$ j  f( I0 O8 A4 ~    IER |= 0x12;  # f( R" E4 p" o. Z) c! _
    CSR |= 0x01;  ( ?5 k1 x5 c8 ^
" T1 i. G$ J+ D  t3 F3 Q$ \8 Q+ c
. a( L. f1 R$ ^
4 G. T/ Y6 ?$ ~* Z, e/ C) }
还有就是两个输入输出函数:5 [5 p& @% A  d/ o, f; U; [
void output_sample(Int32 out_data), H6 }. k/ V$ m! n1 x
{( j. O& I2 w2 {- \& Y( Q5 \2 c: c
  AIC31_data.uint = out_data;  
  ?; ?+ R4 w0 L  MCASP1_XBUF5_32BIT = AIC31_data.uint;. J$ z( @2 T( ~( o4 P
}
9 I2 K: v. ~7 Y& E% |1 K, v" I  Y/ _* ?# M' ?. S
Int32 input_sample(void)
0 h1 @- y8 P, O  g6 c; v{  
; e* W" a: g0 k2 D/ k  AIC31_data.uint = MCASP1_RBUF0_32BIT;
- ?& y. K- h" l  return (AIC31_data.uint);5 p3 ~  j/ O# d& T: j- U
}
& R0 s! d* z- U2 s8 p9 ~+ f6 Z9 W; n, e; h+ L& ^& @

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




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