嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:3 J6 I" ~* V$ P! d3 S* j( s
main文件:# s) u+ f. M" I  k- ?$ O9 v& s% G5 ^
interrupt void interrupt4(void)  5 \5 x2 g! l' e' _
{
" n* y& c4 z# m6 H) y# @# }  Uint32 sample;" Q; x" g, a/ C" Z; P7 k
4 T+ b# M6 i8 b* @) G0 w
  sample = input_sample(); // read L + R samples from ADC
# e: a- z3 H4 c  output_sample(sample);   // write L + R samples to DAC
  C; G. N# y: l( A2 t+ {  return;" ~& O& Z1 d+ g# Q
}
$ W* F7 n* g$ W- M7 P7 C' f0 I
& P5 n) p3 A/ i1 cint main( void )9 N" S- x( P& p- F
{
& B5 A! G2 g: |& x, j8 V' s5 k4 @( w' x/ `# q6 \) [
    /* Initialize BSL */
% `! J) k/ S5 K8 H4 x; G    EVMC6747_init( );8 J3 x8 |' H- S# B4 \
        /* Call evmc6747_intr function */0 X" U) U+ A. c3 m) J( ^+ _
    aic3106_init( );
6 q# ^" Z+ U. b        while(1);& \3 ^+ g# x# i* Z& \
}
. ?  N5 Q3 t1 v; V' ^5 {1 A9 ^) K. ?# J# m

! w. V# c/ ?& B! k$ y! `aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" S8 |8 x1 P3 H0 j7 }6 [
/* Initialize MCASP1 */0 y0 ]# F6 `  L* _
    mcasp = &MCASP_MODULE_1;2 [# \- a: }8 A  [: H9 f
    mcasp->regs->GBLCTL  = 0;       // Reset
" f3 P* ]0 E4 z- R! Z  o    mcasp->regs->RGBLCTL = 0;       // Reset RX5 P2 R* I' E. E7 B( _# m0 `7 @0 B
    mcasp->regs->XGBLCTL = 0;       // Reset TX
. F* b( m$ ~# V0 T* ~    mcasp->regs->PWRDEMU = 1;       // Free-running
/ v8 E7 u8 K3 [, X, B   // configure McASP0 receive registers
" u7 {8 t7 |4 i& l- h0 O8 _    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used8 P; o& @% j, y# J( l
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* ?: J' z( v" t+ K- S: Y. [3 ?
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 ~  M$ p  R, D4 ]1 ~# O# J
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)+ ?& T! z7 ?, Z0 t9 f
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)! U! {- F) G; J& a, D- B
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1/ ]# r4 J/ j9 d. [! f* h  _$ g
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
& {$ y) d( a* M4 ]    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 Z: n/ L, l1 w: b7 @! N
2 M& n5 G7 b" V) Y' ?- S: D    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
) P5 c) f  c; P8 d" q, @# Q7 D8 c    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* ~; @* r: k( R4 ?5 F: @/ f' p
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word6 X4 N0 v& Y( x, ~) Z0 J# R
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& f3 I0 H) v: }1 p    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK: ^# E9 z" ^( f- ?6 P) l% t0 S& _
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1+ |' V6 ~% @# T0 u1 m
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit- d0 B# I9 v9 B- ]  i
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 y2 C3 R+ X+ O! q- r$ ~7 l; p4 e' s) p
: ^" r, g' Q8 l5 x9 N: `1 v    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN  h$ y7 p* q* p5 R8 `) L  ]/ M
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
) l# m  V( |: j1 {    mcasp->regs->PFUNC      = 0;          // All MCASPs) |) i1 z) w# E2 H0 R6 X8 U' ?
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
; G; e9 O5 K6 Y+ Q& E. [  x
. q) D( r7 x4 e, H5 p    mcasp->regs->DITCTL     = 0x00000000; // Not used
  m, d9 l, V8 ~+ c  j$ Y    mcasp->regs->DLBCTL     = 0x00000000; // Not used, Y4 g/ U4 n7 \1 X7 z
    mcasp->regs->AMUTE      = 0x00000000; // Not used2 T; Y# N0 M3 Y) I/ d& d) s
: u. ^% U% |; O/ H: |, d) S
/* Starting sections of the McASP*/
# w& n% |" @) Q- P. H& Y, S2 V    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 m' k7 \- `) i6 }! w0 a2 Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  ) Y& k0 |% h& f+ j: H0 P" R
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 C+ G. Y$ g8 k* Z" o    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ P" C) _: e8 Z' |

