嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ p" h/ Z# p5 amain文件:7 Z. x" M- L! |5 r* L  g& Z
interrupt void interrupt4(void)  
# x2 e* P2 _6 x4 k0 U7 H8 p1 F{
3 {- V* @% y) o( _. T) F+ r  Uint32 sample;( w5 B9 y, q% F; h* a8 Y8 \

  K) O% w; \+ y2 Y  j7 _4 y* l  sample = input_sample(); // read L + R samples from ADC
0 s5 J. C+ d" ?  `0 `2 d  output_sample(sample);   // write L + R samples to DAC ( z( H1 L4 C' l( c7 h
  return;
% I0 i& T' I. O* c}
4 N* f1 T* ^7 D$ ?" I) i( D. b' [1 x) R( y1 f
int main( void )
6 a1 i2 }3 g7 c1 U7 `' R{
% L: m2 `2 j% K6 O" B' o9 H6 v
1 a: C% g+ V: h; L5 V    /* Initialize BSL */& E4 B, y( M) N
    EVMC6747_init( );
& y( `4 `3 f5 w        /* Call evmc6747_intr function */
0 D0 J3 J8 g7 N: a( t* f+ a    aic3106_init( );2 t6 Q6 ?+ t& P6 N3 c
        while(1);  F3 N4 C6 r1 W
}
4 h5 U, d; {1 s9 `: m  i8 C1 G
+ T3 E( g5 A. H. R
6 y* K# F" W' o4 I! `, x6 L/ @aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题  Z. O  R+ h* L
/* Initialize MCASP1 */
. Q1 J6 P4 u1 b3 ^8 M$ ?    mcasp = &MCASP_MODULE_1;
" f' i+ a" f! O( M$ s) q    mcasp->regs->GBLCTL  = 0;       // Reset" Z" Z, J' r7 ~: H) P- |# j# E' a
    mcasp->regs->RGBLCTL = 0;       // Reset RX
8 J6 s- h/ E; v9 `4 U    mcasp->regs->XGBLCTL = 0;       // Reset TX+ j+ }3 ]& y0 e  _# ~0 n: O
    mcasp->regs->PWRDEMU = 1;       // Free-running: s- ?$ g* u6 V+ U0 @/ m$ C+ f% ?& r; }
   // configure McASP0 receive registers
& r/ y  f  @9 }0 ?6 F* G    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
8 n5 b# H7 `9 Z2 A, G1 M/ p    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# r5 k: Z8 q# n. J7 Z& j2 |    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word% {4 G6 Q; i  w8 V! h
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& z# \0 x& ?1 X  \7 H) v2 Y2 d    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side), l( W$ m% }0 E. j' c4 q3 ]
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1  m5 @5 z& E* ]$ f; u) @
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
( m/ i. _# C1 {    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 ]* G" s: ^5 ~+ T

0 M1 P2 H. ~: t5 M  r    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
; l$ ~% M9 W" V/ W; f( Y/ g4 Y- E, W    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus  U  g. z9 Z. K" ^9 ~
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
! S: f0 t/ m& p% r5 T    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# j3 Y8 ?7 z9 z- y$ U/ \+ F    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
+ W( z& {1 j% j1 B1 G9 m    mcasp->regs->XTDM       = 0x00000003; // Slots 0,10 @! \0 m$ p" y; x7 ]' F+ |
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
/ g8 x& H. A! L0 W5 p    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& w* b$ q2 u, z/ k: v& v+ h4 @# H' I7 s; t" t
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN( B$ p5 h2 d) C3 V9 ]
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT5 {8 ?- \: D8 P: i, ]  }
    mcasp->regs->PFUNC      = 0;          // All MCASPs( n: D& m0 ^6 d: _
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1# R# e9 j* c& a; r" m
: D; V* }; x1 M. `3 p' u+ z3 L
    mcasp->regs->DITCTL     = 0x00000000; // Not used
* p7 c* v) q" x: s. T    mcasp->regs->DLBCTL     = 0x00000000; // Not used: B( D& t% l2 d4 u& F7 M3 Z5 d* c% s- `
    mcasp->regs->AMUTE      = 0x00000000; // Not used- [* j0 M- R( {% r  j, ~: P

