嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* a2 c/ t# G$ O# c! H  K: x& W
main文件:0 M. F6 G# K  C) E  G% M5 p; _% ^
interrupt void interrupt4(void)  . P% e3 p" V& V. \$ r0 c
{
$ I0 V5 I" j6 r: [" m: p  Uint32 sample;
/ `1 a' _. s* H( S9 c& A5 ?/ D) N: G
5 J5 g+ [. Y8 Y& `- r  sample = input_sample(); // read L + R samples from ADC
3 B% i* N+ A9 d# J9 ]7 d  output_sample(sample);   // write L + R samples to DAC 5 {9 t: r# M" k2 p+ t- K& M
  return;* f: S' r# U" S" e) P
}, }7 D" X  ~9 G5 r3 ^7 d

% k) I* g$ D) \int main( void )
$ L& N- J3 e+ @+ p# P1 a{* e7 q6 ?  g8 N8 l

4 Z+ D; L9 y4 p1 A" N3 S    /* Initialize BSL */
, N( [* l" m8 M3 H; p& v% D' _    EVMC6747_init( );
0 \8 h* ^& `6 n3 D        /* Call evmc6747_intr function */# H. a9 C: s! T
    aic3106_init( );2 @8 I1 h# e+ I* W
        while(1);- m$ x3 ]/ E6 S. t
}" `: i4 z) |! m% [7 r* _

7 m" ]% L' d+ u/ H# p- a, Z
) B, A1 U; r0 h0 haic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
% D2 z& H1 |2 g/* Initialize MCASP1 */
! q' s) {$ ?: R9 I2 x) q0 m; e8 E, V    mcasp = &MCASP_MODULE_1;
+ F3 Y9 K( O- {5 U    mcasp->regs->GBLCTL  = 0;       // Reset: i1 _6 K2 c+ S8 q
    mcasp->regs->RGBLCTL = 0;       // Reset RX
7 Q6 C  y5 e' c% I/ d0 B; c    mcasp->regs->XGBLCTL = 0;       // Reset TX$ j5 V& L7 @7 k7 i, @" \
    mcasp->regs->PWRDEMU = 1;       // Free-running/ o$ ?- `" R) i
   // configure McASP0 receive registers
5 V; I4 ~( y4 ~9 g% ~' m    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
, |" O' a7 ]9 N* F' F    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! t5 ^4 X/ v0 \/ N; p8 J
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
2 Y% N, P% V: i/ E  k/ e    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
% b/ [( `3 t$ {/ M) B    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)" L: O9 P# |6 @3 P- S8 v1 @
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
. |. I6 H4 Z" @1 X6 }% n+ J4 Q    mcasp->regs->RINTCTL    = 0x00000000; // Not used( N8 @6 o5 C0 D
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ k" i- P4 k) [5 d: u, k0 d, K( k) ~5 E* b6 G0 D
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
% e4 q; |4 Q% s    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ s! n% W$ Z$ s    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 n; l9 [6 ^) a) o    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 P6 f: P+ V9 `- e    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
5 Q4 B$ L4 I' Z) Q. _    mcasp->regs->XTDM       = 0x00000003; // Slots 0,14 a0 E% h1 w. l) ^2 H( S! ~5 R2 f
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit( m* E+ }! _. U; Q  ]
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 ]. F" w* u' b
! Q' M* E0 D  \- c0 K
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
. q7 o) |; u( p) ~8 z5 D    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
- o$ {8 v7 ]+ C$ H: c$ L    mcasp->regs->PFUNC      = 0;          // All MCASPs  L8 e; U; f9 X
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' U) h6 d  Y7 n; [/ e8 K
; A  j5 m; k& K( ]+ [. Q    mcasp->regs->DITCTL     = 0x00000000; // Not used; |& X+ X  u, V' @' a4 \
    mcasp->regs->DLBCTL     = 0x00000000; // Not used) p1 J0 @9 y' Z' B! E# H
    mcasp->regs->AMUTE      = 0x00000000; // Not used' R: Z. a9 q- Q5 c. h; w

* U) ], W' C) Q. s/* Starting sections of the McASP*/
1 K8 {3 P' F- f    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ O) b0 |( p( c% n$ M; y1 u4 \    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
' }6 }' M# T2 J; z; d3 k$ G6 t    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * X% A% d& d- e# S6 D2 c
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );3 X3 d! p3 d; d# ?% K$ Z
8 I* ~/ E$ a3 H" \# }
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; - x; B1 V* K; G0 m& `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );( W7 {/ i+ o: x
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
! n% k& Z! y+ }% u& f0 _    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) o: e; F; D8 t; g- ?! d* ~

" N# I& a1 S! U5 z! s6 s" j    mcasp->regs->XSTAT = 0x0000ffff;
' r4 T; m: ~/ k5 A# B    mcasp->regs->RSTAT = 0x0000ffff; + y! }2 U# R4 i5 p3 k" j7 u

' P, `/ M3 f/ {+ L# D    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! R5 {/ J! Y. u/ H% F% [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 D2 L! w3 }( u    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ U; _- @$ w+ @$ I8 Y5 k    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );* G3 w) H" A2 _/ Q' w  W; u4 a, o* r

) O7 M4 Q8 [: Z8 r8 x! W    /* Write a 0, so that no underrun occurs after releasing the state machine */
9 E% s5 J  D' i5 I    mcasp->regs->XBUF5 = 0;7 E% d1 v* d; D, m6 H# K6 a0 a" m
    mcasp->regs->RBUF0 = 0;8 S9 a+ d0 l% P6 f

' F" ~( _2 d8 v8 [. i8 s/ K    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 5 D" Z! B' ~2 |% O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# a  }% L  x, h  I& K0 e% {9 x    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; . p& s5 G  N3 r$ o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
5 @9 G6 `" h" l+ J; C8 ~
% z2 d' J/ x6 s6 e    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 4 E  e; t& K  i1 p' {1 x& l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- j, h# N+ _" w' S" P    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; Y0 f  ~* t. t" W$ F    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 |) t: T- q4 |9 }. W! \6 W' }& N6 I5 g3 _
    CSR = 0x0000;8 ~, X: ~1 \0 {- w$ M  D
    INTC_INTMUX1 = 0x3d;
' e4 ^( \- c% e  ^! i& X    ISTP = (unsigned int)vectors;
; q" i4 x1 b! S7 M    ICR = 0xFFF0;  
$ z0 s' M2 n9 s, _    IER |= 0x12;  
$ f, y) N7 x4 i3 t9 @    CSR |= 0x01;  
) M( v8 N; @$ W8 {8 ]& T/ E
6 r- T- }. l2 h# c; ]! k; A# ]; e5 w& d8 K. {6 c" \; ?

& s- X- u. u; r  `4 l还有就是两个输入输出函数:
) P/ w8 t( e8 y) [: cvoid output_sample(Int32 out_data)
( y2 @7 ?7 V& G9 g{+ ]3 O4 ~, x# c
  AIC31_data.uint = out_data;  $ t. j% D! C! b( N% `
  MCASP1_XBUF5_32BIT = AIC31_data.uint;' u+ F  c8 e8 _
}4 I8 [! W2 i/ T, z+ H8 J' a
' |# u! O) }7 ]  @4 |! ]
Int32 input_sample(void)* `# w. p/ D4 T* a8 R: @( }
{  
" s( ?) P/ s7 h' ~0 o8 Q5 L. X  AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 h3 {- ~* o1 k# U& X* J  return (AIC31_data.uint);% X* Q3 {. p. R. M: N% E9 \1 B
}
) P5 k) @  c/ w/ y5 g/ @4 H
& W( `0 E; ?7 M; S  m3 q1 |5 R
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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