嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" U0 x& U0 q& Q* r8 K) \6 B' Wmain文件:
$ v8 l; r" N2 L6 j$ f( ninterrupt void interrupt4(void)  : J: z  q6 s) X2 A
{
# A8 o; A/ b- ~- b, w, s) N  Uint32 sample;
/ H0 c1 M/ b7 b8 Z6 z+ @, t( V/ z: r5 e% P# p5 X! L$ A9 Q) T
  sample = input_sample(); // read L + R samples from ADC. \6 V- e' k. y1 A- W* G; r3 y# S( z) T
  output_sample(sample);   // write L + R samples to DAC
6 X& x- k2 O/ E  k5 A: Y. `  return;
# F0 G  z6 @7 j}
- L! ?! I: j. n" O  m" A! u+ ^7 g. D' l- Q* J7 E
int main( void )' s6 p* o. a; l! b; j) Y; [- P3 k9 ^) _
{" A" ?5 z: ]& {! a9 q( M

5 ]7 [, R, L1 t! A: c/ c5 Z    /* Initialize BSL */8 F0 ~9 }  c% q% z1 U* Z
    EVMC6747_init( );% G# [3 T2 _6 |# D/ E; i
        /* Call evmc6747_intr function */! f& b+ x. G3 H7 p, e; T2 E
    aic3106_init( );! p0 j8 [5 j2 O  ^
        while(1);
1 R% u/ M+ A( |. U}) N6 z6 X& E. V# w! L2 \2 D2 d

  A& n$ R0 I! N+ K( x& K
6 W: c3 O' F- D9 h& q. Z- daic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
  E6 B2 W3 @) s1 F/* Initialize MCASP1 */
- P4 p' @% Y* U& x    mcasp = &MCASP_MODULE_1;; a9 [4 O7 e9 t' a) P/ \. M8 B# B
    mcasp->regs->GBLCTL  = 0;       // Reset' r+ W' r) t/ T; i: q
    mcasp->regs->RGBLCTL = 0;       // Reset RX
# D3 t' p# L1 M. |  ]    mcasp->regs->XGBLCTL = 0;       // Reset TX% L6 l( Y6 C/ u4 U8 ?+ ?- w- m
    mcasp->regs->PWRDEMU = 1;       // Free-running
- ?% W" |, `) a5 l6 b2 T+ \. L: l   // configure McASP0 receive registers7 k: A' x" {! U2 X4 u: u. r
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used& @6 k$ u# M2 h/ C" [
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 e9 q9 C5 @) m  Z3 s    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word1 r2 T! I8 n$ E9 I* \; _) E: a! i
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)1 z( ^: a3 D% p$ c+ {
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side): o+ \1 R- H; N6 o
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,16 [( @. q  ?  u: J  L  d- T5 h5 V; ]
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
+ [- _$ g4 H  c3 E+ B% F    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 k  K) c7 C" l4 {: T
7 R' {$ Z# {; g& ?. w. [( [- y
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
' P) P0 a- z+ o9 j3 {* l1 A    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) ~; r# q' ^% H6 i. {    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word/ D/ P; Y* l1 Q
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: c' o3 T+ H! `$ ?7 e    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK" \: F1 \3 x$ K% T% X* Q7 k4 P8 N
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
9 r2 h, L0 _* _8 j    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit* `" r- d" M, [6 D( w  K$ |( C1 U
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! q* [3 q3 |4 S5 W
+ z& c6 w1 ?1 I. H2 ]! D5 e+ `
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
# e' {. _' L7 M- m. v. E( H    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
  z: S  p6 l+ J; ]6 ]* |, c    mcasp->regs->PFUNC      = 0;          // All MCASPs
$ T  b+ W2 J1 r$ W    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 U- |% F) [7 s" v) R4 H6 }) S% E* x3 ]  \* `3 a; v. l
    mcasp->regs->DITCTL     = 0x00000000; // Not used8 C# t" W/ b$ H0 D! b. n" J" h
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
) K; P7 I3 C4 c& }: ]; v. I' E+ z: K    mcasp->regs->AMUTE      = 0x00000000; // Not used
: X7 l1 b! E' \) Z3 i* w* z) L: ~% I, ^, W' d
/* Starting sections of the McASP*/
/ ~/ a" @3 x" ]8 O  @' U1 Z+ |    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . q9 m# G+ E% |) U, }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
" S, ^9 e' s+ v4 A- w    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; - K8 P2 x5 o0 N) O. i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );0 Z% M4 X% ~5 ^) s
5 w4 S- @* K2 k/ W! m2 w
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 {' M0 a' T; S1 W& o9 X6 H    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: U8 n" L& u: q/ ]5 p4 G    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; $ `2 W( Q% m# w& G. ~* ^' \4 L
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );  \/ e8 R$ F# b" ~% a( r
' ^2 P  ]5 i3 Z3 E2 B; m
    mcasp->regs->XSTAT = 0x0000ffff;
