嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& m& @( K6 t( W/ S% e! g7 Nmain文件:
6 w% ?+ X" n' a6 {2 hinterrupt void interrupt4(void)  
2 y' n/ K& _& @1 {' U{% H: P% V: c4 v# ?, t4 z3 ]8 Y
  Uint32 sample;
; g, ]4 o3 j. A. ^0 D6 z1 {) b
) p5 d! Z# m) r! _0 K, L& E/ {  sample = input_sample(); // read L + R samples from ADC/ h$ L1 ?: i0 m% H& L! Z8 x
  output_sample(sample);   // write L + R samples to DAC
6 K  t! l) [/ N  K2 Y: q( p) [  return;
, c  ^- z! C0 \}% _; X/ D7 Z  ~8 r

% G/ O; B7 q$ W+ h% m; b$ y  [8 Wint main( void )
- G* n8 J! A2 H{
2 ^- r/ s$ H4 o+ s4 K
  i' g( W  L, ]; R    /* Initialize BSL */
$ A- s: W- s  Q- M* x  E    EVMC6747_init( );% R) R9 Z  \1 N  X2 G# M3 e
        /* Call evmc6747_intr function */, K: e) u1 C" w+ `
    aic3106_init( );- i7 }  ^4 n0 q
        while(1);
( G3 u* L* r$ }6 \}
; Q0 m' f2 e: }/ \9 o
" ]+ p- R3 y+ x( v+ e" A6 w' ^" x  i* }, ?
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* d# ^: o6 {5 e5 t3 d6 C/* Initialize MCASP1 */
+ s+ V$ P, a2 Y* V6 u- F    mcasp = &MCASP_MODULE_1;% @( p1 A3 [3 q* [( m" n; E
    mcasp->regs->GBLCTL  = 0;       // Reset
) ^& G( i. m) l# r9 h( ~    mcasp->regs->RGBLCTL = 0;       // Reset RX3 k! I: E) |8 @2 c5 d6 c
    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ n+ O- `' Z5 {4 c* `    mcasp->regs->PWRDEMU = 1;       // Free-running
" N$ L7 D0 a  j3 X9 d# |; N  }   // configure McASP0 receive registers0 K: R& ^2 }. n1 j: h
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used2 I9 Q2 Z/ t1 y7 C4 m
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 |8 r; y. g! Y    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word" Y/ B$ z: J. [1 a0 x: O, _
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, }( r: O- h4 ^: Z. Z" X, v: H  o    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)& B( w; }& ^" B) R
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
+ V3 X; f1 l' p  Z' _1 P    mcasp->regs->RINTCTL    = 0x00000000; // Not used3 i% Z2 p5 C( q0 B2 {  ?$ j1 i6 B
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 \! H. G: ]: H) d# J
7 H: s4 g9 ]0 i+ t: U" m/ N9 l
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
( g$ Z& y! l  _( p+ W; E    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! z5 p5 B- z  b    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( ^/ G, {" ^% d    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 M5 N: ]6 [7 s( }2 W8 s
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK9 I) E/ n) T! n
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
* X% U  ]) t! D" k    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit. z9 V7 |" a9 X6 n% c0 i
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 R8 y& ?7 s% e, k2 t! z) [

; ]- x3 J7 j& V# w; v    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
- Z; o( k" g& L+ R& L    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT7 i: j2 A" e  {  C. e% L
    mcasp->regs->PFUNC      = 0;          // All MCASPs8 Z* ?: e+ c) r
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX17 S$ F( @, ]9 T

' m# G) d6 f& I: y, L    mcasp->regs->DITCTL     = 0x00000000; // Not used# N' I$ D0 V7 A- A
    mcasp->regs->DLBCTL     = 0x00000000; // Not used/ x$ Q5 `3 K! C' M4 M, S0 S* M
    mcasp->regs->AMUTE      = 0x00000000; // Not used: u" _$ G2 r; T" s& ^+ R

1 y% T: V. J8 @. Y1 n  z  f/* Starting sections of the McASP*/
: F1 j) T# r4 I' }" b3 @- @    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 a! a$ V: A) X0 E( z7 u* k/ C; _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  - U) g' d3 ~" G  y4 W; n0 K0 z. v$ ?
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & ]# [0 L2 u+ S5 \3 ?# Y& G( a
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 p" f6 T, J5 Y8 f
! e& B3 q, Y! T! t
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
! y. d* ]1 L6 d% S9 l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );- U: P" O& N! ?- V9 x0 e1 Z
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) [9 d3 _2 n/ R5 a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
, n- {- Y9 z; s7 }; V: ?. m  i3 _0 i4 \2 F: j
    mcasp->regs->XSTAT = 0x0000ffff;   z4 [5 x  j8 B% _
    mcasp->regs->RSTAT = 0x0000ffff;
7 [1 _7 j$ ^4 e9 V6 p+ Y9 u  r
& f9 W7 w; [3 \1 R    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;- H: s: b4 [) I: i3 ]% C
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. W9 V/ I7 V8 B/ u    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 h1 ~! H) P" x- e5 N& L
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );2 L, t" }2 H, A  _( [
+ r: x( W8 o$ v% [1 D3 x8 ^
    /* Write a 0, so that no underrun occurs after releasing the state machine */1 r: o3 a- t* [% m! j% X
    mcasp->regs->XBUF5 = 0;
5 l# ^$ e0 ?# Q  M2 F& ~- c    mcasp->regs->RBUF0 = 0;
# i' t0 c: Y- d& d: {, U- v
3 {  d; n% q: q1 v    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
+ j* _- a0 z: ~) w1 B2 _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 N" R1 ?0 A" U: k0 l7 Z    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;   j, |$ f7 [- `# H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );5 [$ x6 S* a) L2 T# x. X

% d# S2 c2 o' s# `, J: H. W    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # M! Y7 C" z1 @, A' o% n
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 E5 v- x  a  t' N3 X    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 M3 w4 j" F2 m6 ]0 N0 e- i; ~    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% }/ S- k/ R& O2 r5 v) S7 Y

1 u+ N- @6 m! [2 `+ q) A% ]    CSR = 0x0000;3 p% j& a5 ~5 y- ~; V
    INTC_INTMUX1 = 0x3d;
( [* P3 D3 |  P    ISTP = (unsigned int)vectors;2 k: w' ^0 R3 @" h
    ICR = 0xFFF0;  . I& ^! \; L9 h- B( i- G
    IER |= 0x12;  
5 Q/ |& Z+ E' s1 y    CSR |= 0x01;  
0 ?$ c* I( o' \& Z+ S, R( l
' q( _% H1 {) r
) G% o: Z* E. v: T- V
8 R7 @; S) E9 j% Y还有就是两个输入输出函数:. [% h9 l' \0 `. J9 i; [
void output_sample(Int32 out_data)$ T# f" L. e, `8 m' ?$ I* k3 D
{# I  i, X1 q, M5 q9 V( S9 J2 j
  AIC31_data.uint = out_data;  , X# j; L5 o  h* ]7 }. Q, [
  MCASP1_XBUF5_32BIT = AIC31_data.uint;! Q+ D/ @7 p# ~! j; G' X
}
; E5 v6 c. T2 i; n  P9 l0 e4 }% \2 R5 o
Int32 input_sample(void)
% u2 [* S2 N0 p( h, S{  
1 G$ ^$ \; P+ j# ^  AIC31_data.uint = MCASP1_RBUF0_32BIT;5 g" E' m5 \' q3 a( H
  return (AIC31_data.uint);
  s; c) G2 h1 h# F* q/ r}
; F0 B) c& n/ G( x; i, I
+ ?/ Q4 s! N* [8 P2 z9 q2 L- q
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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