嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
; W1 G& }3 f7 l6 M  D" Pmain文件:9 y9 w- R5 u  \" l( S8 X* t& e
interrupt void interrupt4(void)  
5 i1 \$ T" b( p, O# U; |0 I{; Q" L* n4 C, ]- c0 T% I
  Uint32 sample;. ]. L  M( p& m" C- u3 H6 i1 [" W3 P. H
: O7 t- j& \. w5 \
  sample = input_sample(); // read L + R samples from ADC
1 b" {# \8 H2 U9 k/ i  output_sample(sample);   // write L + R samples to DAC
, b2 R4 C; L( U/ i  return;! H4 Y" O/ J* W2 d$ U0 I* X2 c
}
) [2 `- W: F; t+ L8 L7 ]& ?
: l# l$ G; k! a0 o& Xint main( void )
# \+ n: R6 U9 |/ I{& s; E5 w/ O+ f! Y

* g. C! w& ~# ~0 U9 j" }2 f    /* Initialize BSL */& C- s8 M- b% W+ n9 {3 T1 I5 K4 @( ?
    EVMC6747_init( );
1 T  i0 E7 p; ]/ w" w6 O* I        /* Call evmc6747_intr function */' Z( ]! K' ^5 e* d0 U- I  a9 o2 `
    aic3106_init( );! D1 ~) ?, p5 b- a' s9 m
        while(1);: ?7 }5 f) x* v& C& a
}* L1 q* ~4 R& {) e) u# [) i- _

