嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 X, L" B& [' F: w7 ?
main文件:( M3 n# k) u: r# {  f, K
interrupt void interrupt4(void)  2 b6 n$ o& n- @
{# F; B( H' M. H# j8 O8 A! Y: ?) D
  Uint32 sample;8 O3 y2 q: v  p  p5 N5 o9 Q0 m. R

, Y  J+ P( y$ Z% O! l  \  sample = input_sample(); // read L + R samples from ADC& v4 b8 z+ n  P) f: o& K
  output_sample(sample);   // write L + R samples to DAC
' k; `; F! O6 i5 C. S4 {* `  return;3 z# U' a, i, ?3 z8 \
}4 v+ |6 H- b$ J& f! |+ v+ x( U  {

$ R% S: G( z  Wint main( void )9 Z3 T: W  _5 ]( C5 j; f, u
{
" C5 m! V; F% X  W/ f6 |; A  d2 D- P+ @# s2 K
    /* Initialize BSL */
! G- K6 {) Y% \+ I) g1 p, F& P    EVMC6747_init( );9 t0 a1 Y+ f. N( r' D9 y
        /* Call evmc6747_intr function */
% M9 h( {! ], ~) |1 C- w: K2 b    aic3106_init( );/ t, x/ [) H0 {+ G/ g1 y% X
        while(1);( J/ [7 ~/ a% i: p5 g
}1 e' P- h- G1 A0 T7 P! k# O

5 H4 c" B, l( g$ a# c9 r5 m$ O) W" h
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题$ D+ W: H4 d6 T! n: d9 g9 `0 G
/* Initialize MCASP1 */6 a* g9 y; z' {  h( z
    mcasp = &MCASP_MODULE_1;
  J2 K' q; P5 H! `# x9 t7 y    mcasp->regs->GBLCTL  = 0;       // Reset
  u+ h. M9 u6 i0 K3 D    mcasp->regs->RGBLCTL = 0;       // Reset RX
( D/ k  r, ^  A' b5 n    mcasp->regs->XGBLCTL = 0;       // Reset TX
' a8 Z$ V7 _4 b6 f- ~    mcasp->regs->PWRDEMU = 1;       // Free-running
" y' A1 l$ W, E* J   // configure McASP0 receive registers
# X' O% J# a) s" ^    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used; L& j# G  F! q4 N
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* ?: f7 {2 A/ G7 w+ f9 i    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) N4 o" F3 V4 t; R    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' h9 z( h& [6 p. P+ q+ R; G6 T    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
, \- }6 _4 h* t: N; W4 A3 F    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1- k7 }9 j! U( x* a- ~
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
5 n' F0 O5 }( t% X    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 y/ C* \4 F) h: `2 o
. z2 r+ |- L1 c# h" r2 }    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
3 [: A' r( t+ `1 }  G5 ?    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 e, Y' f. _6 P: r8 d- Q! Y    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) @4 A/ R7 F, P. H8 Y% J    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
( y4 |- z3 d, H    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
; |0 j/ L! n9 B( E' q    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
, G$ a6 P3 C0 v! L! z    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
( `; G2 ~, Y% H5 r! @0 ~    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 @8 y. }  o2 r- p
8 m  G, p; F; @  d
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN5 m. ~8 ~) ^7 L% g, v
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT  E6 [) L8 s3 D  f+ q7 n
    mcasp->regs->PFUNC      = 0;          // All MCASPs
2 A" T5 A/ H* B* J$ U    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& x" O/ J" u0 j8 m$ e  }- C
( e' M' ]6 e6 [5 V! c    mcasp->regs->DITCTL     = 0x00000000; // Not used, X, A" Z5 r3 K" l7 n
    mcasp->regs->DLBCTL     = 0x00000000; // Not used" {( ^6 r3 m& r
    mcasp->regs->AMUTE      = 0x00000000; // Not used
- n! i: k  x$ K7 x5 f& d( S
: p" ?' {8 K1 m, y) M/* Starting sections of the McASP*/
  C! l4 p% X* B/ p. q3 o1 Q    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 ?, @6 ]6 i$ [: V# `# G: Q/ i. h! i: Z& d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
1 w# T# [# j! F9 {" ]4 k: J- x    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 |4 A1 w& X+ B2 A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, \4 {5 A- H# A. M% o% j+ \7 W
( ]' q, `+ Y# x' e* M& _6 a    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; j$ o" U, a: x0 l9 P. v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 V( W8 r* H& ^" j7 X) E; W
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 r  X  Q9 w% B" P9 n: c  p8 J; H    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! z; j2 o: ^7 m( I, w4 {8 A. M0 ^# ?- m* }
    mcasp->regs->XSTAT = 0x0000ffff; ) F. X9 C! x' G, K7 A
    mcasp->regs->RSTAT = 0x0000ffff;
; n8 A& }( M. w0 N' k: S
$ m( Q/ s: S  V7 g  `5 |+ Y    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ x* [+ C) p, ]# u    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
* D/ d5 `) {0 h' Y% w8 I    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 m; {7 x' u; K' C3 ?$ K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ `% ~; p2 m* W

, [- p5 D. E/ d5 J    /* Write a 0, so that no underrun occurs after releasing the state machine */1 @" [" ^9 ?1 E+ c3 m
    mcasp->regs->XBUF5 = 0;5 W) e: o$ _% c% n% c, {% S+ e
    mcasp->regs->RBUF0 = 0;
4 y# w1 H1 `9 v) p/ I9 w) t# r0 w% p& ~5 X/ R$ f* m3 O! G% V" z# r( o
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! p! B4 U. `; u1 [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );3 O+ S4 w+ X' u( Q9 s5 s( u
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 q; ~+ Q2 F: x. s2 l; ?( O4 {    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
5 W5 D  E9 {  s' }2 ?6 I) s" j, R1 V- x4 D
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' j( y3 s$ [- F, ?
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );  ]: f) J' f1 X
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' E( u& q4 n+ M  V7 E2 N: F4 O; D    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 V- }9 v5 E. M1 v; K& f6 P( C2 V6 }0 `6 h/ W  `9 R" r0 p
    CSR = 0x0000;
. q  h% U$ u3 g' k: N+ r    INTC_INTMUX1 = 0x3d;
: z4 e) V  [, _; D3 d' i* [    ISTP = (unsigned int)vectors;
) P/ s  f$ a7 P& D; r. u# I    ICR = 0xFFF0;  
5 M& B& E0 D6 G( R. n    IER |= 0x12;  
3 P# @' w6 L9 O6 X. ]    CSR |= 0x01;  0 g9 U1 h0 l% S7 ~5 n' ?

" G3 C, ]. U( t+ Q) x* \1 e+ A
" e/ X8 q: S: _: z" {6 ?* Q
7 H) K2 s+ X+ c; |8 I还有就是两个输入输出函数:1 F+ n' c0 e5 r
void output_sample(Int32 out_data)
4 |/ g$ h$ B  n# u, T5 F) l- u{
* t9 ~/ A3 q6 b  j; |& ]; z$ z: _  AIC31_data.uint = out_data;  / p: J. X  e; E0 R
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 i0 w' {% F# E  K}9 W, h/ a& o3 g8 V# h) P7 e4 {
% O' a8 A; F9 H8 v% P& [9 C
Int32 input_sample(void)- B1 l8 C7 d/ N' {0 C0 D" K9 h
{  
' J, w5 K- P& R$ `  AIC31_data.uint = MCASP1_RBUF0_32BIT;1 P) b- A& q' `% X. C
  return (AIC31_data.uint);6 o  F$ }3 y! l) z: y8 u
}* X& Q9 x5 y( }9 ]9 H) g
8 E0 H, g, v% Y, S0 |' N* {

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




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