嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& R7 w2 L( K- _. d- ]- L6 M5 }0 v7 `/ Qmain文件:$ k& E- g8 E* r) _: U" x
interrupt void interrupt4(void)  . j, H6 P& r- R
{
+ s/ @6 `% D* V6 ~3 g& H0 b) O  Uint32 sample;  t# }' W1 h2 |' }1 r* g! a! N6 L

# N0 _4 D+ o0 x- E) E* ~  sample = input_sample(); // read L + R samples from ADC0 q2 X+ w/ ^" s
  output_sample(sample);   // write L + R samples to DAC   d. m* l  ]$ b  \
  return;' t6 k0 k8 P' e1 H6 D/ i& x
}
$ j: Y- L2 ~6 g) i) l8 P7 u, {4 R; G. B4 |! R% f
int main( void )
$ O. F  K0 i2 d0 f) {  \3 @{
; `, n# _6 J5 M, q$ r7 Y+ G. G
    /* Initialize BSL */8 b! ~) n/ }) m6 d; [, w; q* B3 k
    EVMC6747_init( );( h& ~, h$ X& K& T) m8 U
        /* Call evmc6747_intr function */
5 A! z' ~. B. z, _    aic3106_init( );7 H7 p3 y% j3 A
        while(1);
' y4 M( J+ i8 t8 Q3 k}0 d6 ]# f8 d* @1 p* o- }3 ?
1 r& y4 A8 n# V7 O
6 h2 E% {. X' }& ?3 I) ?9 `1 n% C# Z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ Z) L# p, P6 `- d; v; Y! _( O/* Initialize MCASP1 */6 W& l0 V9 X3 E& y9 \3 u! |
    mcasp = &MCASP_MODULE_1;
  a8 \* T( b/ ^4 ]" s- P: U    mcasp->regs->GBLCTL  = 0;       // Reset
( t- m& b7 i4 z3 |" ~$ W7 }; z    mcasp->regs->RGBLCTL = 0;       // Reset RX9 i5 ~7 ~2 ^( [. Y, s" b3 ?
    mcasp->regs->XGBLCTL = 0;       // Reset TX4 Q& N) Z3 ]1 a# f+ g
    mcasp->regs->PWRDEMU = 1;       // Free-running
  J9 ?7 _8 L3 l0 W* m& D8 |   // configure McASP0 receive registers
# n' L5 x6 {" ]2 ?8 N! M    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used, E* [2 _) P  b
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. }( i+ q4 K$ Z" S# \! K6 ]" J    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word, e, v, C8 ?- b/ b! e7 H
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 x+ p# G# ^0 F: g/ S5 l3 W2 }7 H
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
0 i8 V2 @3 S0 u- p    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
$ a6 u# U- z$ O, {    mcasp->regs->RINTCTL    = 0x00000000; // Not used
* z# ]$ {9 ]' S% |/ {+ c2 U    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 j; P! ~* o7 P% O0 |

# [- B, W8 P/ r    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
+ L2 M+ Z' E& t    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- ^8 i2 W$ k: m5 d9 v) z: p    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word8 T9 g/ q* P! J) ?3 K
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: D. z$ ^0 Y! |0 B
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK2 J% w. \% Z" i. I* l' U( C1 c- A
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
4 ~+ X4 Z; M2 N    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit' k# |# x0 F3 u
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. C; C5 M7 N6 B& h0 \& J5 w& l- F3 Y' P8 r
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN" o( X" L" d9 n
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
3 u5 g9 g( C) |0 C) _) Z    mcasp->regs->PFUNC      = 0;          // All MCASPs) e+ j" j: K+ o' M. [
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: e  R- Y2 g5 Q4 I) J
2 I3 ?# c0 P. M( \5 ^
    mcasp->regs->DITCTL     = 0x00000000; // Not used+ h2 E. x( s  @) K
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
# m, s# n  }! H1 t    mcasp->regs->AMUTE      = 0x00000000; // Not used
1 o# F$ a" M+ {5 v& G& O6 I2 d/ l
# V* [$ A3 _9 a5 l, r. N- O/* Starting sections of the McASP*/, w1 Y) s9 X& X9 i' T0 w
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; m, \) j+ b  f) E; d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  5 h6 [% Z2 U7 @
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* [( Y" m$ I! S1 W! b( Z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 W/ A3 \2 u9 K* m+ k" k; w1 h! d* w5 s  J/ P- u9 @( p
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ) o: k! J# J; {0 y, Z# v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
' Y+ d, w, Y, Y* ?    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: M9 Z6 c5 p6 J' b  z  R    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; j# K( d! r6 O3 l5 n) D* J5 _# D- M, Y3 b
    mcasp->regs->XSTAT = 0x0000ffff; 2 X' G3 |1 B! w, T- N
    mcasp->regs->RSTAT = 0x0000ffff; . @: S3 w! |& w+ E: [
- |, M: ]0 O8 V, T/ c+ i" D0 ]
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;9 Z- ]$ P2 }! k+ @* g- W
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 _* x9 u" e/ V# B9 ~6 ^" R) }, i5 X    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( G  r$ X+ z! U9 c* }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 M: r5 B, d# W1 M' {  B
3 [2 _8 p7 c- j( Z" K: E( B0 S
    /* Write a 0, so that no underrun occurs after releasing the state machine */
4 A  G4 y2 A- K9 \+ p    mcasp->regs->XBUF5 = 0;. M$ V  g+ O  _9 b" q
    mcasp->regs->RBUF0 = 0;
1 m. }/ k3 ^* S: e! m) ~' A
% B  `3 J. }1 x  h0 u5 _1 h( N    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 b' J; Z: u4 p& o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% V8 X; k! u2 Y# I* W) G    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; W$ }* X' A/ \  b, D
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 N# M' s" k9 n! O
) ~% i/ S4 Y. j' B    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" R0 k8 }$ u9 D    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );5 Z+ z, `! i* B  N$ U/ j% C6 \- x
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ q, E8 C- W0 z2 l/ ~2 C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );! b2 G& q4 H3 N: U