. i8 |! _1 G/ y7 {' [2 U( @, H' a3 I/ Z- {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题) n7 ?! J( h/ L
/* Initialize MCASP1 */0 B3 `/ C4 T# y2 I/ C! o  b: h; h% M
    mcasp = &MCASP_MODULE_1;( f' B1 ]+ Q* A) J
    mcasp->regs->GBLCTL  = 0;       // Reset
( R6 L8 c( R- a* d    mcasp->regs->RGBLCTL = 0;       // Reset RX
% U. {) y0 P! j9 l5 n  ~; D    mcasp->regs->XGBLCTL = 0;       // Reset TX/ a' u, q$ \; j5 i
    mcasp->regs->PWRDEMU = 1;       // Free-running; f. U$ t; [% a4 i0 {
   // configure McASP0 receive registers. L! o4 m) V$ O# Q% I" e) Z
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used1 z" O. ?) `: T, v  h6 ^* g
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! w  [! E2 U5 U8 t8 K3 t    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( L0 c$ {3 j1 D4 t    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 u* p: h! I& W+ m    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)" d- u/ h' R0 q  I1 l% m0 ~+ i
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,12 I" i7 M8 W" P7 m+ p1 r
    mcasp->regs->RINTCTL    = 0x00000000; // Not used5 Y6 G4 D/ i" c1 w% G3 [
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 l/ v: A3 a4 h, U! q* Y2 R
  H! y/ q2 L9 I% c
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
4 E' a6 `( X' F' H    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 k- T1 A+ G7 E  n
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* {8 r7 Z3 t5 [) T: w& n# A
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! k- ]/ C- N: G# J4 C
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK/ r2 s( ~+ ?3 @$ u
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
8 A* F2 L: t1 m, S; H    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
/ d2 k5 m! @% F5 u- F    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 ^/ S+ @8 P: k9 _- }
; R; f, A/ ~4 P; ~6 t
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN+ [% X7 N% S2 Q4 g7 c" `
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
% n4 L) k3 {( _' u    mcasp->regs->PFUNC      = 0;          // All MCASPs
7 \/ s: z# p% q3 O0 B3 s; ?    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( k. R0 l9 z9 S* p- x+ ]+ m  o4 x- o& Q/ d7 ?! K, j
    mcasp->regs->DITCTL     = 0x00000000; // Not used" D9 |; `& k1 V! ?
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
9 @! W! q# D! }* U9 M. F; F8 H    mcasp->regs->AMUTE      = 0x00000000; // Not used2 f" Q# W# H7 x
0 z; U2 _  K- G- j0 u
/* Starting sections of the McASP*/# ]0 F3 F4 L8 {+ I! T
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; `. L: u4 r3 o) B
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
% k+ X8 i9 ^* @" o& F2 c    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 e) Q, w4 P) E( R% x    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% o& A& U5 q( A% k- }
  M/ p6 v: ?1 y, v) ~6 i0 w! ~- h    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 i7 m* _3 O8 s: ^3 F. o/ a2 o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
  ]1 B  a" K% r0 }; J! S    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # z8 H: S9 N$ s- j1 B  [) v* N5 p7 c
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );$ b2 i9 W' H0 Z+ C7 b. A

) G3 b% G6 E; X0 k# ~    mcasp->regs->XSTAT = 0x0000ffff;
( I1 j. G) d) H) A    mcasp->regs->RSTAT = 0x0000ffff;
6 w, Q' X3 k& X9 d: O6 O& T- A$ r7 b& r9 h
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 H. \/ V+ ]2 v- ]3 A
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- \# _: V4 M3 h# B5 e+ [& D/ {# U
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ! R/ a8 E" b8 {6 n5 B
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );. O! M+ p$ N4 r1 R+ C6 U

# Q& m9 n2 @2 U! r  x5 O7 k- d: Q    /* Write a 0, so that no underrun occurs after releasing the state machine */- Y5 @) c& ?# G9 k# X2 A. @
    mcasp->regs->XBUF5 = 0;
1 Z" U$ i) Q4 g" J    mcasp->regs->RBUF0 = 0;
1 R0 m# j% `% q. V* g
5 y, E* V7 w% L1 V* l    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " _. H4 Q( Q6 Y/ r. `0 }/ J) f2 O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );4 o3 ~) q1 T1 I8 l8 b$ E  j; e$ F
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( O, D5 L, A. ~8 A( d0 A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! a( r9 P' H1 [2 X9 x/ n+ s( M/ k6 F2 R# L. M5 ]
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( v& d# T; R6 i: d! q$ O    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 A. r3 V( l$ T8 X5 j& i% n! P    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* S& Y* N& q8 f# [$ {, \" `    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! G( M1 E' [  P- M* c3 k% q: g* W& T- E6 i4 y* U
    CSR = 0x0000;
1 E% J: _7 t4 K  N' k    INTC_INTMUX1 = 0x3d;  q$ e5 Q$ r- P0 {' \  h
    ISTP = (unsigned int)vectors;
* J# M4 _; U. t% l0 y1 I    ICR = 0xFFF0;  
3 g: R$ ?- m& d7 l( _    IER |= 0x12;  
# S7 B( G( i; j1 W    CSR |= 0x01;  / N! }9 D  Y7 [; q

: {+ X9 m, W5 u5 a# S4 m& ^* X! Y5 C! l0 V
& Z) f( O$ j- `' x9 Q! |8 L' ]
还有就是两个输入输出函数:7 a( s' a& Q8 j4 p2 f, d( _0 E
void output_sample(Int32 out_data)
6 }: s; T; w4 c0 C% c2 O! t" ?" V, O{
) A& o: X: r9 a4 p$ N( U  AIC31_data.uint = out_data;  
% `8 a& Q* k9 f: W( J  MCASP1_XBUF5_32BIT = AIC31_data.uint;5 o+ @# H( F) t" A: G
}
- {2 h5 }. Y5 V; P, Y
1 k2 u( h* K2 t/ Z3 }9 VInt32 input_sample(void)
& z7 K7 r8 B- C{  % R( W4 Z& v/ K% w
  AIC31_data.uint = MCASP1_RBUF0_32BIT;4 K/ w- U9 d* M6 ?. C# i, _/ S" u# a
  return (AIC31_data.uint);: S4 w* Z  J" `' v8 X) Y+ @
}
' X  a2 t3 m* x% x+ T. f" I# y) G0 j. T" P: r/ q- s

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




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