嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ W' ^0 u3 b- _# H+ A* d  ^) T. imain文件:
, [9 P6 ?3 ?) y8 Hinterrupt void interrupt4(void)  4 u0 c: @( I" F' M* V
{
2 `0 B/ s1 |6 N* d5 K. C; c8 |  Uint32 sample;1 l5 @* b* T; S8 q, u; |
5 S" m7 C  g8 Q, S; o% w) s
  sample = input_sample(); // read L + R samples from ADC+ c. o; X- M7 _/ S5 c7 w
  output_sample(sample);   // write L + R samples to DAC . j( k5 `' H' ]% B
  return;
' h/ [7 f+ A( i- f; N}
: D$ l3 i$ v+ Z, U3 z; C  M0 P
% q& n& ?+ C: h+ U. e* Iint main( void )- C7 X5 k- z4 W5 Q( m  \, M0 A2 F
{2 o0 M) N# `7 J0 V2 K* H0 |
! y( {) ~" E3 a  C, w& ]- X, ~
    /* Initialize BSL */
, j* w9 s$ E; ?6 _    EVMC6747_init( );# V2 p0 L+ r0 n
        /* Call evmc6747_intr function */; P. ]- ~* l" ~$ ?7 m! k
    aic3106_init( );
6 E3 Z5 _! C# l7 I2 E% O2 X1 ~5 s        while(1);
" A0 T- `( Z0 q; v}0 h7 |4 t# g% R
0 Y% J+ |4 Q7 n3 e$ i  ]' I4 K- |
5 B+ h# e. D5 H+ h" ^7 P+ Z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& R2 n! g4 B; G/* Initialize MCASP1 */
) ~: ~* Y$ L* [$ e2 X" v0 y    mcasp = &MCASP_MODULE_1;' k( _/ W7 H" h' f# H) u
    mcasp->regs->GBLCTL  = 0;       // Reset6 E8 q( x- b- U( }# e* `: [8 P% s
    mcasp->regs->RGBLCTL = 0;       // Reset RX
% W5 b! D2 y* s/ c0 h) G  N    mcasp->regs->XGBLCTL = 0;       // Reset TX
. F& A' K, n, w6 C$ s    mcasp->regs->PWRDEMU = 1;       // Free-running
* E: u% E& S8 O, l' G. y   // configure McASP0 receive registers  O. p+ L: @5 Q! `- W
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
! J& O9 _" v! I$ K4 F* N  o    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 |% Z: ?; E. E& i
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 E( d* N8 s# l3 o) T
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& D0 f7 @5 \! d/ [    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
  w7 Q$ f! e7 A5 r    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1, K+ |* q3 a$ r# H7 H
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
1 r! L- h8 S& v5 r% F% ~    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: Q7 i; A9 [) R" T9 o
3 R1 V/ A8 E9 b' v5 r# ~+ {& C7 ?5 [    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
# W& j% _/ O: @9 [; j" w5 O    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 \% B, s( P* K! r
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 h7 B' p: q4 {' Y* d: z; Z    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16% t  v! g/ h$ R
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK' x2 _7 ?0 s& f1 U
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1! O" s) ]) `- R8 t3 V7 K5 P3 k
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit  c; J! }% f1 z1 _  x7 Y8 T
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! n( R+ `( \' V

9 j7 u9 h* u5 i; G    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN% ?& s; D- M2 ]% i# |9 c2 G
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT1 U. r; S" Y3 c3 ~  V0 H% z- f
    mcasp->regs->PFUNC      = 0;          // All MCASPs. h  z# O4 Z6 }- @5 j6 z
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1; }- \3 C7 e. Y% T  T9 i# A: U

# e  i8 e/ X% a. \# `/ x% E0 l; ?9 }( J    mcasp->regs->DITCTL     = 0x00000000; // Not used
# t. p2 J5 C; ]0 N5 M$ j    mcasp->regs->DLBCTL     = 0x00000000; // Not used
, X' \) U, w( Q! i. ^8 H1 H4 I    mcasp->regs->AMUTE      = 0x00000000; // Not used+ O4 s& b+ I. R9 M; z' w# t9 a

+ y. N2 B: z2 z: K- u, o8 ^/* Starting sections of the McASP*/6 U( Y0 Q6 b" t7 b: f+ D
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . l0 P- b1 j2 g( Q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  . S3 v& G/ G, v0 N& u" G
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ t- m9 V' o2 I1 r    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 F1 _% t1 o0 C1 w. I  w( `4 G0 A( M
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 z) n! G! a( k% _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 t% K! `, t% j" T) G# E    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # u& V& n8 c7 c0 }( `9 R, K! \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ a1 ~. G( ]" r5 y8 {/ R: e

& R2 y- H( ], Z8 w2 r3 _" l    mcasp->regs->XSTAT = 0x0000ffff;
9 L/ @8 \# z* H    mcasp->regs->RSTAT = 0x0000ffff; ) f) n2 B* [# |1 p; ]5 X6 U

' H6 h( ^$ L/ ~    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. h8 O" O$ z3 X% `; T4 a
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );* V% A5 i8 V* C5 @! |% L+ J% L
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ P( B/ q% k& I    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' s$ N, P+ C* W  ^7 O# O) l- g- a

+ A. r5 ^+ q" D) Z7 C    /* Write a 0, so that no underrun occurs after releasing the state machine */1 {& V. H! f6 \5 m* g
    mcasp->regs->XBUF5 = 0;
4 a5 G* b, h( J9 Y9 ]& G8 z    mcasp->regs->RBUF0 = 0;+ K  R0 S5 j# ?. j7 b- O) N

/ u( n8 K7 z: z+ ]8 a, d+ Q" z! ?    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 5 X  t0 X0 h8 F! E/ U  q& f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( ^! Z2 @2 G- o1 i    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 S8 c* M+ _+ p! z# N% k    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( \6 Q7 O* F) w  C
$ o' S0 l0 i9 {6 k* ]4 e2 O
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; & l7 {% h& v8 S0 D" k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );: R/ o$ c9 v4 y8 c
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 t! i' f) H6 R) Y* Y. q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 r# b1 M; s8 Y; p8 _
" f2 z# B  }1 L3 K6 q& F    CSR = 0x0000;
/ |8 @! d' s2 a" g, W    INTC_INTMUX1 = 0x3d;
/ Z7 P+ m: X2 w/ z2 \, i0 X$ n1 D$ L    ISTP = (unsigned int)vectors;! D" {7 f# M& ]0 Q% r
    ICR = 0xFFF0;  
4 J- P5 q- [% y% }, D9 s    IER |= 0x12;  
- Y8 Z+ h9 q* D. I    CSR |= 0x01;  - F# t* P8 w% w, @' A* @

" C: O2 n4 {* a
/ w5 h$ ]: R0 l- w- r3 Y( {, ~/ ^! E
还有就是两个输入输出函数:7 T& k  a' K1 W# B- e
void output_sample(Int32 out_data)
$ ~4 x- ]7 V5 h1 R9 M{; P. c5 G# a3 e2 [) H
  AIC31_data.uint = out_data;  
! K2 G6 \" k7 y. h6 i3 f  MCASP1_XBUF5_32BIT = AIC31_data.uint;; T7 y/ P% p$ u9 e5 m9 l" t2 X( w6 @  ~
}
8 P+ I: R8 _8 u. I1 }+ T2 i: B7 x0 m4 p% s) A; A0 e3 E
Int32 input_sample(void): }2 C* K* {# a
{  
. F4 ?) i. [0 c  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ E: @0 C/ o# r2 L
  return (AIC31_data.uint);
- `% ~( Z' I# B0 x5 k  r$ Y}# U, t" `: E# z$ w0 Q

7 _$ ~' s: t& H' `( q; `5 t5 R
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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