3 A0 t& p3 P: s6 X6 z) D0 X    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 p" W5 J0 w$ e2 ?, S2 X    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, \/ b9 ?% w# T7 J: ~; {    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% X" g. A' I5 r+ a8 U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
7 A- u, d2 f. N# u6 C: y5 f8 u8 W; ?- u6 r9 a
    mcasp->regs->XSTAT = 0x0000ffff; 0 n. T+ ?) m$ {8 A: F
    mcasp->regs->RSTAT = 0x0000ffff;
+ _6 d/ T. d5 B/ \- l1 Y" c
" |( R3 n7 _2 N! H, v8 g    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;$ w" c) I" y/ x' x$ A. I
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- ]$ ]3 ?6 n" D9 x% M9 J9 f
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 7 j$ V* t7 p: y" I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
' |: L# ^/ l0 O3 j3 O) W$ e; L
: w! O$ r5 F* _# Z    /* Write a 0, so that no underrun occurs after releasing the state machine */
: y" J) E% q1 O" q8 M, M    mcasp->regs->XBUF5 = 0;1 G/ j/ w7 {8 `
    mcasp->regs->RBUF0 = 0;
. h& d2 d' \3 Z& [8 P  O8 m( y. H  e  K% W: v% D
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; $ `* _, E% ?& l& L# V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 ?; q, r+ Z  ~4 U& {! k    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' }" b5 X6 Z, y+ G8 h. {$ s
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 v8 Q" u& o$ J% ]4 z: V3 a+ J
5 }4 A5 i& [  A  q, B    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* o- \( ^1 r. {% E/ |! P    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 y* }: i$ c& l/ l  s    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 S/ a! E; W  t/ K' M( M    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, e- p# u1 A* }! o% n' F3 _
6 v; l9 G1 \, S5 ^    CSR = 0x0000;
" v$ [5 I4 }; n$ r/ T# H0 n    INTC_INTMUX1 = 0x3d;( r( {% Z6 X: U) B
    ISTP = (unsigned int)vectors;0 s' b$ h* A, P, e9 O% o$ n
    ICR = 0xFFF0;  % |  j/ c% N4 d0 }
    IER |= 0x12;  0 T/ H- q& I+ v
    CSR |= 0x01;  
9 B0 O' R, m) `, x& i4 \; G# R- ^& _( ^

8 m/ B  E& m- M# K. A: n: l/ ^( z/ e8 T
( h, X% _7 Q% b- a, J! B- _  ^还有就是两个输入输出函数:
5 U7 w, E3 T, z; Nvoid output_sample(Int32 out_data): \* v; Y: a3 o* O) f
{4 D: @9 f& W. R" p
  AIC31_data.uint = out_data;  / l: Y/ g( h* @7 f  [/ I* N
  MCASP1_XBUF5_32BIT = AIC31_data.uint;2 D4 V# v+ A3 i4 u& x
}1 r4 q# m: H2 ]  x2 Y% C8 ~5 W, a4 {
: x2 e8 C3 p1 P7 |: T+ a! X
Int32 input_sample(void)
9 Z$ s, W# N4 W- I8 e{  # z* @; v: z) u" Y8 x! Q9 ^$ @; |2 K
  AIC31_data.uint = MCASP1_RBUF0_32BIT;* E3 Q* F6 P+ c6 A
  return (AIC31_data.uint);4 H' `& i7 u( I1 l$ `$ J7 R
}
$ Y( n3 e* e( ~! u' Q# D) V6 P, g- A! E3 K6 e8 @7 N) o

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




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