嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 N: V% B: X7 M6 P) j  Gmain文件:6 U, i3 H  t; Y! x- W5 L5 p
interrupt void interrupt4(void)  ; p( q) p4 Q& }% E8 v
{; l9 h6 B8 b# o' ?. \! I0 W5 ~
  Uint32 sample;5 K) v2 e# Y+ ^: s! Q- r; M# X' t# \4 F

* }# D$ U- E% G7 v7 E" l) O$ o" r  sample = input_sample(); // read L + R samples from ADC
1 X' a# w$ b: R2 R, h  output_sample(sample);   // write L + R samples to DAC
6 y( g# A& J# u  return;" c9 V& n+ y) [, i+ A( h1 d
}) U  j# I" @+ g: C0 I% e5 n9 Y* R: \

' g' o3 i8 k6 S0 @# }. V! Jint main( void )
1 H' x/ v4 B4 a9 ~{. `1 b; \' q4 m' x/ t- N
. \" w$ a3 z% ], k
    /* Initialize BSL */, s) C% m. h1 q1 G7 b7 e7 q
    EVMC6747_init( );
& q$ n4 i: ?9 l7 w! T8 c        /* Call evmc6747_intr function */% r5 j" l& f) D4 q0 |# B
    aic3106_init( );6 N; m. e% N5 [# w
        while(1);
" l, J+ O) ]6 W( V}5 P( h( t0 D2 }! b, ~) c4 J0 Y8 B

/ W& o# J3 m& |( h' O0 n
7 I" k  {- K! G  J/ f( W, saic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
, U4 }  N& z& y/* Initialize MCASP1 */
6 u3 `  Q7 d) I* n. f    mcasp = &MCASP_MODULE_1;
4 [. u: c0 p. `' T# ]! y9 e    mcasp->regs->GBLCTL  = 0;       // Reset8 E' \) v' H7 d5 _# b
    mcasp->regs->RGBLCTL = 0;       // Reset RX( c$ {# \1 O( Z: u5 l) y
    mcasp->regs->XGBLCTL = 0;       // Reset TX
