嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
/ h# Y( y8 Y0 l* {: K% e- o$ W  b) `main文件:% z8 a. l5 B: W$ T9 l
interrupt void interrupt4(void)  ; Q8 {  ~* a% R/ }  k$ X8 G
{
; p* o1 g# B9 F7 D0 H* ?  Uint32 sample;% ]: w) Y) J) x0 e6 G+ [
6 F* U1 `/ |" ]# a
  sample = input_sample(); // read L + R samples from ADC
: V# D" X$ J. ~7 |6 s  output_sample(sample);   // write L + R samples to DAC + V1 o; S6 v5 A; G7 j! {! d3 A
  return;
0 R2 _8 U* @& R, H) K}
1 k7 e; _3 v" `& b$ b+ n; P
" C- Y" o' @) ~8 F( Q+ U, Dint main( void )
8 X2 Q. e) {9 v0 }; ^) x7 }{
2 `& U8 C& F, S% a+ Q6 x0 ?, L) B& ~8 v+ _* ~+ L1 [* o; Y
    /* Initialize BSL */" Z, Y9 x& g6 G& T+ v. b5 o9 w
    EVMC6747_init( );
% O# v9 x/ V1 j5 ]4 q0 \& Y        /* Call evmc6747_intr function */
/ D3 Q8 Y! b& e5 y# c6 l4 z( [    aic3106_init( );: Y6 A' I/ F* b% y
        while(1);
, L9 A& q: T  `; }: E- c}5 q+ S) V; t, e' s- u  s* \
: [2 D* W% b3 u% ^1 l$ L5 f

( I: C6 y' Z! Y1 ~# yaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- j7 _! b3 u2 F: d" e* q  a
/* Initialize MCASP1 */
2 s2 K' i3 h; H" H$ Z) ^; A, p, @    mcasp = &MCASP_MODULE_1;9 M2 |! ~6 C1 l% e" I
    mcasp->regs->GBLCTL  = 0;       // Reset
# _* \- Z: ^& A/ Z    mcasp->regs->RGBLCTL = 0;       // Reset RX% d7 r9 y% H9 V' `
    mcasp->regs->XGBLCTL = 0;       // Reset TX
4 E; u2 S) U/ |+ ~- A    mcasp->regs->PWRDEMU = 1;       // Free-running# i# U/ y8 d) G
   // configure McASP0 receive registers& R* ]1 h7 [1 Z9 x  g% x: l6 X
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used  R3 Y1 }$ h  L* |3 U
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 v$ W* \1 `* @1 u: T
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 v2 f6 `0 J( u# F$ u) P5 J    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
  w% k  n+ [% d. }1 G    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)" n' f# B5 ^/ G% F  ^
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1$ y: F& m. y% k+ C+ Y  w
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
2 N* O) K7 y2 s# t' M, [    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ J. }' @: Q/ E# j4 U: I
# G$ x+ k4 G) v; r1 b# F
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used% K) ?8 Y: F1 H7 B; D3 k
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 V: B: u% n2 Q) b" S
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word. Z2 M! p5 G7 M
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16- ?0 c0 t7 S* d  W, Q9 N
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
& F% R2 a( b4 y  S5 Q. G% `% ~5 \/ }    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
) B/ R4 O3 y7 O3 D2 k    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit; `) D* p* V% p  X
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256  I3 \6 y% s+ c/ F# H

