嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 D# o. E4 G2 L$ T6 d  P& o5 umain文件:2 _9 B$ ^" ]; Q
interrupt void interrupt4(void)  
' W, }! ^. K6 t' {{/ d6 {. _; X2 N' u
  Uint32 sample;
- P( I2 M7 d' S! L7 r3 ^6 g* ?1 P# P# U/ z
  sample = input_sample(); // read L + R samples from ADC
# \- k( a/ n  t' \1 L  output_sample(sample);   // write L + R samples to DAC $ O- d2 K/ s0 X
  return;& ]. T5 J7 z* K0 o  _
}
7 e9 i+ S2 D1 m; P0 B
9 h, O- q0 y6 g6 @% x2 Y# Wint main( void )
4 t8 e' Y# g7 |% Y' T{9 N" z2 o3 ?1 `2 H! Z

# h! V0 [7 g) A! l    /* Initialize BSL */) C4 M7 t7 A- |$ W( e: Q
    EVMC6747_init( );, l' i; {# S5 \3 d- y. L( A3 \
        /* Call evmc6747_intr function */% g: {! e: d! F; M
    aic3106_init( );
8 `9 ~+ D7 V: Y  K' u) n5 Z        while(1);: Y4 H. ^& W* L9 X
}
) h) P/ [4 R% J6 x8 Z: a# k2 m3 W! g/ T0 v3 t

% X' A- l+ j1 j7 o' ~aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题8 i; {+ C# A8 H2 ]3 @
/* Initialize MCASP1 */" @5 S5 U9 v$ {. q4 a$ ?) H
    mcasp = &MCASP_MODULE_1;" V1 p( g, H* d
    mcasp->regs->GBLCTL  = 0;       // Reset' `! F  c! d/ _' ~/ {
    mcasp->regs->RGBLCTL = 0;       // Reset RX7 O5 ?8 Y; O# q1 n/ a) @
    mcasp->regs->XGBLCTL = 0;       // Reset TX
# v/ |: B0 w4 e5 {, b8 c    mcasp->regs->PWRDEMU = 1;       // Free-running0 N$ L& E% U" Y/ k' n
   // configure McASP0 receive registers
" k/ W  k0 H: ~% U7 S6 E4 J    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
: O+ V6 F* l1 N    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus+ g; o& i4 M# L. O
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 n: ?; T  K1 `5 J, s    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! j9 W/ [% N% o    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
4 p1 R, w" t8 \    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 {6 m& {  B! K/ t    mcasp->regs->RINTCTL    = 0x00000000; // Not used
" F( R, E4 ^8 w4 m( U$ S    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" z, @2 a' u- r9 I+ C
$ V: f9 z1 O2 E. M  O9 ]    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
& u6 A' C, k: J6 B' S3 g    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ `. a& M7 o# E( D0 e    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word5 P0 i' @, B  O. ^& y7 o
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 O6 x! G" s3 r. O1 q! J* U( T3 H    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
0 n5 n7 G! p& f/ X$ R  @5 U% U    mcasp->regs->XTDM       = 0x00000003; // Slots 0,11 p: T1 U4 [3 }2 C' {# \
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
8 e1 ]4 S% ^2 s    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: `  M3 ]' T0 J

- J, ~. S8 k2 ]  ~0 l' ?9 b    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN8 n( T1 c( }$ N. z
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
" i9 ]! c# ?! V+ Y3 h6 O    mcasp->regs->PFUNC      = 0;          // All MCASPs- S4 ]$ I, R( |' |* O3 I( }1 f
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1! u! Y# ~6 ?( B
) u* X/ L, u  U3 ]* _# b
    mcasp->regs->DITCTL     = 0x00000000; // Not used
, k3 H1 U: B8 F' D1 ]7 D3 F    mcasp->regs->DLBCTL     = 0x00000000; // Not used
; k# y7 `* O. M. D  |% S    mcasp->regs->AMUTE      = 0x00000000; // Not used
6 [- S+ K& U* k5 l+ v. V0 _& Y9 D( S5 @8 _, J
/* Starting sections of the McASP*/
. P; q4 Q# ?0 H3 G& O# n# ~    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ) F  e# \; M$ Y+ ~1 m  ?
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  ( h2 q* W2 h9 l8 ?$ f+ \
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ! ]$ @; \: P( O4 F! S
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );* F, D7 z0 q' l0 H, G# c

2 D8 u# J: l- j0 T    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 h7 U, J7 _2 U& d- g! Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );  l! |& S8 i$ ~
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ N% A: a$ x) R9 R    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) Z$ k& H: N+ |( x6 I
# }) x8 K! `4 q( [' }) q5 u4 e7 ]
    mcasp->regs->XSTAT = 0x0000ffff; * f$ ]( k! V: Y' x# Z1 ~( N. g
    mcasp->regs->RSTAT = 0x0000ffff; 4 M. p3 P3 `1 W) I- [9 r1 [/ e
9 R& c4 k" l+ k; q9 s  k
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;* m& `5 U) I' O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ B. [) A3 f* h+ G: N- O; M    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" V2 t. L% j" h; r. V' _    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
. o" U! M; p) m( _
- H! I8 U0 B. F# B0 j    /* Write a 0, so that no underrun occurs after releasing the state machine */
' @& P. a0 e7 V1 Q. d: h8 Y5 f) j    mcasp->regs->XBUF5 = 0;! \6 t; s! L; w6 G8 G- [+ t
    mcasp->regs->RBUF0 = 0;
: f1 f5 \5 B; M7 a5 l' R! h0 H
; W1 }7 C. N0 j- _: d# w$ f, b7 [0 {    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 _" |4 |7 B8 m    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# R* ?# s/ ^) o4 b    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 K. \* x. P% @    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- q/ }9 z$ Q0 U1 X4 @
" j8 _* ^* @( Q2 v    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; * I, [2 u+ H  x% a
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% ]. M) e% {0 V* s6 s6 K
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! h7 j" j* L* k9 Q1 ]4 d    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# z; _+ x. k9 l8 k7 g! c3 x- z5 z; W
    CSR = 0x0000;4 E+ T6 R/ q# N. _, f
    INTC_INTMUX1 = 0x3d;
1 c9 p4 \+ i! [7 k% J, S    ISTP = (unsigned int)vectors;0 d8 \' ?) z+ {/ ^. R$ P# }
    ICR = 0xFFF0;  ) y3 I6 W4 H; R+ O  j
    IER |= 0x12;  
. a4 G  ^1 J# S  {7 X, r    CSR |= 0x01;  
. ?( I( H, l; Q
. \2 b6 l8 j0 a9 o) B  B4 a. q( H. m* {
- H7 D3 z0 q( O
还有就是两个输入输出函数:
/ o" f0 y- j$ F7 K' A! n. Rvoid output_sample(Int32 out_data)
% c% A0 K: n8 X& b8 S{
" Q' a" c5 x% L% W  M( w( d  AIC31_data.uint = out_data;  ! N) w" m. G- t4 ~  `# N) p
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 J8 R' F. e# r& o& b6 p}
9 |! d$ U5 ~. x6 O' O  k9 p/ c. m, q; K0 f2 d2 X$ S# I( y
Int32 input_sample(void)
+ L% z: `# O( ~6 V) g{  , u. _$ |' w8 d/ V  p
  AIC31_data.uint = MCASP1_RBUF0_32BIT;: `, f* {! L7 h1 \; L
  return (AIC31_data.uint);
" @' ]4 N% Z& b, p' A0 Q}! W% @$ L1 j% T$ `, [! B# h2 a0 x

9 j7 ]5 U" W' a$ o$ _
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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