+ n" Y$ V$ m& }  K# R  P% f    CSR = 0x0000;" ~2 O% }, \" f( ^
    INTC_INTMUX1 = 0x3d;" X" K# V3 b4 W, g9 T( w% [; K2 Y
    ISTP = (unsigned int)vectors;0 j- R: z  ^$ W1 O5 _5 n! U) B
    ICR = 0xFFF0;  
/ l6 L2 B5 C+ E( @( A) P1 M    IER |= 0x12;  
4 ~5 \; S" p# H" z& g9 Y  I: t    CSR |= 0x01;  5 T9 G$ |* N1 i4 P* e1 a9 l9 P6 {
# d( y/ y$ F0 M5 d' w3 E
/ h! b0 u, S; Q( v6 B
( i7 I" @0 W* y% B; b! T
还有就是两个输入输出函数:+ L1 j6 Z. ^$ b0 X! [
void output_sample(Int32 out_data)$ Q3 D  G  {. |( U. \" H% S7 V+ [
{
- h; F0 \+ M4 D% \. e  AIC31_data.uint = out_data;  + R0 n" h9 d! p7 z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;$ ?# w$ I5 y. o( g2 @7 u, o
}
8 ?: e' F' N3 t" D2 g
& M7 m6 u" f4 L+ wInt32 input_sample(void)
- b. n( t( B& f( c{  $ X% r, L7 b" T5 s4 O' ~+ W
  AIC31_data.uint = MCASP1_RBUF0_32BIT;+ V& k6 I2 {9 t; K. `! z7 Q
  return (AIC31_data.uint);/ f3 ?2 k& ^3 {- b7 P: X
}# B) K2 W$ [4 E3 y+ L
5 n- K' I" u9 T2 X1 D# O' a3 E

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




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