嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( B1 K- t5 l; l: E% S; Emain文件:7 u7 [4 b. K4 t9 ]9 d3 b8 j  R6 r  {
interrupt void interrupt4(void)  
8 j9 l, N5 G' N1 h4 Y  O- Y{
! _( ]+ G7 D; j7 J) G  Uint32 sample;2 a5 c: e" b7 b4 v0 F6 G
  r, x, t' a3 v
  sample = input_sample(); // read L + R samples from ADC$ B$ v7 N% C7 Q+ b. ^
  output_sample(sample);   // write L + R samples to DAC . D8 C2 ^. j/ c* Y) u1 E
  return;) I1 k  f3 d6 a- A
}
+ N" T, |5 k$ u
# X( D  n' n3 m) E/ O9 i8 D7 I7 ]int main( void )
; k7 o% d$ f: ^{& t: x  m8 Q& K, Z

" `6 J1 h; T* d; U1 ~5 X7 [    /* Initialize BSL */" e: f; T, n+ v! C3 T) q
    EVMC6747_init( );& y! K% }" E0 M! `( y. m
        /* Call evmc6747_intr function */  x! f% I# I1 |7 u2 x  i
    aic3106_init( );7 ~6 k  J6 x# H- _
        while(1);
- n! A7 E- \: B}8 A7 o& h, C" ?) L* w6 `) I/ ^

5 R/ p5 L9 I0 E" e
" B1 I0 C) s4 ]2 _% h( F' }5 m& Eaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' a4 K0 u# _4 \4 v5 j' b# X/* Initialize MCASP1 */
; b6 O! E: j0 e5 k9 P( E    mcasp = &MCASP_MODULE_1;' `4 V) n& w2 @9 v" E7 F# X% T
    mcasp->regs->GBLCTL  = 0;       // Reset
8 f9 O% p* v  y; F    mcasp->regs->RGBLCTL = 0;       // Reset RX
5 I2 ?0 I& t' n. R4 p7 c- x! e/ F8 I    mcasp->regs->XGBLCTL = 0;       // Reset TX
- `- q7 p. P. X; u" y    mcasp->regs->PWRDEMU = 1;       // Free-running; H! t/ O0 s$ _8 C* G
   // configure McASP0 receive registers1 B4 Y: J3 K6 l; U. ?, v: w2 L  B  x
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
# }" ^( \, F* C2 J; S    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ l: |$ F  t1 N8 d4 [& d' T
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word" S5 u+ C  m+ M( L  K* d' _* E. ]
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
- X5 _- r+ \% K) |& A1 ~9 a! v! g    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)! T8 t4 K" w8 R; ?5 |
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
! x! c6 y  j1 S    mcasp->regs->RINTCTL    = 0x00000000; // Not used+ M0 ~. i1 y& U* _5 G
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% M6 f( i6 D% Q2 ^5 [% D
% F( G7 N  u7 u. M, D4 z    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
5 X+ s8 e2 o; G* [7 D; U    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 P% [* T6 S6 P+ |( H0 k    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word- }# ?# v0 T; R9 N
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
% u  _( f3 q, Y0 {8 Y    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
  ~8 |# Y7 ^% C% {9 _6 C2 t- W4 n    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
6 h5 e5 O* {  m+ Q6 W, G    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
; x2 e2 K2 t0 f2 [  i/ o* m& O    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 `" e7 f4 C' T: O* S7 r
# m& S. H' \/ n9 j! O, I5 R    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN* W4 Z: E6 N  @. K# T+ Y9 f2 L
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT" E  v: u4 |% r3 S9 f
    mcasp->regs->PFUNC      = 0;          // All MCASPs8 T, P' P/ X7 V" k& p+ f
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1) B/ ?6 }' F, ~0 J; Z; z
$ k2 a7 m+ c% m6 b
    mcasp->regs->DITCTL     = 0x00000000; // Not used  Y5 K" S+ U3 Z+ Y: J  \6 G
    mcasp->regs->DLBCTL     = 0x00000000; // Not used" m4 {0 S* l2 O$ J% n3 H- }1 [8 d7 b
    mcasp->regs->AMUTE      = 0x00000000; // Not used* E5 S) u' c! C1 {

