嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 @* C) f% z# x8 |  u% [" R6 bmain文件:$ R" k. \! M' u# L0 X
interrupt void interrupt4(void)    s+ ~. ^5 _( a6 L; B' b
{
& v# |7 q. ~! g4 g! q" H" Q5 j  Uint32 sample;; ]9 V9 w* u6 I( G; m

$ d( a" D9 i# l( p  sample = input_sample(); // read L + R samples from ADC
3 V& j1 b0 L2 p4 H3 L$ w  output_sample(sample);   // write L + R samples to DAC / Q% c* x& x1 Z
  return;9 }3 B1 h3 |& r& v  H
}
7 b+ Y% \1 f1 N3 \, ]
: }+ U( T0 e. R* {int main( void )
5 F# r9 f) p2 f- }{* f3 Y7 L' D& _1 S7 T, H7 i

  ?: u0 Y3 {: H: P    /* Initialize BSL */2 Z; n  E: U: f8 G' c1 X& \1 V
    EVMC6747_init( );9 I1 u* i) }9 |; x) \: n
        /* Call evmc6747_intr function */3 @1 S4 O. o7 U# g3 L  I
    aic3106_init( );$ P- i4 C. j4 i4 F. q" H
        while(1);% A' u5 ~% j! D0 j- Z( D
}/ t# p/ U' I) v* C% J5 q

: n" M, [  j3 B) m) R
5 p/ H* _& _" H, }- C7 {aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题' D) B* P# a" T
/* Initialize MCASP1 */+ v3 r" b; B9 ?7 o
    mcasp = &MCASP_MODULE_1;4 \' l/ u+ n; H8 ^7 S5 \5 p
    mcasp->regs->GBLCTL  = 0;       // Reset
6 u/ K! f' K9 N( R1 [4 H( R    mcasp->regs->RGBLCTL = 0;       // Reset RX
6 a2 V/ q2 Q9 ]" B    mcasp->regs->XGBLCTL = 0;       // Reset TX$ z4 v0 k- [9 |- ?: h& ]
    mcasp->regs->PWRDEMU = 1;       // Free-running8 [! S5 I. s, p% r- }' k
   // configure McASP0 receive registers% y8 T' N3 c) T# s; D8 E' P
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
0 K- R  v# K3 B    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, K) V+ n& a- i; V& _0 I) U    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ N6 ^9 f5 C  L' m, m
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( v$ U3 E0 h0 T# t+ h$ x    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
- Q- E& T6 k- N. X    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
# B" z/ O9 @3 w0 z  i* o# D    mcasp->regs->RINTCTL    = 0x00000000; // Not used
+ i4 Q* Z: l! b: h    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 J, k; ^. |$ y4 p. e8 P

7 @8 s. R6 X; _% y- }" V    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used) X' H' P. \: s; ^/ B0 }# u
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 I" I# @3 [7 k0 O  q: u    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 F5 p2 P% A* ^5 @; Q6 j: a7 g) ~1 ?
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# x# s- {( V1 w+ s    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK* S  V# {2 N2 C
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
) N# b/ U, S: M2 \8 `0 a6 Y* x    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
' z+ s8 {4 h! e    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 f, ~" L: u4 q& r' h
0 z; t' h+ r8 `    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN  d" f; {9 W6 O$ O1 f( w
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT7 ~) G7 M* M1 P+ _$ u
    mcasp->regs->PFUNC      = 0;          // All MCASPs
/ C3 F4 p4 P% z    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX19 ^) S/ p/ F. u" P" Y* J4 j: a

) v/ E/ U& o( |; @6 Q$ t    mcasp->regs->DITCTL     = 0x00000000; // Not used
2 M! Q/ a0 P1 F0 f4 U    mcasp->regs->DLBCTL     = 0x00000000; // Not used
- A( y6 n) J) Z2 q" w    mcasp->regs->AMUTE      = 0x00000000; // Not used9 d4 m  r0 }2 H

! {* c5 j0 O2 I4 N  w/* Starting sections of the McASP*/
* G) g( D9 a- @' e3 s+ ]    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 i& B6 z5 \( r# b6 U/ r( c, W6 q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
  |" @# z+ [) }6 l    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : Z2 f. P3 Q1 X) s5 z5 `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );  s! G8 n: d; t, y, G" V+ V

# K! z. [- {5 ?/ W    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* H! Y! t* {' E+ a, l) g1 T    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 _$ y' Q' Y$ e9 H- O    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 E, W* t, S# W8 ^, Y3 o) L& ?
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& S" M8 V6 b" B6 \! q+ u5 ?
" |7 B( @" L7 t+ E9 Q
    mcasp->regs->XSTAT = 0x0000ffff;
* ?  ~1 h. [1 s+ r( I    mcasp->regs->RSTAT = 0x0000ffff; $ b0 n5 m. q: u) \

# Z% q2 g1 @1 |* w: m, b) ~    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 e4 d( q5 R' ~5 |) f2 m/ g( I
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );6 v# b- y! y1 {
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 o5 U: _% j+ N# T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) k7 B3 r7 n( ~5 ?: q# u. s+ Z# j- {6 `2 L
    /* Write a 0, so that no underrun occurs after releasing the state machine */
8 j2 n/ G" X- s! o# v    mcasp->regs->XBUF5 = 0;9 B& e; f( R6 h, S. J
    mcasp->regs->RBUF0 = 0;$ N8 U9 N: ^1 H9 J( _

3 e. F, V, O1 C5 W    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
$ w. F/ n$ D, K  I' a& q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 i6 z- g; w. Y+ S% D    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # V% q" u/ [' w$ x
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );& F, G3 f$ a9 ^' v
2 E; c9 ^1 Y/ |, }+ {: T1 X$ i
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( W* C8 ?' X  `( v/ E8 g8 n1 A0 b
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, l; b$ r3 i* ~
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
, P1 X7 e- e$ ]    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 c# q' `- j4 k& {0 a" M; [

- q4 S+ }% M, [    CSR = 0x0000;
- f( z0 c9 E) L" z' Q* {1 i    INTC_INTMUX1 = 0x3d;5 L  K7 X  r  W) T3 X
    ISTP = (unsigned int)vectors;, r% W( N! e* B/ X9 g  J; U. U( H
    ICR = 0xFFF0;  4 l$ {0 `+ o1 a
    IER |= 0x12;  
1 T( n+ }8 T  _5 ]% U* ^    CSR |= 0x01;  # `+ P3 ]2 Y  Y$ G4 z

) Q6 F$ Q) U' m1 M2 l+ B
9 k4 G: {/ N; v. t( i2 r
2 c5 [" x# W5 W8 i还有就是两个输入输出函数:
$ u3 a" a6 ^' |2 e1 W# Qvoid output_sample(Int32 out_data)
" X) l5 L. c4 K) v1 S{
# M/ y4 L2 w- B  P2 ?  AIC31_data.uint = out_data;  9 ?4 Z: Z* `9 ?3 h
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 c+ l4 t) Y+ }7 Q}
; F; w6 G/ w$ R8 ]3 d6 _
6 o* A) m9 s' L% sInt32 input_sample(void)
: j5 _/ ]4 F  ]9 S2 ^{  
8 O9 i# [+ X% k) f/ l  AIC31_data.uint = MCASP1_RBUF0_32BIT;
% Y2 a, H) A3 Y$ D  return (AIC31_data.uint);& O3 }- \5 D2 A; t
}
% h8 y3 s/ k; E/ j$ r$ Z' x0 h) Y7 [3 B

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




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