嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# k- r1 K8 h! D# a9 {
main文件:
8 }# g1 q1 t$ U2 w6 Yinterrupt void interrupt4(void)  ) l/ l/ S8 P( j/ K; c6 L6 J% p
{
; I( a" p3 j1 j* U* Y# d2 G8 B  Uint32 sample;
6 b4 C# C* c3 p4 `6 K( w1 g2 u0 E! |
  sample = input_sample(); // read L + R samples from ADC
+ k/ o, _, N" H! ~  output_sample(sample);   // write L + R samples to DAC
6 F% X# |" V5 z4 G. l4 c  return;# \. Z1 H' q0 @' m
}
6 j0 D& w3 b1 t* B" B5 Z+ l
: K6 s2 d' R; x% T, E; ], y6 U3 Z# Z% Wint main( void )
3 W. z- w5 z9 K, Q* U% U) s$ a: J2 i{! f* y; Y6 N- h, g, B' z

* I1 o2 ?$ t. B    /* Initialize BSL */0 I1 x. o$ |  {# w+ P
    EVMC6747_init( );
4 L2 Y# H1 y) x8 N        /* Call evmc6747_intr function */$ A; H3 c$ S, x" d2 F4 Z, a& _4 M
    aic3106_init( );
" P$ ~& D6 x9 \: |% a        while(1);
1 _0 [9 @) `0 J) z& x}, `+ |5 ^3 G3 L6 L+ h# @% ?
9 O1 u9 g9 Z6 t: I# u! J2 V7 }( B
- H6 n; N2 c. |2 Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 b$ k1 w- D  _8 f+ {/* Initialize MCASP1 */
% C1 S9 k/ J& \8 r4 M  P    mcasp = &MCASP_MODULE_1;" Q9 w! ^4 X2 Y( m" h
    mcasp->regs->GBLCTL  = 0;       // Reset; M, S3 n2 S, k$ d) M5 h2 q0 N
    mcasp->regs->RGBLCTL = 0;       // Reset RX
9 U4 \+ ^: {5 b- }  Y    mcasp->regs->XGBLCTL = 0;       // Reset TX
- Q  |/ K2 w0 `, k! N# n- c    mcasp->regs->PWRDEMU = 1;       // Free-running8 }/ \) D" }' `* F, x  X; U
   // configure McASP0 receive registers
6 N, u( S' l; x' q  F+ H7 q    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used# v- e% ?/ j) g  m; s- {( y+ w
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 m7 U1 f: l- N- H
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* [9 M' n8 A9 R) K# m9 \6 d    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 k/ q( y" D+ J0 V4 ]- G4 p5 B    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
( I/ |4 X; l9 M+ k  e; g! l- k    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
# Q9 i- L2 }2 c6 y8 H1 ^) q6 u    mcasp->regs->RINTCTL    = 0x00000000; // Not used
1 s! }+ s6 g3 P# {& Q% l7 v    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& P, I: F( b3 X4 Q  t/ E6 s- O1 P: h5 b2 p
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
+ ], ~, d! r4 ^- o8 K    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 |! y+ r+ _  S4 K' S
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word6 s+ Z$ _+ \6 b9 n
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- A. P) ^2 s2 H( H: Y. P' ^    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
# O9 C+ }0 }" J& p( Q* S    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
, B/ E% H4 @: i; p6 ^    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
. j& V5 {' d: k3 L    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 W" {7 {2 l+ L
9 u* n# [; m0 |  u" j: N. j
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
' _# e  H$ H+ J    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
1 B8 S' V5 j: u' O. M; ?- E    mcasp->regs->PFUNC      = 0;          // All MCASPs
- w5 v4 x0 n8 h! a. r7 Z, D  [    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 f. u$ j! a, J/ Q+ M& J9 j

7 S+ F  j9 {  M# f- i7 {    mcasp->regs->DITCTL     = 0x00000000; // Not used
( f4 y1 B" v8 ?3 _    mcasp->regs->DLBCTL     = 0x00000000; // Not used! B0 b5 ~/ d) E
    mcasp->regs->AMUTE      = 0x00000000; // Not used4 o+ C3 c/ ^2 [! u" D6 |- w7 a

( T4 ~, v  S) a) o% x/* Starting sections of the McASP*/, J2 [8 B( A8 U: d
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 f0 N) O0 G5 U7 X' w/ S: m    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
6 g4 U3 o( ]" m    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & X7 x& ], [4 |- g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );% d& t( m; O4 A
; ]. i# y( r# A, ^$ Q( W5 ~8 P
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; + q- ]0 Q! @+ F
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );* T1 s4 N8 U5 S- Y$ h5 n
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 [, p; F) K- n    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 }0 k" `6 I$ n0 [9 G
7 G! V& H  M( L    mcasp->regs->XSTAT = 0x0000ffff; 5 O2 _  N$ c! `' `0 v( X& q- Y* ?7 b
    mcasp->regs->RSTAT = 0x0000ffff;
  ^" @. h" m  \7 H# h; o: c0 x; G2 R( M8 |) h& M6 n3 b
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 k- [  ^( H! g* v! D, p: V    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );+ g( q* ]0 T  J7 B  i9 V+ i
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 I4 A6 V9 }4 m5 N7 W$ n* `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 E* l8 p! x; F' A- A
$ Z* w& |, i& T    /* Write a 0, so that no underrun occurs after releasing the state machine */
' F  |  k$ }- G, ]0 B    mcasp->regs->XBUF5 = 0;
* A, P  X. c1 T* G  }) Q    mcasp->regs->RBUF0 = 0;
& y2 g1 @5 M1 q1 n& D
- F, U% A2 k1 ]9 P$ {7 Q    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 J  D, s# b+ p+ o  ]" t5 L    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
: t3 p8 b( j; N9 P$ a    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 Q: \  S, y/ d/ r    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );- _' ]- ?$ l( n1 l
# J1 i& u8 e4 A: k- S( e) ^) O
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ f; N+ H- E5 P/ ^# `. w  Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# W* L1 }6 R1 F8 g4 h+ \; L2 x% c    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 5 G6 X" [0 q" K, ^" \6 M
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );6 c3 [4 d0 {/ M8 a& @" \

  y, j+ M" n6 y( a+ J    CSR = 0x0000;, a# Q( L. b' ^: H) c2 |8 y, V  ^0 e
    INTC_INTMUX1 = 0x3d;
! @% l1 j1 _% m    ISTP = (unsigned int)vectors;
) p$ J3 e! G9 |, z, e. {2 a5 ~: Z    ICR = 0xFFF0;  
" L( Z" i0 z: T. c" x7 R4 ~    IER |= 0x12;  4 ^& b9 u+ \6 |9 J
    CSR |= 0x01;  
, h. V% d. f& X( I# F  O  C0 i+ ^% T  H7 m

5 w- l8 _) a3 V* v1 n$ c+ k
% d+ d$ ?  s3 l9 _还有就是两个输入输出函数:- D5 t  y; i; `4 J" i
void output_sample(Int32 out_data)
6 L# e% z' p( a: G0 j1 D{
' R# B2 z* k" s) Q+ ~2 w  AIC31_data.uint = out_data;  
9 z, n3 L" {8 o( `  e+ q8 M  MCASP1_XBUF5_32BIT = AIC31_data.uint;' z5 [/ z9 r4 N2 Z0 i
}
1 O, _5 }) Z. C  N9 N" X+ q4 K, z! ?! P+ e) {
Int32 input_sample(void)
4 B; G' _  c4 V) E) E' |) F{  
! U7 M' h! C7 e! Q$ c  AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 a5 |/ T7 O" }& U: T$ f2 r  return (AIC31_data.uint);! ^( R. B3 [6 s* a' j( |" R( }
}
; f4 X2 h9 C6 }# Y/ U$ D1 E6 N( r6 O' m2 O1 S" R

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




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