嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( P* o$ b. q( N7 Vmain文件:( X. e- }# V8 S. F' J5 `1 L
interrupt void interrupt4(void)  . I! t2 ~# _% @/ D) F# _
{9 u( G! P! N) J  O
  Uint32 sample;
7 `5 |& M/ i6 j' l, y' J9 h8 U- E! u/ V( J4 r$ [
  sample = input_sample(); // read L + R samples from ADC- u  R( A$ K' F* @
  output_sample(sample);   // write L + R samples to DAC
# [( D/ i! ?5 e, Y0 W% P9 a$ h( F  return;
, W  o$ v( D( {" C$ Y" A}* L7 }/ r! H% i  l& |+ ~' G
' L( O  B7 s7 l* w
int main( void )
1 g( U6 J) P3 ~$ A9 h! }{! G2 P5 P9 D. N- @! y

! Y6 d8 g/ K9 U+ Y    /* Initialize BSL */
. S3 r4 @2 o# Q2 f: Q* D    EVMC6747_init( );, @4 _( a- w7 F- X, k: Z
        /* Call evmc6747_intr function */, I1 Q5 M+ _  K* s3 A
    aic3106_init( );4 C: B' B3 u& }- o! c  x
        while(1);5 g" M, z- ]3 r0 H
}
0 H/ v0 o# ]2 u  ?
" W  R/ B+ n! A" Y3 r8 P* f) j  I( h3 e9 f
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 ?% R) s( k% o: F3 v
/* Initialize MCASP1 */
+ A7 _. w- x0 D! q* T* q    mcasp = &MCASP_MODULE_1;. a. A) w) O5 i- u
    mcasp->regs->GBLCTL  = 0;       // Reset' G+ ^( T& v/ p% \* T9 A1 f
    mcasp->regs->RGBLCTL = 0;       // Reset RX
+ }3 c  s' e. V- [: I7 S0 ]    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ ^. A9 p$ p9 x& g' w    mcasp->regs->PWRDEMU = 1;       // Free-running. l4 Z  ~6 l0 x7 m/ J! B
   // configure McASP0 receive registers
* r! I: _% g0 O    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
- [: l& H& [: K* B    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 Z* H4 d2 t: b4 D! Q4 p# z/ c
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word7 {! H' }+ ?9 O1 l
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)) f$ A( D# q( L
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)& H0 c) M/ z( D
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
- v. N6 u+ p# ^, s8 o6 p& X1 z    mcasp->regs->RINTCTL    = 0x00000000; // Not used
$ `: u! X) b  ]+ T5 X( q+ ?    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. r6 t) w) [: Y8 |
- }. J" f3 Z8 T, d* p    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used( q5 m; N" C( b6 A: o
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ m# a1 g+ ?, w1 x. [- [    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word! f( l0 k5 k' ^+ T3 S2 [4 I
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- r3 n: }1 A0 M) X0 K9 }/ F+ r    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK# j5 h1 S$ R" q- T  e
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1) N2 A8 I8 q& }% A  u2 f. @8 `
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
% i4 @: L+ Y3 ]) P    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 g# I: L9 I8 |$ [5 ~5 _: R, Q7 j& D
" Z3 m; n4 J$ ~, R  z, E! c
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
: I% |( K+ c% ?    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT$ D9 }: h5 @$ q( W# `
    mcasp->regs->PFUNC      = 0;          // All MCASPs7 d# O  c" j9 f! e0 c- z* T4 o
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ M+ U: p) D4 d" c9 o# ~. l6 Z/ m; Y2 U3 ~
    mcasp->regs->DITCTL     = 0x00000000; // Not used
