嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
  q3 d! u) ^1 I: y0 a8 T& N; Amain文件:
2 _3 F2 f) B% A5 ^& ?interrupt void interrupt4(void)    N' P  r' u, ~- O  c, U* C
{: l* R  ~6 I* ?2 r( ~# {/ {, D
  Uint32 sample;
) ~0 e; u4 w1 Y0 M6 f/ Q
2 l! N( |  v# {$ @# u  sample = input_sample(); // read L + R samples from ADC
5 X' }& D) d. \6 c; f+ }4 }8 s3 E1 s  output_sample(sample);   // write L + R samples to DAC 3 T" K1 B: {1 [# m; N; x6 {
  return;
7 L) ?* C8 k% H/ Z}
4 q9 A7 d7 e- e
' n, z9 q" n/ u! Z; k( lint main( void )0 K5 Q/ i3 K* e
{
+ c. O, P& A0 ?- k6 ~) ]5 j$ \$ t& ]/ k% D* E& V: H; U
    /* Initialize BSL */
$ I  N. O# V/ X8 q: G. P$ c7 K5 w/ [    EVMC6747_init( );
' `, _+ a' t! n( A; c; c3 Z        /* Call evmc6747_intr function */' h5 X  E) d; [
    aic3106_init( );
; M0 G& b% x3 w# _        while(1);9 r" P" J) C7 c0 i1 T$ Q/ d
}
. r1 }# o3 \9 z: c' x/ Y
8 Z; k) X" F' D9 v% Z6 X8 n9 j" [! R  o1 G
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 G6 T" s1 T. f- \& j/* Initialize MCASP1 */' }! m  K# r& `* f9 p0 e
    mcasp = &MCASP_MODULE_1;
# l* X. I! r: F. f    mcasp->regs->GBLCTL  = 0;       // Reset
! h2 I) B7 \; w7 F2 {    mcasp->regs->RGBLCTL = 0;       // Reset RX
# A  X6 ], }0 s5 [! X' Q. [6 @    mcasp->regs->XGBLCTL = 0;       // Reset TX
. S9 |: g& c5 I9 u    mcasp->regs->PWRDEMU = 1;       // Free-running" E; b0 M( H7 s3 S
   // configure McASP0 receive registers/ G! a0 l7 R* M+ u
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used' U0 a& [* l1 w
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( Q, g; w! q- n1 F  R8 P
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" I5 n5 G* o- @7 }; P/ y    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 K2 Z6 Z6 \- N9 g! o; e
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
0 O1 ^' L7 p7 \9 ]    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1, t6 `% S; h7 O
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
: R1 e/ l6 }7 p3 ]5 q! U, i    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ w0 c3 A5 v1 s* d5 o6 r1 w+ D$ a  ~& d
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
6 i6 s4 P# g6 F$ h( Y    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" [* A# O7 d2 x, q2 u( E1 ^+ U    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word8 W3 N! ^& M' ]
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
" y, a: h4 Y$ g6 g  x8 F    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK( s; t  v8 ^+ ]+ v0 v
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
* B6 Y' F5 \4 A3 w- ^. A1 ?    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
( |! o4 x8 A, H  E5 F$ z* o    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; L$ ]9 t6 ~7 B- T$ e3 Y
" v4 V3 R% v# d0 V9 Z1 b    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN6 r* m9 e$ B$ L/ s' Y5 F( t
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT- J* G) ]$ }% z/ I+ E* q. l
    mcasp->regs->PFUNC      = 0;          // All MCASPs& [- @$ z- }+ M( b: U" a0 N
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 r, G' q1 C/ N  ^! t5 @7 W& d& C+ K$ y
    mcasp->regs->DITCTL     = 0x00000000; // Not used1 t+ [  W# P6 q/ X
    mcasp->regs->DLBCTL     = 0x00000000; // Not used7 @/ j  i3 h& P6 Q- L
    mcasp->regs->AMUTE      = 0x00000000; // Not used* u( u5 g+ i# @; W
