嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: l. o& r# B: o9 U) b. K) amain文件:0 v  u0 p: [" Y& Z
interrupt void interrupt4(void)  , Y: z, O+ P% T: F! L! |/ O9 ^4 p
{8 b% v5 \' C3 i- ]
  Uint32 sample;0 C: K. H4 I& D% O+ N3 \+ s

. L6 D6 Y5 W+ Q- @0 N- v3 q  sample = input_sample(); // read L + R samples from ADC' T: P( Y- v5 H) p  _
  output_sample(sample);   // write L + R samples to DAC
! {$ F5 e# H0 R$ [% p  return;2 `! U6 H0 j9 r- u
}
+ g0 T- ^3 t7 ~/ \9 D4 M8 r* V! b9 w. V* Z$ E
int main( void )
2 f% F7 K" }! k{& R0 D7 w8 p0 ]. L
) X" @7 V/ u: E0 h
    /* Initialize BSL */9 U- s" S. v% D$ k9 T
    EVMC6747_init( );- f/ [# g4 V* s8 F( d5 s$ O
        /* Call evmc6747_intr function */% |: c. P8 c: A" N
    aic3106_init( );4 j. \) a$ ]5 e! s7 C8 O
        while(1);! ~* @0 B! o3 B& @* P3 C6 v
}
1 v  r' C/ L. c+ {, n# L
2 y6 S0 Z9 b! H' q! F3 u! s: R' y3 e3 T9 ?
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 e8 k' c8 }. a& H/* Initialize MCASP1 */
% t  n( N3 Z7 Z1 [* O. C" z    mcasp = &MCASP_MODULE_1;
0 ?5 M+ U! O4 }- |. g  U$ Z    mcasp->regs->GBLCTL  = 0;       // Reset5 M' Z% c! T: |! w, h6 z  X
    mcasp->regs->RGBLCTL = 0;       // Reset RX
" C. ?2 {: Z. S% m; g! Z    mcasp->regs->XGBLCTL = 0;       // Reset TX" f* W. g) T9 Z  H* M+ {. E
    mcasp->regs->PWRDEMU = 1;       // Free-running
) a" A7 i5 d: ?5 {) u* B: N6 d   // configure McASP0 receive registers! z7 ]4 M  `" y" M! \/ q3 A# @
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used* h8 z8 C) I" }7 v, y
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 u5 m2 Y( l- ?- L( L) m/ d& o
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word  n; r: t& E. i! ^
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side). [. @! d4 V5 t2 W
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
  N, l* e" {) O5 C3 _% n, [    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
7 ~% p% s8 ~; K) F; \% l    mcasp->regs->RINTCTL    = 0x00000000; // Not used/ B* l( `# E' w, E. f/ P
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 U2 Q0 G6 v: M) ^6 D) |# W! W
: E& r. ]: ^" D3 X$ p( |# C  b    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
# d2 i: m9 ?9 l' n    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" a$ ~  V2 l% s+ `+ x* \7 P    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& _8 Q3 S$ @3 n+ Q8 Q4 `    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-161 U0 v# ~6 ^. g! T/ ^( l% s
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
8 k# k  W' R9 A8 T+ l6 L1 H    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1' A6 Q3 w# S3 |, V' u
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
3 n1 d' N7 G5 [# b; u0 T    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# a5 O! E- ~3 Q  Y+ a. r+ z8 g' V2 n
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
2 Y/ h" d4 B1 c' s0 E+ W* {    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
0 |1 N5 x+ Y. N/ A    mcasp->regs->PFUNC      = 0;          // All MCASPs& h6 q7 X2 |  w) o! j
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: F# X" q1 T; P" o8 M
" |' r' _9 j! y. p! u: ?
    mcasp->regs->DITCTL     = 0x00000000; // Not used