. I( i5 ?& s3 a+ b    mcasp->regs->DLBCTL     = 0x00000000; // Not used+ o, _3 C4 r. B" p
    mcasp->regs->AMUTE      = 0x00000000; // Not used
+ u8 y% g) A9 C) f* S0 r! b. _+ r' l1 }7 I- f! a7 {: l4 T
/* Starting sections of the McASP*/0 ]3 t( ]+ K6 l# n& {8 n
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 f9 f) y! q( R) O. k! Q3 H    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
: P. J! b- }5 L, U    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' J6 o5 i; Z. G4 s4 T, g$ W
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );7 [1 l& M) w5 Q# H5 _$ _
/ K4 [: F! k; @! v
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 Z. k* S+ f' l0 a$ }8 Y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );, K, j6 G, G( K4 I; }- Q
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: v2 }2 n2 ]1 }# j- L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );, y) _4 ?5 O" T3 n! |* V

2 @* d% P+ K" Q% w# I3 P    mcasp->regs->XSTAT = 0x0000ffff;
+ I% c) ^( ^- D3 Y/ x8 a" V    mcasp->regs->RSTAT = 0x0000ffff; , u$ q( Y# v8 I4 q, D6 x* s- {5 H# j# H
: J( a  t4 X$ j5 o7 C4 o8 f
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;6 ~! m$ B* R! Q- W0 ~2 c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );. E) D" w$ W; S- |  j# i5 J( m
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ A+ K4 i" o5 H    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& X% I3 O# ?" `1 B5 y: [2 R8 U( y5 l2 x! @( a$ v% n1 d; D
    /* Write a 0, so that no underrun occurs after releasing the state machine */! S2 H7 N3 ?  o3 f/ y1 _
    mcasp->regs->XBUF5 = 0;! p, J9 a7 v% U8 m
    mcasp->regs->RBUF0 = 0;) G* O% Q- I& A2 A$ W" `
" ?  w( @+ R" d, D/ D
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 4 x$ v: Y0 v, O& ~) D3 T
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- F4 o' j/ _, B    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 k9 B: x$ X5 j, r
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );8 }8 B* K; a! P2 [1 I- E9 y' W- a
9 Q8 D5 ?7 r- h( z9 P! h5 q, U
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* s6 b$ M- S  S. s, H    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );1 f+ Y5 G5 V9 u/ ^: I. r0 i  C
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; - n: X, r' \+ X* v. [
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( f, A- v$ @. ?- p
) q& K) r0 n( {, Y2 c  h7 x& w+ X    CSR = 0x0000;/ t* z4 T1 C2 R  D8 V0 K$ r
    INTC_INTMUX1 = 0x3d;* }& G! h; A3 o" G  o
    ISTP = (unsigned int)vectors;
/ T. ~, }* f' f; a) ^1 q: f9 K/ Y    ICR = 0xFFF0;  ! l8 \$ y* u/ `  ~* R
    IER |= 0x12;  % C8 E1 G0 Z+ o
    CSR |= 0x01;  9 V4 M# m9 Z8 f1 h, R9 H) o
5 C9 j* h/ v, d. F$ S
5 p2 t+ K3 G+ E+ G; p( _! s- Y

8 Q7 F) P$ ~5 v还有就是两个输入输出函数:6 C0 h& c/ d( P9 i3 S5 M
void output_sample(Int32 out_data)- z3 N4 ~/ @1 T0 P/ {
{+ \) ~1 X& e1 o! N" l$ |. b
  AIC31_data.uint = out_data;  + q) }# Q/ C! T& [3 F* E
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
! q0 z/ Z" R5 z* \}! E4 n1 K8 _3 @! Z: m
9 S7 Q) F+ b7 e0 U$ s( R5 I
Int32 input_sample(void)# ~$ Z: z0 i8 L
{  
6 T8 t$ n2 I- q7 H% P0 d& }  AIC31_data.uint = MCASP1_RBUF0_32BIT;
# E' z7 w/ `% n& U$ Q% H  return (AIC31_data.uint);
8 ^$ Q9 h0 ?+ j4 F}9 `( C5 T+ z& \6 M. y# {

, `) H0 b4 V' z& V4 w4 n. M7 t
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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