嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# S. z( @$ M2 ?7 b, @
main文件:
; C4 I# k, b  x  q8 G' [& Binterrupt void interrupt4(void)  
, H- Q" ~6 V" `; o0 R{
, B. ~# n4 a  I) C  Uint32 sample;/ ?7 k+ G6 ^/ i7 U& m4 M+ ?

! c& V& e8 T$ m; q  sample = input_sample(); // read L + R samples from ADC: j- V, Y! T* T3 I9 P" F
  output_sample(sample);   // write L + R samples to DAC ) F9 r, X9 x8 i
  return;
4 `- o8 _' {& t( t7 l% u7 ?}' i2 j$ j9 l# S4 q4 A8 ^9 I
* D: d' r- h  d5 O( L: E% N9 }; H' K
int main( void )
- x# @( H  }: m. z0 A& ~( v( M{
. h; \! N" |0 f3 q
" Q: I( E( T9 [! s" ^; \    /* Initialize BSL */
: j" J! |. q3 Y' f% R! h7 |    EVMC6747_init( );2 V3 m& {! a* _5 Q- W) d
        /* Call evmc6747_intr function */2 r' H9 S. `5 E9 i- B! \3 _
    aic3106_init( );3 s: m1 l7 i: Q7 o- F! v
        while(1);
( I4 X/ q# |; i- O( i, V4 O& \}
) }- F; J* g9 T- ]
4 G- ~8 R/ }" V/ C* D' J+ J  a* W" ~* O9 p5 @) {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题; w' \. Y' d4 d$ r$ U$ d
/* Initialize MCASP1 */
/ g0 ?2 S* N% V' U. a6 ]8 E& x9 _    mcasp = &MCASP_MODULE_1;8 L7 H5 R' G# n
    mcasp->regs->GBLCTL  = 0;       // Reset
! x) u7 A; [+ D8 N# E2 r2 [    mcasp->regs->RGBLCTL = 0;       // Reset RX
. t2 p5 v2 T4 t' S, b* A2 i2 S8 E4 j    mcasp->regs->XGBLCTL = 0;       // Reset TX4 O1 G0 }) i* X- j, ^6 f; i
    mcasp->regs->PWRDEMU = 1;       // Free-running  }& }1 g' l- d1 J; _
   // configure McASP0 receive registers6 o# Y0 T% P( m5 O& D* o
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
  @, C$ e. Z6 w8 ~    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 m1 N* R) d* c  B, f# x
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
. S, J: s5 i. e    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, Z+ N" z0 d  v. a* B# i    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)6 |; \/ e* `* [* c
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
* S5 |  K% ]# e2 @    mcasp->regs->RINTCTL    = 0x00000000; // Not used0 \0 B* y2 ]6 W7 p3 m  S; A! K; M
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 ~" ]8 S4 Y, m/ K0 K. T

- G& u. a& Z( T8 I3 V    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
% }/ f- Y" `0 D( X/ y    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% o8 b( Q' F: S: u2 H; P    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word! V6 {' i* Y8 T( k  m1 f- E6 p
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 j2 u: `6 v+ Q1 M: D' V$ o" y2 @
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
7 V1 W' ^2 D4 m9 A* F; G' {& i0 W5 V    mcasp->regs->XTDM       = 0x00000003; // Slots 0,11 c0 y% Z5 n3 u' v& W
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit+ m' t: Y% |* J; K& c
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* X0 `" f. ~# F7 S

