嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:; s5 z% M& A2 ]: f2 f
main文件:
6 M( W; M) p* E- L- Ninterrupt void interrupt4(void)  
- x; V/ m) L. \8 [2 L6 v{
6 j' {# G+ z+ I. v  Uint32 sample;9 ^) d; `' E$ C# G# N( x

0 w1 l+ x/ d6 N- V- c  sample = input_sample(); // read L + R samples from ADC
& f) v4 K* R" Q8 c: [  output_sample(sample);   // write L + R samples to DAC
" \3 h3 L. X4 t2 |  return;4 `: b9 m2 F5 i5 R" A
}
8 {% u& W9 _" j* y$ R+ p. F2 T% @. v5 k7 s# D4 I. A; p0 Y
int main( void )
4 ^* \$ N# p! c" D  J1 A/ ]2 d{! p( i6 j$ }8 f# |& `
  J( P- p4 E# b9 {( w# S- o( [
    /* Initialize BSL */8 g$ D' ~# H: d8 d) k( K7 m
    EVMC6747_init( );
# j2 q+ C. ?& C+ @+ R( J        /* Call evmc6747_intr function */( u1 O* M+ A- A: k/ \/ y9 |
    aic3106_init( );: I4 u: A3 s5 a9 ?" c# G
        while(1);
8 g" D( x5 C9 `" m$ V}8 a+ g6 Y. r/ v2 P* q: P+ ~0 e; C5 D

) \; _. l6 r1 u
9 |5 E* D4 u- @0 ?6 Zaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题4 g8 v. b- S9 i$ B' c, ]
/* Initialize MCASP1 */
/ A8 s" B9 y* |7 F+ F    mcasp = &MCASP_MODULE_1;: [. K# F( [! Y- F7 p- x
    mcasp->regs->GBLCTL  = 0;       // Reset
, p: i- a+ U4 A" {. H2 r+ N    mcasp->regs->RGBLCTL = 0;       // Reset RX0 h& P. n/ Z' j2 t& ]. o9 ?3 C
    mcasp->regs->XGBLCTL = 0;       // Reset TX
