嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 z5 l& |' k* g8 t8 `
main文件:  \8 R+ O- K5 u: `% a2 v) E
interrupt void interrupt4(void)  
* T& {! a1 S  m. x1 n{
" j$ ^. y, z7 b$ E- `2 K  Uint32 sample;0 \3 J1 E. \0 H+ \) ?! [! P# i4 @

& H% d; D$ _3 G9 o! M. l6 _  sample = input_sample(); // read L + R samples from ADC
2 o% B+ V3 U1 e4 w! j, h! f. ]  output_sample(sample);   // write L + R samples to DAC & I$ O2 U; h$ v
  return;
: m7 p5 Q+ s8 W6 ^1 n& o}3 v* t6 x6 M1 }9 Q" S+ x
" ?: t7 T4 M# C8 @. f
int main( void )
9 }# o: `: h' W{0 Y  z1 V) X, h. C- ], Z
4 F  g% O* z" k5 M2 R
    /* Initialize BSL */
8 m8 l, O- e) J$ t6 J    EVMC6747_init( );
' [; ?" L: n/ J4 J0 j" z        /* Call evmc6747_intr function */! ]+ L  G2 U# k, B- S% A
    aic3106_init( );( m  }, [4 T; ^
        while(1);& g8 g+ O/ w; a
}
) ?$ M& Y  L0 A/ E( g, T; d$ Q& ~: V  y; T; G. R, e; X# c
8 W" m' ^  r0 d3 @7 |: O' Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& l6 g. E, q. j3 V# i/* Initialize MCASP1 */
% ~4 E6 e/ H8 v    mcasp = &MCASP_MODULE_1;
0 m! h; a) o$ D3 u5 }$ n& k" _    mcasp->regs->GBLCTL  = 0;       // Reset
4 G- t' E. E' E3 H  F    mcasp->regs->RGBLCTL = 0;       // Reset RX
9 Z' z* L: h4 Z) K    mcasp->regs->XGBLCTL = 0;       // Reset TX
6 u( u" S& |) [* t( L; J    mcasp->regs->PWRDEMU = 1;       // Free-running
! u% Q5 y2 D. g7 P; W# Z  m   // configure McASP0 receive registers4 t: M3 _! ^0 p) c3 L6 W$ V9 P
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
3 S9 W* ]6 ]+ f- L6 D1 T7 g, V' y    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! i2 ^9 x, K+ o9 l
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 w- [( S7 X) k, }5 y2 F    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)& S: B5 }) `+ e6 X4 |6 J6 ^
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)  r5 m- d# J8 T3 p# x/ T+ E
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
) {) w$ X4 L& |3 g; a    mcasp->regs->RINTCTL    = 0x00000000; // Not used% R  n4 b2 t& G* K
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 ?0 _! P, q% }  P& r: T3 k/ J+ G; v$ y( V  N: u
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
" I6 l4 G! F+ S) g/ n2 \    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 N4 r& I1 n2 O9 h# y& X1 N4 t( L
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word) t3 T: C. U9 X- k4 ^: {& L9 @2 C
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16/ v) }5 q1 r7 y& U/ v+ r# m7 B
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
- |$ v: b) `3 b/ y* z& {    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
; Y0 G' a6 J5 x    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit1 e9 j3 P. {& X8 R: l
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" g; ^5 p" {- Z" u
" J0 k( U1 `6 c7 C
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
% ?2 b- s/ P9 b$ b- I$ n; q    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT% L$ u% X# z- [
    mcasp->regs->PFUNC      = 0;          // All MCASPs( A" R+ v+ v0 `- t" F
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX16 w- y3 P/ R( @4 G8 l

* g1 o$ [/ d0 S    mcasp->regs->DITCTL     = 0x00000000; // Not used9 Y% H$ F7 _- K' g+ `
    mcasp->regs->DLBCTL     = 0x00000000; // Not used1 P7 D. b2 h% ~: `3 V* `0 F
    mcasp->regs->AMUTE      = 0x00000000; // Not used
" ?3 o' M8 D8 J$ l9 U4 ~
+ B1 W) A4 ?& \$ I' B, z/* Starting sections of the McASP*/
, r! \& w; n/ G* v6 I+ M7 R    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 H) r' q! ^. c7 P    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
' Y5 f$ f4 A, @2 k5 P/ _    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 S0 h' O- y. k* ]- D! H. h
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );7 k0 G7 K- o2 g' U2 |

