嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:0 M' [8 b- d2 j: R3 M
main文件:3 B% [. w4 R2 x
interrupt void interrupt4(void)  
9 o& o9 ]) r7 U: [, ?{
4 S+ m- ~' B+ O8 y( ^/ ]5 `* \# D( O  Uint32 sample;
4 z+ |  J9 M% a* g5 X$ {5 V1 A6 Z4 o
  sample = input_sample(); // read L + R samples from ADC
$ V, P, K# W7 f8 O5 Z. G4 K  output_sample(sample);   // write L + R samples to DAC
, U9 Y: r( |( A' b" j# q  return;
* w4 O9 g5 k2 Q/ ?: l4 R& `}
4 y: P) v" e- }6 r1 J* c' P) M5 ]% Q4 l* h8 h
int main( void )- E0 `# `# c* w0 u4 G2 X
{
; M# o$ R2 i1 a
3 k/ j$ d6 B3 X, i2 K$ p    /* Initialize BSL */& V, |' m7 I+ z
    EVMC6747_init( );
5 Z# G6 T* N- I. j        /* Call evmc6747_intr function */, P# f  ?  U8 {* X( X7 G
    aic3106_init( );1 }( H9 o; b( d
        while(1);
  B! r3 R! |$ E  u  O3 w& o}
# u5 O) t" n2 G4 n; J$ w7 w' M' M6 K5 ]+ s
0 w0 v" T) Y  h! c2 y( f
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题6 z1 D% L: o5 D" i1 W' B, R1 r
/* Initialize MCASP1 */1 e: U- j2 k2 z1 t$ W4 B
    mcasp = &MCASP_MODULE_1;
; X' U. e- K6 C" e1 p* L- V# [- l7 B    mcasp->regs->GBLCTL  = 0;       // Reset  j) m8 ~, ~  _4 F( w, v* U; s
    mcasp->regs->RGBLCTL = 0;       // Reset RX) e8 f# J& X3 V
    mcasp->regs->XGBLCTL = 0;       // Reset TX- t+ R3 H* o: J1 I1 Q
    mcasp->regs->PWRDEMU = 1;       // Free-running; c8 m3 ^# G: `8 W4 C3 C# z1 [* ~5 q
   // configure McASP0 receive registers0 u4 W# a3 D$ z$ a) X: w. t
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
7 o6 K( f8 G: L    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# `: H( H5 Q# @+ q3 x, g9 V    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word& _% n' h; [2 t8 i5 d% n& C- h6 n
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, {7 `# ]3 g0 N* H4 b! q    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)) o1 ]' x& q) z  V& v
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,10 i' i8 Q, @8 {' I1 ?2 [( @  e
    mcasp->regs->RINTCTL    = 0x00000000; // Not used$ {; g8 r7 z- L' M" V* a
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 H8 F8 R" c% D4 k+ j8 T7 g. ?
  c3 \4 u7 q/ _% U2 a  [! U8 v    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
% W$ [, t  b9 R) z' {    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 U% h+ b8 f& B3 d' C    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
  Z" ]& o( A6 }+ V2 l! ]    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& z$ ]2 [0 U9 @4 f0 `. X: \' [
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK- B" b  J2 o: [4 U; f6 u5 m7 u
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1: ~) l& x% o& r% Q! M$ B
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
. Y6 A/ p: ^* I6 i- j, K$ J2 c    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 p  K- M$ Y" P% d3 n% G
: `/ L; W4 i: W- ^# p1 K" f& K
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
9 R& b1 {# z- a5 h    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
7 S5 R* q* C: ~* t    mcasp->regs->PFUNC      = 0;          // All MCASPs1 {; R) o3 E! W1 ~
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ t6 B% `8 T( q/ ~
  E1 ~0 I2 o2 ?* }; ?! S; @' E
    mcasp->regs->DITCTL     = 0x00000000; // Not used& b! C! p0 b4 z
    mcasp->regs->DLBCTL     = 0x00000000; // Not used+ _! a4 U6 @/ T4 f0 s# B7 e' E
    mcasp->regs->AMUTE      = 0x00000000; // Not used& V1 x1 g! T, A

8 S: p$ ]- ]6 I/* Starting sections of the McASP*/
. {- d6 q' \" V: f    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' ^  B# t! v7 b& C" n* x9 O- x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  + h* ^5 Q( t; P+ S0 V! H
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( [% d) |' l5 Q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
; ]: c( j- {4 [+ S/ h& ?/ f; a
: y4 z' d3 Q( W    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 V2 R& ?6 y3 \* D    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 R- }  j6 Q* W: t% i5 g5 ]9 s    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * R( \( J  I+ p5 a$ j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 a; f0 d4 o+ z  n9 x' s. _2 s+ e

( s2 t( o6 l. y    mcasp->regs->XSTAT = 0x0000ffff;
; Q' c# M8 [8 Y' F: J* C    mcasp->regs->RSTAT = 0x0000ffff; ! a" U. E- z: U
, A5 ?1 Z" k2 |- }9 T
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;% E3 O- W+ d+ N6 M; C. }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );& R( v+ i2 B( T6 ?
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 q) m  w; a7 Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 G4 y8 E& f( y+ D& z
- l8 c1 }: b! B4 Q5 m. K: D    /* Write a 0, so that no underrun occurs after releasing the state machine */
4 \7 d: c! t* Z  ^% A" B) M* ]    mcasp->regs->XBUF5 = 0;0 b4 {( H7 s+ w( |
    mcasp->regs->RBUF0 = 0;, d& k( \" I. x7 @$ u

+ j, `* _# `0 {, R    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
. h: Q. m  r" A& n' _# H+ P/ o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 y3 z2 a! s& R7 o1 b' [* Q    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 M& l: L8 B9 X) J1 u4 z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: M, ?+ S  U. x: W0 ^8 o) [  c/ b  G6 i) G
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; $ R: J$ B7 W: G" O9 K" x) f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );3 P: k4 E" t) u' {
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; $ |# x5 T; Z# i3 {
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 e' g# q' A/ E& L: ^$ q; E& w
" N. A  v: {4 z8 i
    CSR = 0x0000;
3 v" k: B6 A1 G/ [: b& G+ Z- m    INTC_INTMUX1 = 0x3d;1 E4 G; m  q# p) f$ x; ]" P. c- V  o
    ISTP = (unsigned int)vectors;
6 I" P5 u2 t  G  w4 s    ICR = 0xFFF0;  $ t. V8 Y. }5 f4 T1 x
    IER |= 0x12;  
) x. ]2 {5 @3 c% D    CSR |= 0x01;  
. |  h) M# x1 Q: V  V6 b. l& N0 M1 n3 H( ]! }4 F) I' T; n' {
! c. C! q3 S4 H! i" p' d4 s

; U2 U6 I; M1 g' G还有就是两个输入输出函数:
8 S3 m' G4 d; f5 w$ f$ rvoid output_sample(Int32 out_data)3 ^" E" X2 g- T7 }
{5 R. o7 X( V/ P# s" _4 y6 B
  AIC31_data.uint = out_data;  0 K! R, c: K. s) u% m9 x) q
  MCASP1_XBUF5_32BIT = AIC31_data.uint;1 E% x6 J  d8 \$ W/ W; y+ [7 d7 Z
}
4 f9 a2 W. K' V/ w% u( s% o- A3 m, I) w7 m8 }
Int32 input_sample(void)
; B$ {! l+ ^7 v5 V8 C{  # Z' O; B3 x" R" K* M% p6 G" ^
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ O+ \- h  R% p  return (AIC31_data.uint);
, n/ b( g! w1 r& A) G}
  x0 [; a5 _& y' S" f' X6 c" K. |# F3 e, W8 l$ G4 ~. j3 p

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




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