9 J& P7 ~7 }' {    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
" z, w. X" D% i; p' W1 p2 @# [3 i: i    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
- |- ?6 ?$ m3 l$ b) X0 y8 a    mcasp->regs->PFUNC      = 0;          // All MCASPs  k9 G7 w5 d' ]( k) d9 X& Z
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1$ Q$ T% N  ^3 M, V
5 m+ b8 `/ L& t: |* C5 d% ]
    mcasp->regs->DITCTL     = 0x00000000; // Not used2 l( b8 F7 }3 i% {" e
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
1 u! S4 H7 F% ?4 U# d! b    mcasp->regs->AMUTE      = 0x00000000; // Not used3 N2 h0 w: K3 ^6 g( z

$ q8 z7 X0 w. M- y8 F3 t# I/* Starting sections of the McASP*/  v9 M' q. f: _7 i
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' ?+ |4 |& N/ X1 ~0 V1 I, v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
/ |$ @* R* X5 m* M2 \( ~2 w6 O/ [    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * ?7 f* A1 H, z" e' ^$ i% A6 j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );5 i5 R& g4 ?3 u2 s/ y2 A  g0 h
4 f/ k) G( w. @
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # c9 f! y  {4 t  s# l7 O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );# `: S  ~/ }$ A! F( b9 \$ j
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % Y7 [/ {$ H# i2 h( I, i' l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );0 k# f0 P9 G( q. Y2 u5 z5 ?

" {' x. o2 x1 ]8 a    mcasp->regs->XSTAT = 0x0000ffff;
7 o7 \% S  g& `* Y; _' a7 \8 n    mcasp->regs->RSTAT = 0x0000ffff;
! k3 V$ q& O% Z% h& p6 y
0 m/ l( g' e$ v; k- h- y    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
) d  {# k; i/ p2 V$ g( g) X) X5 j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ H- z! U- L5 B& `6 g) X% D5 n    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; p4 F0 n* j5 m2 w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) o3 G) \( l( U( \3 L* }" t' k
0 u( X# G% v5 d  Q9 J    /* Write a 0, so that no underrun occurs after releasing the state machine *// \8 i. a# Q0 E/ b7 ?2 y/ k
    mcasp->regs->XBUF5 = 0;/ s; ?* S5 w' w& o1 H* q; I
    mcasp->regs->RBUF0 = 0;3 _/ \0 \* K& u& ^0 N, f

% w* `8 F2 R2 o, N4 b    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 9 t4 k1 u+ ?& D  q# @- \% a4 K
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" }' @! e8 ^9 a; j; ]! x0 x9 c    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , _7 [! O0 j! I. e2 ~
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );6 J. E2 F0 A& j) ^5 W7 q$ \
/ f$ z) n8 p( w& ~% \1 \) J
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 0 b$ ]% u8 v6 u  `+ u8 d* L
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. a5 p  Q9 k! \7 G# }1 [
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 L6 _3 ]- c+ I9 d- h! ]0 G    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, Z7 G+ _" F' v2 W! k

6 W. }' W; P  i' Y; S0 }    CSR = 0x0000;" y! {+ {8 e" j
    INTC_INTMUX1 = 0x3d;
! c2 \8 Y, J4 u2 z" a( m/ a    ISTP = (unsigned int)vectors;
5 }1 n, w% C. k+ H6 F) L    ICR = 0xFFF0;  8 h" X- Z0 f0 J  p' d+ c) a8 D, D
    IER |= 0x12;  0 [( A) S$ E+ N, h
    CSR |= 0x01;  
2 @. w, f- P, H: W3 y
7 s0 r: f. F: b4 u! m% v' J! B% i9 T9 r
/ O/ y$ d- h, U2 e
还有就是两个输入输出函数:
6 g4 \* Z6 v8 M$ @7 `void output_sample(Int32 out_data)" F5 z! x6 |7 R; [0 g( P4 `
{6 B; E1 Y$ L/ x
  AIC31_data.uint = out_data;  
0 A; ]/ b: l" b4 g. w; |  MCASP1_XBUF5_32BIT = AIC31_data.uint;. `, x9 h: a% N
}
$ x! u& n" o$ E( S
. J3 @1 m, \/ ]2 w7 pInt32 input_sample(void)
7 ?" l! P6 X$ W+ j% n' z{  ) r( k( W5 b& ^/ z/ @; |/ o& P
  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ `; [- L7 [/ A
  return (AIC31_data.uint);
/ T/ R6 E& I. T! k; E( K}8 m$ h' k& f1 B  S4 `. X

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




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