+ m5 a. f  ?9 _. |  ^' P' V" U    mcasp->regs->RSTAT = 0x0000ffff; & ~1 Y! b2 U/ a3 _  P; ^0 o6 H
. X# W* E% |7 w% O/ d
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;, L8 R; @; m, h3 s4 G3 X
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );9 c: d, z+ g* V: i  p
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& h1 h$ ?0 z* ?) k% d5 L6 B  W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 }' ^5 \* C$ A
9 W$ o4 Y; p; N4 `: w3 |$ _
    /* Write a 0, so that no underrun occurs after releasing the state machine */, o4 c% Y4 J0 e. o
    mcasp->regs->XBUF5 = 0;+ x; C5 {  x' ]- x* D
    mcasp->regs->RBUF0 = 0;1 M2 \8 Z7 Z+ j% O1 B( b

" Q  r. ~+ z2 E: ]5 p' L1 o    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 7 z9 n. M+ {  N! U9 p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% J- ^1 ~/ T4 s- B& g, W& Z    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 e5 s0 R1 M/ d: G" T5 \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 K6 p% G4 A2 N0 x. [- j/ J7 r. T) S, u% i# g5 _" i
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 0 u9 D& q( o3 s: x1 N* [# J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- b8 D$ Q* T8 t1 t5 r+ s    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" q' J( {1 d0 c* E    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
) I# H8 A8 E; q
  b8 ]! Y8 p; P% L% B    CSR = 0x0000;
$ y# n: U* B7 m; g9 Q    INTC_INTMUX1 = 0x3d;
0 x  F2 w. F, i( c4 W3 }    ISTP = (unsigned int)vectors;
: \6 {/ S# Z: _9 Y    ICR = 0xFFF0;  % l8 C: `; ?1 T' `+ P: K
    IER |= 0x12;  
% c3 T/ w$ b* O6 o+ @3 H    CSR |= 0x01;  
, r, P  ?+ X; [( t8 v0 T( L& _- w. A- [, P" @

: @. }9 Z; ?' I* i4 }; n* R7 p* C2 \! ~
还有就是两个输入输出函数:. ^- F  f, x( x6 `; Y  B
void output_sample(Int32 out_data)
9 H  L4 M6 Q- y5 G{
& W; y0 q! |' {$ O1 z  AIC31_data.uint = out_data;  7 {$ N8 [7 c1 K+ n% }& U6 q
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
" k( H2 R1 J% \5 S}
2 o" y- R) {% b4 |# i! ?
1 }8 L3 l* E& Z6 WInt32 input_sample(void)7 e  l' T9 r: `2 C6 Y0 O
{  + m  Z0 k  R& }: y
  AIC31_data.uint = MCASP1_RBUF0_32BIT;+ m" T# V  Y; f% V9 I, W
  return (AIC31_data.uint);" C0 F& [6 n1 B
}0 C! W& o  k, H& {' X  J

" u3 ~5 l( A2 u1 D! {$ p
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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