: [9 n# T& h3 S! @! p    mcasp->regs->PWRDEMU = 1;       // Free-running
. a- r. v$ P4 Q" M( s' B: i   // configure McASP0 receive registers
( {- R& n: t, S0 L2 y0 ^    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used+ X5 w  V- b+ t8 c1 w0 [; R
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 m! J0 o4 P! J/ Q. L    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# l% s. N) K' l, k3 }    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side); @/ _2 O& z& M/ }, v
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)8 e2 k, V0 i' G3 t3 H! l8 p3 C
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
$ z# z; X) h! |% n: j1 d& X    mcasp->regs->RINTCTL    = 0x00000000; // Not used
1 j1 W5 ~( \3 G    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 `1 j# h2 s5 L7 g) p1 ~& L1 O' Z; ~4 m+ \+ y
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used! g- E1 R: u5 u3 q' V; u* d' a, i3 q" S
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; {% b7 O$ Y2 m' |/ v) a1 C. l8 V; L
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
: Q2 ], W8 E8 q0 c$ X) K    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 b7 Z& g/ N9 M9 ^* C
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK9 E) a/ P) B/ h# I( b) O2 T* g  T
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1! O, V% N2 F3 p( |/ [$ u% o6 C
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
. a2 _0 f0 u) p+ k. c: ?    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& U+ d8 c& n/ r+ o- P' _
4 E* Y3 c% y, `5 g; o
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
) G8 P% X8 l, d, @6 K5 V! w    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
3 q& @" @0 W% q6 T# m' a    mcasp->regs->PFUNC      = 0;          // All MCASPs6 P: E: }6 f: T8 M. u, x
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX12 f- _1 z* v7 X2 O% _; S

+ [# E) c% n( [  j, G; i    mcasp->regs->DITCTL     = 0x00000000; // Not used9 z2 g- R6 \7 s; c2 }
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
. D$ z* [; P- M; _9 k9 [    mcasp->regs->AMUTE      = 0x00000000; // Not used
# t$ O3 d) X8 z5 d$ V: Q# D- t% d9 e/ S( I/ q$ z, K# \
/* Starting sections of the McASP*/
1 u/ J5 B4 |5 l6 }- [# _    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% `- w% a' P" d5 K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  6 g; J! X( [$ u+ {  o2 \$ ?. p
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 4 b  t; I- K+ O3 c4 M$ ]- x/ G
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 q" ^. s, R3 x; z6 ~) H

  t# e% D) J" O0 ?    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . ?" P+ P) ~0 r% T5 i
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. Y; F; _% O# t8 q0 f    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # j. a1 D" T' ]2 I1 f. ]; ?" k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& J: |9 ^- m  w! Q. G3 `& `0 s6 J0 X6 P% r: a3 V& _9 a- U8 ~
    mcasp->regs->XSTAT = 0x0000ffff; 8 R# Q1 \6 G+ O/ |
    mcasp->regs->RSTAT = 0x0000ffff; 5 V+ q+ A! k9 ^

  T; _0 n) }4 P$ ]+ N    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( p* @- E+ [6 d    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );' B- u# T7 D( ^0 E1 q
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ P1 Y6 W  h: T6 ]    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );" |2 [8 i" y/ g/ W0 g
. D7 s/ U0 a+ r1 C7 B
    /* Write a 0, so that no underrun occurs after releasing the state machine */
' G" d* [; v7 v    mcasp->regs->XBUF5 = 0;, u$ x0 m& _! t2 V+ f1 N) {" A" X! W
    mcasp->regs->RBUF0 = 0;
- \3 ?1 @, L; }! A3 |( B; f/ D3 O7 b9 S
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 5 ~6 x# i; ]6 b* B) }) m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 Y3 G: R2 Z( @6 V. A0 C1 |    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 Q+ R; |& a+ ]. \8 G9 T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
5 @( n5 b# z+ d& L2 a' }# {9 ]  e+ w
8 x( o7 l6 C+ y$ p; S    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - T6 D; o3 S, K7 R: G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );0 f, t3 c/ a  M# u' q" O- [7 R
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 j6 x! b- ?7 V7 E) d    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 |* }1 _- E+ ^- R& {- @7 H" w) C& H( v9 m4 ]
    CSR = 0x0000;" g) W7 z# v5 d& r
    INTC_INTMUX1 = 0x3d;
0 O# P4 i) g5 s! @* s9 z; u% K    ISTP = (unsigned int)vectors;, n" @/ d9 b& _$ K* O8 U, W
    ICR = 0xFFF0;  
( U: N: q! P3 ]* U2 ~8 i% W    IER |= 0x12;  7 _- Q1 Y" t9 v7 b9 Z% P/ S
    CSR |= 0x01;  
, @9 [. D  c! x1 \5 d/ b, k8 d* T. Y& V4 j
# r. @/ k5 J  n8 m" Q- F. p6 H
* s0 Z& ^$ n4 ?  N
还有就是两个输入输出函数:
, u. }  W. @! ]  qvoid output_sample(Int32 out_data): d) z' t' t. X+ n) s& B, ^! G* U4 N
{
3 n7 f# M" {1 Z( n- }6 p) Y  AIC31_data.uint = out_data;  7 w  \4 @3 N9 \
  MCASP1_XBUF5_32BIT = AIC31_data.uint;1 U& A. B0 H% S6 N- x
}) j0 L: I. g1 w

& d% I5 a4 w: X. x: xInt32 input_sample(void), @. u$ a/ F* `" j
{  
% ~6 u& n; ^+ D! j) S  AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 n" b# M) V, P  Z  return (AIC31_data.uint);2 t9 K/ [! z/ D8 D  u
}$ p; [& z! s4 T: E; q
+ D  x3 T& P& b4 ?0 [

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




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