* l' `; m3 `* H. I8 X1 g    mcasp->regs->DLBCTL     = 0x00000000; // Not used
! z7 p0 h& `+ l1 S8 C) N7 X    mcasp->regs->AMUTE      = 0x00000000; // Not used
4 i* k9 l" }$ g" w, f0 x/ F
$ T" k, J3 E# H; E: y% [$ e/* Starting sections of the McASP*/
( c: u( O$ ~$ z( Z1 }1 |    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ c- O) P. [1 P, R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  # s0 O! C/ ]" W1 ]: f
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & ]0 w9 Q6 M. K$ W9 F$ P
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );, l4 T+ M3 h' @8 l( r3 R4 v

, w4 C- |; k$ g2 F$ v2 n% P    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
  l& L$ Q! d$ `& Y: P7 b: J4 N    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ z# n$ t7 A3 [    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* ^, H( j6 q1 f. X3 o7 g9 E2 [8 B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );6 F) u' [: X- A" ~, a+ w8 G5 H

: o. V" L/ {& c1 V    mcasp->regs->XSTAT = 0x0000ffff; & r2 i; @0 Z: g9 M2 N' e& y  Q
    mcasp->regs->RSTAT = 0x0000ffff; , P: {/ ^# q! ?4 I1 }
# \4 }6 e" w' r6 h  W
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;  f( L/ J  U, @3 I0 u
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; ]! U+ z5 n' ^    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# c; M% }" ~& X/ [, |9 s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; G: N) x3 _7 i1 f$ c" l7 H
/ E+ H  V$ `/ k) i5 ^5 T9 m
    /* Write a 0, so that no underrun occurs after releasing the state machine */
% L7 `0 J2 O# A, a) n9 f3 `  S    mcasp->regs->XBUF5 = 0;* l7 K! x8 a% g+ @: R
    mcasp->regs->RBUF0 = 0;' G( F& \) t1 W- G1 a, ?0 u$ i

8 p" d* {( k0 h    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 D0 u5 _1 t7 S9 A    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( ^4 y$ w+ S9 F, p) W- Y2 _
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
  D. W2 B$ H! z; |, w0 x1 {9 H2 p- }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 r, b/ x& n2 g! g/ P# Z1 V3 f
* B; j9 W1 F- J    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 c8 ^9 Q' e- R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 \; |1 y5 M: S' u) R  [( O    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# w  S, q& W, m( }: r  N    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );! R; s& I7 v$ Q# z

! v- d: g; @6 D6 p  [# c. E) k    CSR = 0x0000;3 V% |( m' h7 W6 E( @& \1 Y4 s
    INTC_INTMUX1 = 0x3d;
8 }# \9 d5 j: K% K5 [: \" Z1 R    ISTP = (unsigned int)vectors;
( K( `5 ]7 P! Q6 U9 m& ^/ o    ICR = 0xFFF0;  . C1 f1 n) a7 ~
    IER |= 0x12;  
# T, J. D2 a, {( U+ A    CSR |= 0x01;  
5 `0 t; p1 b, }2 `: c2 o! W0 H% y  U% Y- [0 U* d% O: v* A- {

! l& c) D! K2 [# n7 L1 O4 `3 r3 K- w9 Z6 F4 C/ t
还有就是两个输入输出函数:% _4 A! {" ^" S4 s
void output_sample(Int32 out_data)
& z6 D! G9 s2 p& F{
& f! z6 e+ u6 O' M( g- ]2 |. q- C  AIC31_data.uint = out_data;  ! t. @5 y. x! N, ^0 U1 E% |
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 a: A) t+ a# g* \}# }3 q9 K  i" F

8 S) y; S( ~1 CInt32 input_sample(void)- \; t: W! j: r& N) O
{  
: X$ v- d: x5 [- E% w; ]  AIC31_data.uint = MCASP1_RBUF0_32BIT;
  r1 g( m( x0 |  B; C# K  return (AIC31_data.uint);
" h$ H/ ]7 l  m" u2 o}: l% F4 o" A9 S+ a
2 ^: p# O- [) ?) ~. W4 X0 h

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




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