, [( n# G, Y9 p. w3 p
/* Starting sections of the McASP*/' z6 c: ~9 }6 I' C3 _2 ~+ X
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; % i; |  b9 @$ A5 `4 I& Z+ u8 Y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
1 p0 [$ R! L" J0 A. j) R    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;   |, x" A% P2 c2 j; Y2 t
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ C% i6 s) T! \4 S: z( W$ M# b$ y! ~* j2 ?8 K' h7 D3 U, U
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& ?2 a; v/ H, f( m$ X- C    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ ]" ~8 l7 P/ q% q5 s3 J
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; + ~) X1 f1 H7 J0 [; t. W
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* w0 q6 w  o  ~7 {; f( O4 X+ @  B' B' g1 x7 u
    mcasp->regs->XSTAT = 0x0000ffff;
% G" \2 @3 ]% _% I: y. p  o& K    mcasp->regs->RSTAT = 0x0000ffff;
: [; E$ W* H6 N/ U, L2 p0 d" u' ~( S, V5 ?  C( n
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; e+ b" @& a7 E' J9 k. v9 ?; S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ g2 P4 ~! `% z! y" l" s$ J! N    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. @4 f. N2 D  c; h: i6 _! d    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );4 x( a& d# E5 V+ v' {
& N+ X. V/ M8 m( D& K
    /* Write a 0, so that no underrun occurs after releasing the state machine */
+ n1 S. ^; H5 n% ]    mcasp->regs->XBUF5 = 0;
- T/ P; J$ H  T0 ^    mcasp->regs->RBUF0 = 0;: ]) K! I! b1 B6 a5 b7 ^

, c& t5 G- w6 f- o7 P9 o    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& B: X6 X; I2 q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );# m. f  ~5 {. U7 ]
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; - B7 C4 s0 K  L; `. c
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );& Z9 B- Y; Y* h
0 Z9 m" t- c7 J* _& e* |" y
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 2 H/ K+ t8 L3 @6 A, w$ t+ }( L' H6 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 c5 @2 ?5 K! \1 q1 c! s    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; / s0 I# g3 B7 u" P  y8 C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# ]! K- i. ~$ X5 \5 d) O! b4 @( U
: J" M9 T3 o$ _. Y  X6 N0 }
    CSR = 0x0000;
6 F5 j1 E, U- \4 X    INTC_INTMUX1 = 0x3d;
! i. m; t8 x. V0 c/ V5 b# ]    ISTP = (unsigned int)vectors;! b8 L) Z, q' ^. M8 b
    ICR = 0xFFF0;  ! S: N  u8 a1 g% g
    IER |= 0x12;  & t. _2 N& l$ m, `
    CSR |= 0x01;  % R/ y$ \3 M! ^

/ t( N8 U4 A- c: g! }: F0 H2 t" }0 I. ]% j/ g
' V$ ?  n: n* x* _9 F2 ~
还有就是两个输入输出函数:
8 m' k0 c% L/ O. ^+ `+ |void output_sample(Int32 out_data)) j. i! U+ Q* W  p. u
{
6 u+ g# b* \4 y/ V$ J  m  AIC31_data.uint = out_data;  
) w+ B9 [0 j; z4 |  MCASP1_XBUF5_32BIT = AIC31_data.uint;1 w4 S0 q8 s% P' P$ P' _1 m
}" t( T) `- @5 b. q

  T1 X: S) }$ K1 T& h5 U3 ZInt32 input_sample(void)
/ C$ l6 X; L9 _7 \{  
+ L5 h) M& [$ [( S; j6 c6 w  AIC31_data.uint = MCASP1_RBUF0_32BIT;; |0 n& _1 r' c. k2 M" j: D
  return (AIC31_data.uint);1 M2 o& ?0 L, c0 y1 f1 n# W+ d
}
8 l- d4 T" N6 q- H2 i$ y* C' x5 `" r3 C0 t! l0 _

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




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