嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:  p* @8 Y" |' `" m1 g1 y' x. @9 H0 P
main文件:
6 N5 y! |9 @6 y/ a/ finterrupt void interrupt4(void)  
3 W8 Y! Q2 ~( @- O" ^' Y( ~$ g! s7 a{+ @. L4 X( P% o  T& U9 R. [/ B2 p
  Uint32 sample;7 B8 u; h# _( B* W9 }. e
8 V& R. U" [4 y
  sample = input_sample(); // read L + R samples from ADC
1 z: F# Y% k  q: |& ^  J. s  output_sample(sample);   // write L + R samples to DAC : @  b/ Y* I% r  X$ s* S
  return;
8 E' [1 f. J; w1 F$ u}
# t; v+ d7 M) Y! X, b8 @7 A7 s0 c; q3 o" `* [
int main( void )
: {. g; M' ^% n% M, m) ~) e& i{
& }- p4 a+ c" {5 e  t  P* K! L: a) `2 w' A. u, t0 S
    /* Initialize BSL */5 H4 D# ]* _$ G5 Z. x
    EVMC6747_init( );/ H  u  n3 s. ~4 o: P
        /* Call evmc6747_intr function */
( K( M$ l7 \  w$ D" [+ y, N7 K    aic3106_init( );
  G+ |4 z  Q* P        while(1);( }/ s4 q" M2 z1 F
}: Q5 X4 \+ a/ q/ y7 g
' p0 S/ d+ ?6 S

. g7 a5 l) o& F9 Vaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" p* K3 O/ j1 |, c/* Initialize MCASP1 */
* w( b+ c7 O! o4 p8 d5 v' ?    mcasp = &MCASP_MODULE_1;; Q" a$ j2 e7 _; k; x" R
    mcasp->regs->GBLCTL  = 0;       // Reset
: O; h: s) |( I- V8 N# k+ a    mcasp->regs->RGBLCTL = 0;       // Reset RX
% H4 n! F0 [- x" }2 N    mcasp->regs->XGBLCTL = 0;       // Reset TX) m$ K6 c9 e# {# s3 V1 [5 Y
    mcasp->regs->PWRDEMU = 1;       // Free-running# d" E7 `1 [' t( q2 q
   // configure McASP0 receive registers
% Q9 ^. X0 X0 H  M( y    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used( h  s' q9 O0 M0 n
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, e+ L8 b" }* G& U! C! @# a" r" R% F
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( I7 c- @$ ^' X' h: o    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
2 i) A% v5 L5 k  i  G    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
9 U' G: q1 F; Q& N) b2 N* D) y    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
4 d& _' A4 y/ J/ ?    mcasp->regs->RINTCTL    = 0x00000000; // Not used: h* w0 }2 r# o- P# w/ {
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( j1 l2 ~  ^- G, S* ~$ @* Q
& q7 p- v8 w6 F3 d! K! k
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used9 Y; g& y+ t4 @
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( O& x( ], L/ T- z4 Q4 l& y0 ]+ s& O    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( d' L1 j/ {  J1 j7 ~    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
  @# d& @% Q% z1 H! a& N% o. h    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
' t9 T) s0 a5 J  p! q3 U9 O* R    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1) P+ D3 W, S3 B) F* u
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
) H+ ^" {' R) @* Z2 D& {    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 d% ~# M) ~+ }+ e0 n8 n: g# E* v1 |& w: a" _# y
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN+ l5 @7 z8 z( o* {# s2 Y
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
" |3 B/ A# V2 q. _; F/ {2 o8 |    mcasp->regs->PFUNC      = 0;          // All MCASPs
5 W( t. W1 J- R; j    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX10 c: N& U( A$ i; [# l  J

! ]4 J4 x# A* Q- T    mcasp->regs->DITCTL     = 0x00000000; // Not used9 y( X  \6 m' Y
    mcasp->regs->DLBCTL     = 0x00000000; // Not used0 R: N( ~, f) a9 U7 w0 h+ r$ v
    mcasp->regs->AMUTE      = 0x00000000; // Not used1 C2 C: Y2 N9 _; F" A$ I

2 C% y4 Y8 Y  |/* Starting sections of the McASP*/; @' Q- [  E7 N+ r6 [
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 5 S3 M/ U# u  g1 W3 J+ h
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  6 u( b9 s$ O3 Y0 W$ d
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
0 e& P5 S& h( G3 X# B' G2 S    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 A8 a( _( K" o5 r! y& k  x9 s! N' l5 P$ c1 Z7 b
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 n/ q9 F+ j1 m/ [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* e8 F" v, l4 ^4 t, A% J    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 R# v, c: h. y1 h! ~    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 F5 x/ o. _8 ]6 Z* Z, q. }: i. s1 f0 p$ ^5 {- T
    mcasp->regs->XSTAT = 0x0000ffff;
2 I7 y0 E" y( p4 g: F5 k# j0 p    mcasp->regs->RSTAT = 0x0000ffff;
1 ]0 p4 u# ^, k& b+ L4 ^: z* A) Q- R  [
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ q: R( n& {/ f+ ~0 v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ x+ a2 a& m, D: K  F6 X& {    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 M8 J% \3 o' `    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ c6 C" S) r% @6 [- P0 i; [5 |' a. a7 J% _) t: e9 Q  ^
    /* Write a 0, so that no underrun occurs after releasing the state machine */% c4 M# q. p! _3 X3 h/ c
    mcasp->regs->XBUF5 = 0;
' J" x( `' A% ?! q& L    mcasp->regs->RBUF0 = 0;6 A& m6 c/ m, g+ l: J7 k! x* y
+ M! G0 o$ ?! F& ?# d
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + b+ C$ F3 A/ `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 ~. w2 ]+ y( ]" @: E2 u    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% Z4 v( }8 w! ~$ @  K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
; Y8 A. z( e7 @3 U* S; O6 n0 O: c" T" ^% }+ T7 g- v' E
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( U9 b# Q( c1 ?% \% ?8 G$ _0 @0 d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- U4 i: B' p5 ~( A+ W7 E
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
7 y1 ?$ W6 b2 A! b/ d' o    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# F5 W% v. }) A) \) P' A
# t) X  n. M" K2 ~
    CSR = 0x0000;) n8 o: c3 }. |; c1 q. o+ c) e/ b* F  V
    INTC_INTMUX1 = 0x3d;0 G% y2 u4 R5 P5 R# U
    ISTP = (unsigned int)vectors;. Z/ w6 i) g% q3 O, Z  U
    ICR = 0xFFF0;  
# f% M0 w! b/ o8 h& H    IER |= 0x12;  5 Z' m) c9 G; R0 _: g' z# I2 [$ v
    CSR |= 0x01;  ; X) ^1 P, Y. k0 `. M

0 d5 Y* Z* L" K& [! R
5 ^: m% z# o7 Y8 ?2 K4 K5 U+ K4 q6 v: [" V  H
还有就是两个输入输出函数:
- |! ^+ T) I; _) b1 cvoid output_sample(Int32 out_data)
( a. F, ~$ r) g{
  ?* z$ K7 w# V1 B5 x# h  AIC31_data.uint = out_data;  
( b4 g: _- x  B% K. z+ [- K  MCASP1_XBUF5_32BIT = AIC31_data.uint;, D; ]. _! K, w: O) i; q
}  s$ J& |+ `5 b6 }- A5 I2 \& t

) B* d. i0 e  VInt32 input_sample(void)( n$ d; @2 a  C) @5 S! U* h
{  : k8 F. ?& x& ?; g- r
  AIC31_data.uint = MCASP1_RBUF0_32BIT;% V2 y' h$ Z0 [6 a: ^
  return (AIC31_data.uint);
) M( F3 |; d6 o}, e) s+ a* ?6 a; v4 I* x( k7 O( Z

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




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