$ T! B3 c" L. E2 h7 c    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 S! |: _  F2 f+ ]    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 F' r4 Z% @( Y; P% {
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 0 N+ K" y& \$ e4 x
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );7 P4 y3 [$ L$ J; I8 k: ^- Y( {# L
. R4 J% e) N+ g) o8 g9 q
    mcasp->regs->XSTAT = 0x0000ffff; , [. o0 b  s2 ~0 J: p
    mcasp->regs->RSTAT = 0x0000ffff;
3 l4 N/ s3 d- x9 z9 `( n8 m+ _* t* Y5 U' o, {& S4 T: `
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 ^8 j2 n# _7 b( U
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );( w: s! S0 J! l2 }2 g# L
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & Z! W5 a* q- o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: q3 y6 f! M1 F2 \+ K+ e5 h/ y. K; Y% J" N( |# D9 D2 R- l
    /* Write a 0, so that no underrun occurs after releasing the state machine */
$ }" R6 @# n, B7 G5 d4 [7 A5 X    mcasp->regs->XBUF5 = 0;# r  Z/ i6 ?) p2 C
    mcasp->regs->RBUF0 = 0;
& ~; x# Q7 Z0 w8 V2 ^2 F
1 P9 }0 {5 Z( }5 s: G    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& L4 T8 L3 p' e2 e7 Z    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) b3 k4 n. _9 a    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% D2 T5 i' F9 x    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% v; x( {" r3 L* n2 B. X# g
0 y' z1 L  p$ Q( {- j) I  U4 V    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! _5 v& F9 F% p  E7 l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! [# D& q* p4 `) u1 i6 z    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; m. n( y7 [/ e0 X- l- [
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );1 a1 Q' O( n* Q+ ~  w
* Q- h) N: [" O, ^5 w4 x
    CSR = 0x0000;
9 R3 ^+ z1 Q- {* w" V" h    INTC_INTMUX1 = 0x3d;
& F7 S+ e2 F5 H6 k    ISTP = (unsigned int)vectors;
4 v) z0 c1 R6 t# r( x" z. \, F# i' O    ICR = 0xFFF0;  / W# i8 D8 {: B! P: u. m! B% s( `
    IER |= 0x12;  
( {5 a  V4 j' v. f- e$ ]( [. I    CSR |= 0x01;  
8 d' n7 g, W4 w9 i0 ^0 w, O5 d! X* X
* y3 p9 i, [( c$ X. u  x  `8 F2 C- r, k1 {3 h- U2 w7 F
1 p& i: E" ~8 R) ?4 Q5 H* m! {5 N
还有就是两个输入输出函数:. ]( ~+ c2 I& A% Y4 x
void output_sample(Int32 out_data)
* O/ r, v8 }6 T0 e4 m{
% @" x+ D1 x/ |8 P) I  AIC31_data.uint = out_data;  
8 Y  F& X) J! k3 _  MCASP1_XBUF5_32BIT = AIC31_data.uint;
& k- T9 x* F& J% O9 X}
- y: x& Q3 s& u& v2 P
# Y" _/ V9 P5 }Int32 input_sample(void)
" l$ f8 F4 n8 u: `- x{  6 l+ Z5 M8 |' v% V6 S5 V9 Z
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ x4 S6 O, H/ t8 B3 S  return (AIC31_data.uint);
: r, T2 `; R7 u; v* O# t}
! V+ ~2 @% R, e3 b0 X+ I/ u) X# `/ q( {

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




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