4 O( V- h% A( q& B! }8 L9 C/* Starting sections of the McASP*/$ |$ o1 F& m  w9 l
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 i1 c  Z& ^" j; \8 t  R7 R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
+ U8 E4 o& z& v7 s- ]/ h4 r5 d$ q    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 9 I* }9 g1 Q6 V2 l4 N% C+ v
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, O$ i0 }! D7 R& Y" t, r
: v3 l9 z* v$ R, N: a" w1 g4 n& A    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( j; `+ T+ P" ]3 x7 c- R- @    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. c+ w( Y" X' D/ z( g0 M- A( P7 S    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ U5 o; v- u2 R  _7 d    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ l' `* X0 l% m4 n6 \' G8 _8 Z( ?; ]# v) f- g' c/ x
    mcasp->regs->XSTAT = 0x0000ffff; 4 e$ ^7 C+ a; o+ _- Y
    mcasp->regs->RSTAT = 0x0000ffff;
- y1 [0 s* ^" w+ ~7 G0 @
4 k% Z& ?2 i/ n0 J) Z    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;( w  ~( N6 G! `* y% f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );. c/ Z9 G5 \& \5 L) p  Y
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 3 r! z( Z5 n0 q5 a  A/ n
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& [3 R& n$ y( u4 G! z) ^* _  P
- \2 C9 X. N; \# q; c; R    /* Write a 0, so that no underrun occurs after releasing the state machine */+ c3 a4 K8 L7 G
    mcasp->regs->XBUF5 = 0;
! ~( D. u# H; ?, a    mcasp->regs->RBUF0 = 0;! |1 @. ^5 \* o9 A8 e9 y
7 d0 l" k, C4 u. c/ _: n
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
% T4 O, _$ B$ w$ }0 c    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 ^3 U* i1 r% d! C! _    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 \9 s5 |1 D; G) \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. O# G, \% v0 k, ^: _; }( L
* a4 x0 o1 e& t* x' j! ?    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 r  s0 ]- }8 @+ n( G& W' B) E
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% E! {1 v% X: Q! c& a    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 Q3 D/ C! a" o& c
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- z9 P: `( K0 m' K  @

5 I7 J; `6 r; ~5 d9 e/ t    CSR = 0x0000;# u- s8 F  |: G# U+ O7 b4 ~
    INTC_INTMUX1 = 0x3d;
/ U  j( k' D/ ]* A    ISTP = (unsigned int)vectors;
( H- O- j( N8 `6 y1 |    ICR = 0xFFF0;  : s2 s# @0 _7 l: ]( T6 r
    IER |= 0x12;  
, n' T$ i" R  ^% r5 `: L    CSR |= 0x01;  / ~9 B7 q7 P  K$ V+ q7 A! Y

( y; t" w) L: V' N) r& P
4 h. x4 i, u2 D  W0 ~
  r6 h. F5 J/ @$ g8 K) n+ w还有就是两个输入输出函数:/ y- |/ h4 e: C7 r6 U$ V2 F+ I
void output_sample(Int32 out_data)+ k* m8 ?6 O7 [- `; f# Y, ?$ P
{
7 U3 B  W1 C* R, N  AIC31_data.uint = out_data;  2 r; N8 a7 A1 d: Z: Y
  MCASP1_XBUF5_32BIT = AIC31_data.uint;0 ]- M0 ]7 ~! w* p0 d' p3 `) H
}2 s3 R. t6 h- l' [; L0 F3 C+ u

2 P# Z2 [8 c- J- T$ O) ZInt32 input_sample(void)
" i; G+ ^8 V' M$ m+ V0 H/ {$ v& J$ A{  
1 ~" Y" T( Y9 B0 \  AIC31_data.uint = MCASP1_RBUF0_32BIT;5 B% A' T; c3 {% ^+ ]% A
  return (AIC31_data.uint);. e7 D4 ~+ f7 [
}0 V5 `) g4 r+ ]: [9 H! o

! h  T4 l: E) U# U8 O+ W# x' M/ M8 o
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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