" w7 v5 ~% u2 I4 [    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN8 s/ J$ H6 @6 H" }/ D0 ?
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
0 {1 I3 N. Z, [7 l( T) H- m    mcasp->regs->PFUNC      = 0;          // All MCASPs
1 O8 Y! i1 }# M. n3 H7 C- V; ~7 \; u    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1! C* z# h4 C/ {- c* `

; i2 ^9 W( c1 F( ^" Z; B7 i    mcasp->regs->DITCTL     = 0x00000000; // Not used+ B: @; K) g3 D) \8 F
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
- C- ^8 J+ ~1 W+ y9 {! _9 P& g    mcasp->regs->AMUTE      = 0x00000000; // Not used! g, L, x: ^8 S, [- e# v+ w) G

( D- m2 S4 q6 R$ g/* Starting sections of the McASP*/& e) ^9 b0 n4 t" g4 A  a  \7 P
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& y6 S& o$ p6 d- ^7 P8 N! ^3 U/ |/ y+ |    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  # L) H* s9 `- U! ^
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 9 L* U8 s' C: O! S6 X4 t9 a; [
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 q3 M, ?( b/ p8 ]: \2 I2 |# w  g1 w% C! _, Q) z
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 Y" p  l' `# ^' Z8 v* C    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );* ~5 I4 ^$ L6 W/ ?. m' A4 }8 E; s
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
. ?8 u3 }' V8 C. v    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );- [4 V/ O1 a( m& c+ F0 a) [

" C2 X& `2 f7 [6 K( ~    mcasp->regs->XSTAT = 0x0000ffff; % T; D7 [: A) c5 m4 U9 O
    mcasp->regs->RSTAT = 0x0000ffff; # T& g  h. Q- H6 f+ Y

: P7 `9 c* ?1 o4 g; c- A9 P    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;# R: [4 s1 g: H* L
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );4 H' j5 t3 {, o' B" z7 N6 M
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
  U; g# o! v- r4 l! v    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ u8 y+ K3 R5 A# w$ j! G/ N+ a) {
    /* Write a 0, so that no underrun occurs after releasing the state machine */
# _% Q; x" x9 S$ R6 x5 A7 X    mcasp->regs->XBUF5 = 0;! ]* H# [6 S3 }3 Q' U+ m0 h- `' P. j
    mcasp->regs->RBUF0 = 0;' e, {& f: N# S$ K1 z! Q8 ~. f
/ e$ ]7 z7 X- t* A
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; $ L# Q2 d! @$ b+ u; A3 d3 i3 z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" O9 u) Y. r! w& d, k    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
* F1 m. `/ d: \: z* N4 w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );0 b, j, I+ ~' G# i" |; w
8 d" b# u3 H+ h: j4 k7 c7 A+ v. o  q
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" b2 u. p+ L! w  y4 l1 N    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );8 \  v) K* `8 ?3 F* t( w' d
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ( R/ U, c  O8 E; i+ C7 A9 }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );2 [4 O7 U+ b- u

0 S, ~5 `5 W' e7 k3 h7 J    CSR = 0x0000;3 ?4 H! R4 m- z1 O4 T7 ^
    INTC_INTMUX1 = 0x3d;6 ?; h% k0 r. q
    ISTP = (unsigned int)vectors;: `$ [. O+ t8 {% C; e
    ICR = 0xFFF0;  7 N. v# S8 R9 ~' X
    IER |= 0x12;  ! E: S1 _4 }0 c0 t( i
    CSR |= 0x01;  
/ l6 Y3 V  U6 {( p
, d7 k& ?' ~5 c8 }+ l9 K# S
1 ^$ d5 W. N3 d* @. G9 S& ~- U- _! |6 s2 A! r/ _( {3 n) M5 a
还有就是两个输入输出函数:8 C+ x* _9 g' }9 B/ [! I
void output_sample(Int32 out_data)
9 V# T2 d3 l, G4 [{
1 Y4 M! L! G9 b1 q& [  AIC31_data.uint = out_data;  
% C. G( d+ c- S: n+ M& G+ O$ H; S, W  MCASP1_XBUF5_32BIT = AIC31_data.uint;0 f9 w, q, v3 \1 M+ n
}
9 ^0 X+ Y# L0 y% O9 P1 E5 K0 n6 w
0 @( W  z6 C/ J: P* B5 SInt32 input_sample(void)
: N5 A$ ^" J+ l; F' Q- G) M{  - O( z* x" Y7 F1 W
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
- M/ g* A6 e& @1 [  return (AIC31_data.uint);
: E5 r- X8 E4 s, v}; p3 l) s. T  P  D1 g% L% L

  s- h/ I: e6 J" I; N" w% [0 F, W
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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