* @  o* y3 d/ E3 O$ f3 j4 D" t2 A    mcasp->regs->PWRDEMU = 1;       // Free-running7 j* e" D) D3 t* w/ r
   // configure McASP0 receive registers- ?# i4 A( V. V9 y7 _
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used$ D6 e0 I% o5 F$ o+ _
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: _- |' j/ f& R) N4 P0 w: g8 n
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word+ l* h$ ~* [2 U# S; _  p/ S$ \( I
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 ?1 H% x- i0 G4 O    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
; @% y, K4 u: |: J) `& B    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
; O/ }/ _0 I. i/ @, `6 H3 o    mcasp->regs->RINTCTL    = 0x00000000; // Not used
. T, i4 K: e1 D; a& O( G    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- ?. e7 b( w6 z4 h2 l& Q5 @: h
. S7 n  o& o6 H1 y
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
, J) ]; L! v2 V- u6 o$ {    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% F1 ^. ?1 ?5 [& i, {4 E% g    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word8 Y: C+ N% B% ~* q5 p0 h
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 r! V3 z& H) k2 c- I% `$ T1 d    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK2 M3 A4 i7 k. c' d: A9 Q
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
. K+ g; E' Z) Q4 I    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit" s8 q; V" Z/ V) i  B
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" v3 ?6 A, M# |
9 Q( D- y9 d: a3 u& V    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
$ f9 \$ b. s% c1 M1 l    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT" i- m8 m: q& `. E( H* x' L
    mcasp->regs->PFUNC      = 0;          // All MCASPs3 R1 O5 @! u! {4 _2 h1 L5 h
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ K( j5 W0 l' @0 \1 h3 Z: s2 `
: G- m% M8 x, t6 u9 v! s    mcasp->regs->DITCTL     = 0x00000000; // Not used& O; I0 G2 P! E  |3 }
    mcasp->regs->DLBCTL     = 0x00000000; // Not used. H: n) v% k& w* n$ }
    mcasp->regs->AMUTE      = 0x00000000; // Not used$ J+ P% ^& {8 f/ S/ G% c2 x+ P; ?

: Q- {( e1 _" i1 L2 {/* Starting sections of the McASP*/# G% |9 |" b# e8 D* p' S: D
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 N8 t3 V( l9 @( D" Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  # y- {$ ?2 J, ~! N" R% K5 C7 C# W- \# O
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ! W8 L9 Z3 d) z! r1 T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ b/ Y/ o; x1 }1 N! c4 h* J7 ~5 f
. }0 c4 i$ t# [    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
- l) O  `7 F# ]    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ d- p7 e0 j3 \$ N% O    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 J7 _4 S/ C2 A6 ^( \8 L( |, s+ j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );- Y% K/ l0 x; ^3 Y6 x/ m# U
( s4 V2 P5 Q/ C% I; K9 D9 v
    mcasp->regs->XSTAT = 0x0000ffff; , Z; `! j+ u7 X
    mcasp->regs->RSTAT = 0x0000ffff;
; c% }; A+ o, t  L5 S( |  c" v
! M8 [8 A; [8 V+ ?5 Y! G  M1 Q1 x    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;6 B& f1 q* w1 G" \
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );, r* g8 m$ p' ?+ V" }
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
5 N" {% n, D# O    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );# T$ P2 r! X9 S9 D; O  s. e& n

% i$ }/ C# `( C/ B1 d! F    /* Write a 0, so that no underrun occurs after releasing the state machine */8 M( w( Z7 e% L0 P
    mcasp->regs->XBUF5 = 0;; ~* ?1 m7 z6 X( A: ?; o+ @
    mcasp->regs->RBUF0 = 0;
3 V% O$ Y$ E* k/ |+ z. \. n5 A( T8 P
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; & ]- |# ]3 H8 b; a
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" r, x& N5 C' P. m2 V7 m4 d
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) w' I. j  D( ~6 h/ D    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 n1 \. M3 @% ]! p* ^3 T

( ~  T+ n5 J. ^/ I. G    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 E! a+ b; @" l; L4 y1 r, o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );+ _' t( t$ H  y0 s+ D# X$ j
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" ^0 \) n1 l6 ?2 Z( O0 [# p; Q. k    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
  m# w* B6 |( x$ ]: S( V7 f6 }
: r% n8 y9 c+ t& b    CSR = 0x0000;% }! z+ J$ v/ P, r
    INTC_INTMUX1 = 0x3d;
1 v5 p. Q: X$ l; y/ ~1 M/ Q    ISTP = (unsigned int)vectors;5 \5 P! R% T+ M
    ICR = 0xFFF0;  
$ n& I- s5 w0 ?; `5 \$ _8 E    IER |= 0x12;  5 h1 w; v7 P6 V3 M' h
    CSR |= 0x01;  6 H% c# d# y) Q; L+ y
: x4 K# X$ L- }8 U9 w6 P8 }. D

! S: W' ^+ Y: D3 \/ @9 q# `. x* @$ j
% p, T& I" Y7 F8 e还有就是两个输入输出函数:# c2 e/ l# N, L0 @" a0 w
void output_sample(Int32 out_data)
% C4 b! b; ~# m7 b- O$ c{1 |- t5 Y4 E$ i5 M7 n) E
  AIC31_data.uint = out_data;  5 o6 m+ J5 O( l5 U& z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 J# Y7 ?0 d5 M" O5 X}' @8 u6 \  g# N. C9 L+ y: A( F

# r: W0 t: i7 f$ S& L: h% q2 f( dInt32 input_sample(void)) D9 W; f0 V  Y+ z/ u# X4 k6 S, w, e
{  
- S) f- t# c) m6 n: u, x+ x: K  AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 S" z& g/ M# h# L/ A/ O/ E  return (AIC31_data.uint);& V' T; G' S) Z- r9 d
}& o# e( S3 H2 N% V( A/ Z

9 f9 L5 A8 U9 @8 b: T& |$ A
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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