嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 `6 X5 B6 h  s2 R' n- ^main文件:
/ M4 A6 s& F) m5 Z5 ~% b( c+ c( Ginterrupt void interrupt4(void)  
: S9 R8 l9 X' l; R- |5 S1 z{
5 Z* _% ]' Q* D# F9 i  Uint32 sample;3 I# z( n2 K; j% k: t. y: H
1 {2 \# {) S# l6 ]! b; y
  sample = input_sample(); // read L + R samples from ADC9 O6 n& R5 N% ~: ~
  output_sample(sample);   // write L + R samples to DAC + \4 ^2 t! z) Z, W
  return;. ?1 O* U) G1 |- t2 ]# O4 X
}
: K: Q( u1 l  E' G- ]
- c& ]7 ~1 _8 a( w3 U5 `$ L+ Vint main( void )
( R+ {$ k& s8 q% e{
( H9 O- d: }3 x' m/ a4 k0 k& v* Z5 _* k. E6 M9 Z+ ^1 N
    /* Initialize BSL */
8 z/ X4 v2 T0 w' h1 r1 |    EVMC6747_init( );
, a& n5 m  T7 `" H1 F& l        /* Call evmc6747_intr function */6 ?& E# W' {; _2 m2 |
    aic3106_init( );
; E/ E: e( }$ q. n( O/ Y$ @        while(1);+ t: l5 ~% y9 c2 U$ a
}
$ w. j$ s: @0 U3 m% t; e9 N& t8 M; ^& n
, N5 w: H) v: @
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" h1 d' @( U& R/* Initialize MCASP1 */! O$ ^" c  b- G2 }, u4 K2 [
    mcasp = &MCASP_MODULE_1;
, V9 w5 S7 G7 |    mcasp->regs->GBLCTL  = 0;       // Reset/ L4 X1 ~4 K  v! H& u! y
    mcasp->regs->RGBLCTL = 0;       // Reset RX6 @# }% P8 o$ R% Q2 `, Z0 ]6 u
    mcasp->regs->XGBLCTL = 0;       // Reset TX
( d' ?  ^% n* U7 A, I" @6 t    mcasp->regs->PWRDEMU = 1;       // Free-running
+ A0 B# w2 d& a; {   // configure McASP0 receive registers
1 B- L9 M7 w. V! f1 P0 q; z    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
$ D* ?# S% `6 I8 z+ y+ X0 {    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* g8 `$ a: H( j$ \
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word: |3 B9 ^% V4 E; g, Q) s, Q& j0 C- i
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
1 d" E' K* m/ {$ [+ s    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)( n% z' k$ p  E9 ^1 E( d" X8 m
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,11 p/ ^! H' U7 D
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
6 _3 Z+ n- R8 k$ G$ Q    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 R) q$ R* J( l. R1 ?
# C4 }2 l% W9 C, C7 I' v# t2 b    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
" G9 h& [4 r4 s7 q& E; h    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: j6 P: |0 z9 ^1 a! ^/ |! }( l/ y8 b# x
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& ~  h; a1 S, m5 y    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 {# k# Y1 U- O% J* u  j
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
, a% q8 n% h8 Z* U    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1/ {, _) |/ }* V& u" R: t3 m8 c) Z
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
2 P% `! ~/ V7 k) C5 U; Q6 [# E    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ t, S" T7 c0 Q% h/ e) p% n
, t: [6 t8 Q+ E: s
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN2 `: D1 L( {  S& g$ V5 C8 F. r+ F
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT+ ~2 e* d' I3 r; K
    mcasp->regs->PFUNC      = 0;          // All MCASPs6 x" w' T( Y: F9 W1 p3 `" k. ?
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
  q0 ^+ D# M, |
  c1 k' o; R' u, P    mcasp->regs->DITCTL     = 0x00000000; // Not used( f$ K2 `7 J0 f$ P9 o
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
! H; I& G3 k. [% w4 e, L5 G    mcasp->regs->AMUTE      = 0x00000000; // Not used
: m5 [1 G7 t5 j/ L' M
) n( i3 R2 b; r/* Starting sections of the McASP*/
( y6 Y. W" M+ C! C5 s, G2 l( ?/ @3 F    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 W  h" I% I+ S7 B0 z    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
# w; h5 q; n3 J5 z, R    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 D8 f" k4 z: [5 c+ M* @6 T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );7 N+ s% P0 H5 o4 L

- \% ]8 `% i. {  k, B; ]    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % z- c' y  f1 m. f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" ]$ A2 i( _% k0 x: H/ X. {    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 Y; Y" ?% ~0 o1 @3 D/ L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# N2 w! c2 X: b- K' z- R# y

. x% a+ w# Y" k2 p    mcasp->regs->XSTAT = 0x0000ffff;
- O3 I6 n( t( W9 M; ^" n2 M    mcasp->regs->RSTAT = 0x0000ffff;
$ X! t1 j- T+ M8 ]! ~6 d; X9 h: ^1 G
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;9 k' D/ k/ V) y0 F! S5 a
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );! o6 Y* O* i" |$ F; z( n1 v7 d
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 G6 f- E# Q  c4 k, j6 t! a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ G* w0 n) a; g* ?
0 L9 P* d  R3 w" X' ^5 }
    /* Write a 0, so that no underrun occurs after releasing the state machine */9 F  X4 ~/ O' S5 L6 P; [. i
    mcasp->regs->XBUF5 = 0;
  [  b! x" k/ m, E    mcasp->regs->RBUF0 = 0;
0 I8 {! U  g: G! ?% }( n$ ?
& d6 n+ t* ?" i( }7 a: [    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ( d/ p+ i* L7 A) [% d5 ?
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" j( k' g, A' v# Q1 \0 t# g) F: o' N    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, v9 Q( }1 G: g6 n3 G; O. B# B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );$ n# ^0 W: K$ z% o
, q$ H% r5 _9 m$ K  V
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 l. [  G* g& q( G- C* w1 y' M$ e    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );  a. y5 i" F* z! w
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; u( x' d2 ]7 A% g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- s+ |; p9 w! n. x- ]$ d6 e0 z# _1 T% F
    CSR = 0x0000;
  a, }# ?9 k; G, H5 A( x/ x# i/ h    INTC_INTMUX1 = 0x3d;
8 Y7 T+ a1 J5 G: G  {8 P" k    ISTP = (unsigned int)vectors;
6 j& ^% T. f5 e* T8 R0 z    ICR = 0xFFF0;  ( R, `7 B0 ?" P: I. ?
    IER |= 0x12;  
9 c" c7 e9 E# s# p3 t/ s7 _    CSR |= 0x01;  
4 V8 i. z/ O# p$ e5 i6 Y4 \- Q) P( r/ y! W/ O2 w
; K7 v3 @: B4 s( X  B

& n$ M" Y- {& `( [' h还有就是两个输入输出函数:
% \  A& E9 a& jvoid output_sample(Int32 out_data)4 J: _3 {5 u0 ~, Y( |
{. j. c$ b! R$ i3 Q5 Z
  AIC31_data.uint = out_data;  
' u) `4 H) N, T- G+ r  MCASP1_XBUF5_32BIT = AIC31_data.uint;3 V/ L6 _, q2 t* s5 w. H8 M
}/ f7 q0 c1 j5 ?

4 j. k: f3 z6 ?. b& b( i# eInt32 input_sample(void)
! K) p2 {" m- J" ^9 @' P3 X{  
  j5 r% {0 u: E. u  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ x3 `( T; Z; m0 K. w
  return (AIC31_data.uint);
( m: D3 s6 K) o/ k0 g: D}
& T, r! G' k+ a, n) c: w1 v4 E0 F* u

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




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