嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* M) a4 I: e# Z1 p4 }0 Z, D& S6 Pmain文件:
; @  s3 H6 X  q5 E% xinterrupt void interrupt4(void)  
% H$ V  N/ O8 u" W) _! D{
% j4 ^. ^2 s; J: D" F  Uint32 sample;$ ^! O# K/ d' Z+ \& M

4 Q$ v1 k/ e7 C, a+ R/ n  sample = input_sample(); // read L + R samples from ADC1 J) l+ E6 O6 T0 ]5 j- K: f
  output_sample(sample);   // write L + R samples to DAC 2 c( k- G( w) o% T7 @( @
  return;
" s3 g( D. B) z, H, L}) P% P) N: a4 |2 w

; V3 N7 K& C/ k! [int main( void )3 D0 ~6 g% j2 P- A! s$ h* E
{
! g8 ^* x* M* H3 n9 S$ N" `8 B- A5 O$ i! T+ w+ z; q
    /* Initialize BSL */6 ^$ m0 b( ?; ~2 U' j. `8 n) s
    EVMC6747_init( );+ u. ^' h" H0 U7 A2 O+ L, F
        /* Call evmc6747_intr function */
; z: E4 y( ?) C! b    aic3106_init( );, ?  Y; U# x7 o
        while(1);9 s" G2 |/ ?, l7 K
}
. g+ Q, K  Q4 ]" X
  t! V% r$ F- m. b7 G1 u. D! t) Z+ F  p4 Z. a4 N
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 U9 p) B! O+ y1 o  I) j5 F/* Initialize MCASP1 */# T. _9 j2 O" D* D# }0 {
    mcasp = &MCASP_MODULE_1;
+ \* v7 \& V+ _    mcasp->regs->GBLCTL  = 0;       // Reset
% Z) J2 c! _" u! x8 S3 i/ Y( \1 k    mcasp->regs->RGBLCTL = 0;       // Reset RX: G! T7 @$ u/ @& Z0 V( T
    mcasp->regs->XGBLCTL = 0;       // Reset TX( d  g$ A5 I' [" J4 M1 q; i
    mcasp->regs->PWRDEMU = 1;       // Free-running. m6 L7 ^$ X; Q& a$ s6 @
   // configure McASP0 receive registers. H) b. t' _6 S
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
! |7 q. P% n: l1 N/ k7 C    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 [2 L! r- [: a  B/ P" ]
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ D" F/ }) c: o; r
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 u3 r0 E# p1 g4 V! Q    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
0 {2 Z- |7 M/ Q% p    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1$ h3 a6 |, [+ \( q! O' m
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
. n6 l8 p. P5 g7 ^  w, K    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: b* z4 O. {8 C3 h7 c3 [; m
0 b4 K+ d% {, [7 R
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used' \6 t  Y* D! @3 ^" n
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ Q4 \8 Z, X) R5 K3 ]    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word8 ~# o3 n, ^* q$ C, |% o, S. b4 }
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 l& ^7 j1 ]8 R/ P9 D
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
5 N: u) [5 `2 X" T# O4 C) ~3 j( H    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
6 Q2 I1 o" M- z    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit) L1 Y+ G2 L- _% `
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; D0 p% F# O' T# J
' k+ k; ^  ~2 U    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
2 C) f) ~5 ]- T+ ^) j/ |6 s2 x7 q) U1 F    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
* \% T6 X$ p  ^    mcasp->regs->PFUNC      = 0;          // All MCASPs) e* C+ T: }8 ^/ u$ |+ f
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: {1 z% o/ S& w4 J8 b
! |' p* v* c( K4 h* q7 j
    mcasp->regs->DITCTL     = 0x00000000; // Not used! J/ a/ ]- n+ F" R3 S6 S" t
    mcasp->regs->DLBCTL     = 0x00000000; // Not used& q% |1 J0 q# a! }& w
    mcasp->regs->AMUTE      = 0x00000000; // Not used
) k; r5 I5 a8 c% c3 v! T' V/ ~" d9 W; [" ~" Y% G7 H, k' r2 g
/* Starting sections of the McASP*/$ x! w/ y; M  l- L% o  `. l  @
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# `" `/ I5 L- r# |( E' Y  d/ N    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  & h% ^7 z: q: D
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * r5 n. E1 c9 I, ^" `' k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, N' M5 u/ y1 U# d7 d+ x5 G" |% y% V8 t0 G4 e9 T: P6 P) D% N: e7 _
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 Y" y: q; Y- W1 s9 N    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 t  M4 s% E: U/ l- [
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
. z: X" ]& i$ f! n' e8 D/ y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" ^3 ]7 ]; Y9 n/ P2 j* Y; m  l0 N
! U# C# l7 a! K4 |8 |+ r$ X! L    mcasp->regs->XSTAT = 0x0000ffff; * V  L% _3 p; @! _( t" D. j$ s
    mcasp->regs->RSTAT = 0x0000ffff;
