嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
6 `- K7 R! a; X; y- F( U: Cmain文件:( b" X" H$ Y- ]; ^# i' }) E" X
interrupt void interrupt4(void)  3 f& J& {8 _: K- L- l0 \+ K
{( U, h/ `6 q( h: b% G  R
  Uint32 sample;) C  M4 h) u! w# e& G+ g7 `
% D, ^8 G5 m' S
  sample = input_sample(); // read L + R samples from ADC
/ ^8 ^% \, @) T* Q+ N2 y5 r" X" ~+ o  output_sample(sample);   // write L + R samples to DAC $ U; U3 r! s6 {5 B6 j* S4 T3 o
  return;
5 v# Z& M. n( x9 l) Z3 }. `0 v}
% o0 S. B8 B( U# ~, ]  O- ^2 B0 {/ Q7 E9 @" U9 J
int main( void )
4 D. `7 K) V& i# B8 ^5 |9 D1 O{1 ~' F, @3 s2 P, j

, a# v9 ~3 e* x    /* Initialize BSL */: ~: v* {5 \. M+ i4 k
    EVMC6747_init( );
6 o- K4 z* m$ {( K+ q) F7 w        /* Call evmc6747_intr function */. D0 D. ~  [& u) n
    aic3106_init( );; m) B4 d  x: @+ U9 G
        while(1);
8 G; s) [. H6 ?, w}6 \9 w$ z) h: \8 O0 H
$ ^; w* S) e3 C
: i' C% }$ Q3 n8 t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题3 b2 _9 E  _) K$ k1 J
/* Initialize MCASP1 */
  c7 a6 S# `( l9 X    mcasp = &MCASP_MODULE_1;& L- Z) P& }" l4 K. ^
    mcasp->regs->GBLCTL  = 0;       // Reset! {$ h+ [. m+ _* Z. y+ e; C
    mcasp->regs->RGBLCTL = 0;       // Reset RX2 v! T3 L3 k8 ~# m5 M
    mcasp->regs->XGBLCTL = 0;       // Reset TX
7 ]" S1 G4 ~- ]    mcasp->regs->PWRDEMU = 1;       // Free-running
4 b- [- t  a( W  X' ?" V   // configure McASP0 receive registers
8 i# a5 y' x0 A! i    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
+ B4 x  V4 O5 C; I% X    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ @+ k4 u$ V. [2 q! J; G    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word  d5 N  K5 D! t1 I
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
3 I0 Z; W; Q5 G% m- R$ L    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)2 U, ^/ w# o$ n4 ^2 s+ r
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,15 |6 P, W. R5 A0 A( C
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
6 u" a7 @+ h! P# ^/ ~    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 e0 V: j, U3 T. a6 G) z) b5 Q! z8 }! H; n" V
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
/ `9 U5 R( ~6 E( x* ~9 a" ^: c7 ]2 q; b    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus  K$ k) S4 {7 i8 n; u: l
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" |, K" {4 k' A& J5 d2 u" c+ F3 R
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 Y- F/ `9 m! J. P0 u    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
, c; S. {4 l( U& l) U3 ^4 ^" K    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1' E8 o' G4 L# q! g
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit- m5 T* I- y+ h; }1 |8 d
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% [" w5 x4 p; s! W, S  W
/ C' ~3 G4 j5 j, I
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN& `% b9 q- b0 U
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
9 Z1 F2 m( Y) b0 M  ^    mcasp->regs->PFUNC      = 0;          // All MCASPs
1 p3 \$ y/ P, [/ f8 F! K    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
; W/ Z+ h1 Y9 d& R4 `. W8 m, G
    mcasp->regs->DITCTL     = 0x00000000; // Not used7 T: R7 p0 W. W
    mcasp->regs->DLBCTL     = 0x00000000; // Not used  S1 Q2 d/ R, G+ v
    mcasp->regs->AMUTE      = 0x00000000; // Not used
% ~( _* r' Y' y% p( Q  h/ E$ v& Z4 `# v
/* Starting sections of the McASP*/
, ?; Q0 t, T0 p1 v* i6 o- p- @    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ( |$ `7 x8 m8 B! I! v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
' B* U$ a% S; p* g+ T    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* F( g  \0 J! o9 b    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ A8 ?- N7 G+ Z6 E7 p% h- w+ m) b; C4 n  _
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; " L2 \% X( R9 s/ Q$ n" f  l  T6 U
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 ]7 |; f  b: P' {9 @0 S- _    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 O$ I' G% w, V) l; @9 h    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- H& z$ ]# i+ v% J# y3 b; J5 S# V) p% }8 W! ]+ u
    mcasp->regs->XSTAT = 0x0000ffff;
, Q- H7 ^7 n: i    mcasp->regs->RSTAT = 0x0000ffff; * a+ x! Z. m6 L: B4 u0 l( O
% k6 _5 n2 i' E; w
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;9 o) f* Z* p% l- _- r% g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );* E: e; {2 X7 _5 C* H4 t; |; x
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & _* m5 s7 y9 q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& v2 h9 i  W2 n" H0 }4 s5 Z
) S4 L7 e6 o2 d- R    /* Write a 0, so that no underrun occurs after releasing the state machine */
+ D9 B9 o/ L! `: P    mcasp->regs->XBUF5 = 0;
. [, o; x  K0 n: D& ]; l4 K    mcasp->regs->RBUF0 = 0;' N+ O6 U' H: P! V

2 h4 G6 p5 ^( R    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
  c! _1 v* Z7 |/ b" C! S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# ?+ @7 a' E1 K. T    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' a' L; z& \* H    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 h5 ^% `7 s) h' E' k' M
; t& I6 Y; S* a# e$ K& x& O    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; $ m* Z7 n7 E& N2 j$ H7 A
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 W) ^% r$ Z, x( X6 {
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 7 _( o1 }, r3 Q, i8 D$ X
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, y1 R$ m/ N+ ?7 S' E+ A) ~6 l# z/ b# W4 g/ F0 ]
    CSR = 0x0000;: v, M! _# ?& O( n0 f+ `
    INTC_INTMUX1 = 0x3d;
) E8 O- u+ ~; o) I! K# z7 i$ X* z- d2 z    ISTP = (unsigned int)vectors;7 I  {2 F  X& l! V- c1 \
    ICR = 0xFFF0;    ~, k: F4 l$ u0 Z; b, v0 Q2 g
    IER |= 0x12;  0 _  k( M  d, \" P* ~
    CSR |= 0x01;  4 }( t! n5 `+ a+ z
: h) s& g  J) m$ {% [) F$ G

$ x" G! @: n0 `4 |; B) r. y
* w( z/ t0 z8 O  l( g还有就是两个输入输出函数:
1 L: [5 V$ L, \& A2 f. ^% zvoid output_sample(Int32 out_data)4 N. a( E/ L2 A& U1 l) j: m
{
3 a2 m. S/ t2 W  AIC31_data.uint = out_data;  8 Q/ C( k2 u3 e: f8 z3 n
  MCASP1_XBUF5_32BIT = AIC31_data.uint;1 x+ m0 n' f8 j( }& {7 f. q0 X
}
; Q' a1 E& k" e4 x0 H# W' T+ H. Q! v/ l! d9 T8 [
Int32 input_sample(void). T! h( X- W' [$ h: z
{  
: b# {; u* z1 v6 C# _; X1 N  AIC31_data.uint = MCASP1_RBUF0_32BIT;
, ?& S) b6 U) C% V. _0 t4 H  return (AIC31_data.uint);
/ E* Q! D3 Z4 O4 y. T}% E  m- f, _# i" j3 C8 t

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




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