3 ?4 q5 q0 h! J! f. Y) k/* Starting sections of the McASP*/
5 b5 F1 Q% D) d    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. G: }3 H% `- F6 m$ w; S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
) G/ `5 y' R: G8 w    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 1 f7 B6 s* }6 \' D1 M% d5 V# `. T. J
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% T( K3 c7 [/ @0 K# ~, H, Z0 e3 V! Z! O" @
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # t* r# y- @9 k2 D2 N
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 G2 u* j3 p: f: q* ~
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' `) a$ i8 B) f1 R+ K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& R( R, K+ K; w# Y1 {9 m
% D# v0 D. d# y! w. Y    mcasp->regs->XSTAT = 0x0000ffff;
) a: R$ N! s& w/ y" N) @* ?    mcasp->regs->RSTAT = 0x0000ffff; ) j1 t" H  `! B' a
6 u+ B$ r7 p. ]1 L$ g. E0 B! [
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 T+ J* b5 o" b% J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );& f- q$ D" l8 ]! t- K2 |/ `
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 9 V( `8 c: r: {3 {4 n
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ \) ~8 _0 R3 K( b  v
, O: ~) U$ ~* y, t$ ~& {+ S0 c3 E2 P    /* Write a 0, so that no underrun occurs after releasing the state machine */! |9 m0 K6 x9 N  R! @6 N
    mcasp->regs->XBUF5 = 0;
6 b- P, J* c0 g0 _    mcasp->regs->RBUF0 = 0;
: R! N7 [' Y: v7 T, `  M' |; u
7 _: R0 l6 M& s3 }9 n: c$ h    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 O- o9 |" A: H( b" \) p$ x& m    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% q# {0 [6 Y$ S    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
  F! X# x1 O9 p, w* s  I+ G    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );/ Z; O; Z# y" A/ H0 y" d
8 A& s0 `& ]: d! A) A$ t, z
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& t' g/ p( l% d% M; R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );+ D$ R  w) q# Q( b+ O) L8 b/ @
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 j' |, S2 @: F( T1 z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );4 E' `4 R" i2 s5 B7 [" P2 A* D
! M$ h+ V. w. Z4 i
    CSR = 0x0000;
- Q% B: L" _' e    INTC_INTMUX1 = 0x3d;
1 Q$ D8 H8 r% w* A/ Z$ b    ISTP = (unsigned int)vectors;
# y+ O5 T8 a5 l, N# c( {- |    ICR = 0xFFF0;    s# w! I6 A8 _, I
    IER |= 0x12;  
* x3 t" Z. V! @8 P3 m$ H: y    CSR |= 0x01;  
3 v( K5 ~+ _9 ?( b! q6 v% ^+ V6 ?/ r7 d% [( ^

4 o* I; _/ V' p2 u- h! K. f( B
5 B8 {; |, ]7 A* m! C/ l$ \# C1 F, T还有就是两个输入输出函数:+ Q) d. m" D# K* S5 Q; b
void output_sample(Int32 out_data)
+ n, R# w2 L/ Z{( o& k" N& ?0 j! A& a9 a+ t
  AIC31_data.uint = out_data;  1 f. Q. R# Z0 V, C
  MCASP1_XBUF5_32BIT = AIC31_data.uint;1 t9 W; \$ y% n/ w
}" Z" W( b2 F/ Q+ |7 t( v

3 g6 ]4 ]& o' h/ c% }' x/ ~% z$ k: SInt32 input_sample(void)5 s% N+ y$ H- b" Z
{  * W/ _  z4 u2 U! P0 a
  AIC31_data.uint = MCASP1_RBUF0_32BIT;1 a4 X1 _* ~3 Q) K3 Y4 ~7 e
  return (AIC31_data.uint);2 s/ j/ H4 L$ W( u  C1 G
}* l8 j8 ?2 [4 k( K2 T, k5 R
. z" A$ L5 R8 A5 o8 a, y: |4 ]

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




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