嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:. R4 ^" }8 k, p, _, d- [
main文件:( O  F' q0 H6 ^% _0 @, M
interrupt void interrupt4(void)  2 v! U' i. f- i* G* O
{7 m$ M& L' r% c/ o4 P/ X
  Uint32 sample;
  \8 [! ]# I" U; C; u( {- Z5 C1 s5 o  f. n  D
  sample = input_sample(); // read L + R samples from ADC
+ w  k( B: y% ^; _4 U: A  output_sample(sample);   // write L + R samples to DAC
5 C  e9 ?& }& u$ \. N+ c9 Z& r/ \  return;- m& W& y& @" _. ^# v
}
& \- N$ Q. Z! F& |8 S' `
# Q+ k! c7 f1 Kint main( void )
. k' n3 p7 W2 S5 }  T6 Z& ?7 E{
2 ?# t- _  A9 j* v* K+ n- K! C
4 p' N, o( t, ?    /* Initialize BSL */
# F4 k2 V! ^% }    EVMC6747_init( );
4 [8 q# v9 V, F6 [        /* Call evmc6747_intr function */
9 L; ?2 A" q4 z. E    aic3106_init( );
; M4 H, v8 A- s- d        while(1);* y8 Y' v+ f4 M
}% U& R* N6 A) M* Q4 f1 \; `4 A

% {, w! Y9 i7 @- ~/ d3 t
/ {- E/ ^3 I9 o6 d0 E( P8 ~$ zaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 F8 a: _% j9 ]# ~7 x/* Initialize MCASP1 */3 u( t. a: ~9 ]7 m8 _# h
    mcasp = &MCASP_MODULE_1;/ k, d# O. T0 U7 V& q( ?6 [$ Y
    mcasp->regs->GBLCTL  = 0;       // Reset( p- x1 l( p& v$ p5 f/ h8 Q/ F
    mcasp->regs->RGBLCTL = 0;       // Reset RX+ V6 H& V, `# @3 Q7 C+ a
    mcasp->regs->XGBLCTL = 0;       // Reset TX
) `- V, T, Q# C5 R% c, u1 p- b    mcasp->regs->PWRDEMU = 1;       // Free-running/ E8 F7 y( L, I" V' C3 T  B
   // configure McASP0 receive registers* A. m5 D# g% r* j$ f. R
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used! ]: ~' s- G$ E! B
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 L+ _% R3 Y4 U% P0 J    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word' Y7 `" Q+ A  s6 l5 G  ^3 i
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' [- X0 ?  m4 o1 d4 S) V+ D' B8 z    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)7 C8 @( V0 R+ s3 T; Z1 S" Z
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
3 G! I$ K- T2 j4 P9 l$ E    mcasp->regs->RINTCTL    = 0x00000000; // Not used
, }! Z( B' u$ x3 O8 J    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ `" ?: j; A/ L6 D: H  K7 ?: M. _- M0 U* s  Z: l
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used. N% Q& i! G+ N8 C# w/ k; c
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 S8 U9 |$ j5 j$ @1 N7 W# T/ E
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
. o$ c1 j# l& C+ t- w: N  |    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-165 `$ }: K- E) U
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
& \7 _/ h1 y9 ?: Y4 \0 i5 ?    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1  i9 `: U" H) p. S' B
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit& F# ?% W5 `8 j7 Z0 u' y% `
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) k; j0 w- l6 C; W! D- z$ ~3 M
. ?, W% F8 K: t" @' D" T6 ]  h
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN! `. L: W3 w3 B1 L/ e+ L; y
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
$ [/ M' Y/ G  v* Q4 Q    mcasp->regs->PFUNC      = 0;          // All MCASPs2 ^: ^# ?! d7 r* X/ R; @
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: }3 R( |4 O" w; a
7 T. O- G  b7 m    mcasp->regs->DITCTL     = 0x00000000; // Not used! h. Z# F! T  d
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
6 v/ S- W1 a4 Y    mcasp->regs->AMUTE      = 0x00000000; // Not used
  H0 t4 ^$ H% f& Z: M! t8 s4 _9 Q; C9 i0 t
/* Starting sections of the McASP*/
, g) z1 d$ n8 x8 y) r: {    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 r6 @5 _" A4 u; z; M    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  ! Z7 l: b& X' x# E+ a% @, g4 z
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 5 ?& d6 t$ r; H, N
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );* r3 h% B2 a; U! }3 |: Y1 o
- E, ^' o% T  ]  c3 p. |; ?0 x
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) F8 K9 r+ I& i& {' X. _, k0 l5 c3 x3 C    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ w, K1 D2 l3 m% K
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' Z! F0 [: l! U+ z' K$ g    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! O8 ^5 O9 e' I$ X7 a: {  S- u+ g5 |; |; {. F2 |, U
    mcasp->regs->XSTAT = 0x0000ffff; * Z, v# ^( }2 a! K) t9 b3 A
    mcasp->regs->RSTAT = 0x0000ffff; ; x( p) {+ @6 L9 D% I
. R# c# U2 v5 d7 @- k# r
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& T5 e' [- \! R* \5 F
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );! ^' ^; ^. T" M6 n2 Q8 g
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ! T2 J# Z8 W' z0 U5 t& c
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );7 K9 z# y/ c4 g
. [8 T% u: }! T1 B( S  e
    /* Write a 0, so that no underrun occurs after releasing the state machine */
, Q, T+ i7 D: P0 W, I/ A    mcasp->regs->XBUF5 = 0;
. y& v+ M" V8 K$ x    mcasp->regs->RBUF0 = 0;
' I6 `' @# i0 _- ?8 I% {& k
: L! ^& X& x; F' Y3 F    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + t# R$ M5 @' \  U- I* d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 T1 a5 y7 _' r7 i( `
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, }+ p' f+ ]* u! s# r. [0 K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( N! c/ O' a. l& I" L; l) O
. a' N$ J/ m9 D5 F3 J    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
9 f/ V1 N* B  v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) I! p4 s% k+ H  F9 H+ x* L    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; & @4 g5 u; P% @' \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" ~0 {" d+ b, d7 p/ b7 W2 e  R2 s
    CSR = 0x0000;' z- `6 z- F$ J  T  E0 n
    INTC_INTMUX1 = 0x3d;% O/ k: n* |3 U
    ISTP = (unsigned int)vectors;! ^0 N! y* ]5 o$ h, _$ q4 ?
    ICR = 0xFFF0;  + D  H+ }- E& d' E6 v8 \' q1 q
    IER |= 0x12;  
; U( `( i: R( K$ g9 J: m" K' l    CSR |= 0x01;  " N; A% B# c) e; s$ s9 E& K2 v

3 x! D  c8 i  E/ G! Q# r9 x; x' H

! D! L  g3 t/ x7 P0 [* X还有就是两个输入输出函数:
. L& V, j, P5 P$ @. ]" @; d0 Y( x- qvoid output_sample(Int32 out_data)
: r: L: u  P, t1 h; G1 U- n{
1 a- M, K# [1 }4 a  AIC31_data.uint = out_data;  
4 p" O: b0 w, O$ _( @; k! ^. i# b  MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 G! j, b/ a. h6 E% g9 P}. K) h7 x3 `" b. q7 i

( n: A" |. d9 t" K7 \/ VInt32 input_sample(void)
" N8 x3 f$ h" n* D5 c1 X{  
, d2 J8 Y* M7 K0 ?- M  AIC31_data.uint = MCASP1_RBUF0_32BIT;
! j( ~4 v& @: `$ G% A- J  return (AIC31_data.uint);1 n5 X0 S& J' l# s# y; H. p8 n
}
* d6 [) x7 }$ x: s5 F6 Z) ^6 \/ @2 X7 G- d" l5 v7 ]) v" q

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




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