# }1 z9 }0 b# a: |8 o) N& v( e/ `! X( v
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ B& B  B/ m' Q. ?- M' g    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );: J. O% C" `$ U3 F
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 H- ^6 R! n( i% a" Q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* A7 R# \6 z+ X+ k
& Z1 g* O0 o0 A6 c' [# g- N. G' `% g    /* Write a 0, so that no underrun occurs after releasing the state machine */% `1 U$ }$ n% w) T7 e6 c
    mcasp->regs->XBUF5 = 0;
. h5 o  q2 b7 o  |. |    mcasp->regs->RBUF0 = 0;
% t, q! ^/ I: U6 O0 g
: g# O6 Z% S/ r2 g7 R0 b    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % G1 u! b2 n4 b; p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& x6 G2 X" j& X6 R    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' h) ?' Z4 {* v
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 ?' N' M7 w% Z' b2 |: P3 t2 U2 \
% }) f4 Y3 K( X    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! u" N3 `( M- c+ D1 _( y+ o; X% M    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 f# _0 b4 p0 z  j7 v6 @    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) v9 i5 m) g" {+ l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );$ v  a5 [. B/ X" ]# T
9 ~6 G- H1 j9 {, u: N
    CSR = 0x0000;( n( x9 y$ n- k
    INTC_INTMUX1 = 0x3d;7 s" G6 J$ n! ~
    ISTP = (unsigned int)vectors;: y* |* h6 R) m0 P. V
    ICR = 0xFFF0;  
! a) ~4 E: _, R. O  T  o: \: @1 s    IER |= 0x12;  ; w  a: l$ i5 ~) Y. W
    CSR |= 0x01;  ! I7 K4 y! R' X
7 C% ^1 X7 u1 a+ N( p

) }. R8 Y0 C' K
6 q) m* K  N! i/ }2 o5 z2 [还有就是两个输入输出函数:) T9 G1 Q: F5 j4 P6 v& M
void output_sample(Int32 out_data)- j' }* t) N. n/ I7 j' {& Q
{- d( I% ]# [3 t( G* k( s) X( Q
  AIC31_data.uint = out_data;  . R2 g4 u* c/ T. |+ P6 `* I
  MCASP1_XBUF5_32BIT = AIC31_data.uint;' r2 G8 L, p5 P) b( S
}6 }8 a& r4 N- \  ^6 `. Y! J
& c, [  y0 k8 n& t: ~4 S+ x
Int32 input_sample(void)
+ \/ f0 k: H+ G+ i0 D% P. y: f9 c{  
  p! u/ F5 T% t6 B: d  AIC31_data.uint = MCASP1_RBUF0_32BIT;% r* |+ C* g% s6 V
  return (AIC31_data.uint);
* @3 z. v' o% a6 Q. M}' D! ~4 `4 B  }  F8 R

- K& ^9 K6 S1 a6 k! O9 D" r& q
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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