嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% Q3 y) |( c; X* q, U; e+ umain文件:
8 L* C. g8 |" @& ?$ q9 s  P7 D3 Sinterrupt void interrupt4(void)  * |* R9 S3 T8 [( s& q
{
' G* T, d. U! j# H9 g- j5 O, j1 U: T  Uint32 sample;
0 i% Z% @6 a; _, Z5 K2 i& T1 W7 Z( p( Z# c* e
  sample = input_sample(); // read L + R samples from ADC
4 k' }; d+ Q- i1 W% q5 t0 J  output_sample(sample);   // write L + R samples to DAC
6 L- h7 Z- T3 G% @2 e0 w# a  return;
/ t% d+ j* S4 S0 k6 R}
5 d5 b6 A9 r' |$ r: Z
' Z5 F; d" Z. d7 `9 wint main( void )
8 O2 [1 C# X  c8 C/ Z{
( k6 x4 @- C1 `" ~/ U: l- J% ?- s! K5 u: E* a1 \- F) N" X& i
    /* Initialize BSL */
4 G- N* k# m1 {3 d" A/ H    EVMC6747_init( );
' D1 p) ^3 Z! k( X        /* Call evmc6747_intr function */  t: @9 Y% u/ y; x' R1 H
    aic3106_init( );
$ m; ]- }( |+ S$ B" n# W! p        while(1);# c0 s' @# x0 q2 I- _% ]! W
}+ [& r5 {5 E- ~) P2 P
- {8 u7 W0 A# ~( m: i4 Z) u
1 V+ N, R3 L# y. n" H
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题* _4 x+ h& g1 Y0 _
/* Initialize MCASP1 */
4 O6 V" Y5 b9 d& f* t    mcasp = &MCASP_MODULE_1;
+ k& w( ?8 x. P% M) v# R    mcasp->regs->GBLCTL  = 0;       // Reset
5 _% J7 d9 J* f& r( _1 ]) N2 R    mcasp->regs->RGBLCTL = 0;       // Reset RX. T$ J& d9 L7 n: a4 X; J
    mcasp->regs->XGBLCTL = 0;       // Reset TX! {1 [" c4 k9 B/ j& F
    mcasp->regs->PWRDEMU = 1;       // Free-running
* j& @9 t* I6 V& z+ R" `   // configure McASP0 receive registers
# \5 G) v7 z/ U3 c& v    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used( Z7 L6 J6 {  q6 O
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 H1 J4 Y" o3 m+ u    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 L' c6 o7 b6 @8 E% \    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 c1 {( d& C# u$ a+ \
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
1 X/ W% ?4 a6 g2 a    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1& ~2 l3 ~# H+ W8 G  a
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
) N+ G" |' l  e$ r. u: Z7 j6 T4 m    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 @% ~  ^# ]3 U  R& L

& \, V9 T9 ~0 A9 J5 x    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used0 d. O; _$ `+ {; C8 v+ Z* U
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% N3 s6 _" d8 R    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
  G. \. V! V! i) B3 _    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16/ g: D$ q' R3 {" Y( j2 c
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
& J4 F4 {& L" f3 h    mcasp->regs->XTDM       = 0x00000003; // Slots 0,18 n  a7 c" j9 q% b5 n
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 Q3 U- f, X/ R; B9 M7 D+ A: `- [    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) p6 D0 k5 x, c5 i8 E$ G# {& D
- j: k5 w. t4 y2 O    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
7 n8 q8 T, U2 h7 y6 r, T    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
4 I# _' {# c5 p9 l/ t' X5 [    mcasp->regs->PFUNC      = 0;          // All MCASPs& F  C8 R/ b: Y: h" [4 K
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX12 f! g& n3 r' o4 r' i
+ k& [% g9 {2 _0 ?6 [
    mcasp->regs->DITCTL     = 0x00000000; // Not used( G  y' x$ l8 ~1 n* x$ H& h8 C/ {% E
    mcasp->regs->DLBCTL     = 0x00000000; // Not used) I( f; m  D- x& _6 o
    mcasp->regs->AMUTE      = 0x00000000; // Not used
) J9 H4 m8 B3 I% w7 k- Q' k( ~% o1 y+ R
/* Starting sections of the McASP*/3 e0 F, K) M  F# {1 c. U' [# f
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" c( W$ j9 I* s! S/ b0 D  i5 D    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
5 F  R, z* A" A    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- J  y/ g3 T( h    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ `+ b" z3 h7 A7 X

5 Z- S3 L6 Y1 }4 |4 e    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 H$ {+ I0 f& n& X
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ I6 D- C) A0 y% I' e; _
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; " ]! {3 E- J. K1 G1 W2 c/ Z8 C; X2 U
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ m' E# M9 W1 u+ |
* x, c  e5 V+ `) o. w8 F    mcasp->regs->XSTAT = 0x0000ffff; 5 J9 y9 w9 a, B5 W
    mcasp->regs->RSTAT = 0x0000ffff;
+ [1 {5 m' z5 L8 ~" k6 x4 A6 y) q& y( P0 f
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" i  I' e4 V8 U# G! W2 n    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; `! S4 A, w- F4 K5 r    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; * S* K$ C: M+ b" R  Z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );( F1 F" k; J3 D5 b' e  n

2 X9 e( |7 u1 g, Y# ^% L* T& a! k7 M    /* Write a 0, so that no underrun occurs after releasing the state machine */- V0 M' K2 m4 t- ^
    mcasp->regs->XBUF5 = 0;
& Z; d! S* ]$ G9 {- C    mcasp->regs->RBUF0 = 0;# T' j3 ^7 w$ [; n% s6 ~
* S0 K- u, K! Y" Z
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 b  Y& w9 N% t0 N; s& C    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 D& d2 j/ L1 F' w$ }; W* @
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 E+ L; Z1 w. t8 N    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );7 w& U- A) m, H

" ?/ ]2 ^8 M+ w    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; / x" d$ P, a( M. t
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% `* T& [( B/ o; I5 W    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' k4 ?6 D! D. r9 U  _    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: V/ I" R/ b& ?% S, D4 q. c
- w8 T' h+ Q9 v* y7 X% b2 S' I    CSR = 0x0000;
: c6 Q% B8 ?- I; L    INTC_INTMUX1 = 0x3d;! ]/ Y: a4 l1 Y$ D( m; C. a$ }
    ISTP = (unsigned int)vectors;/ d0 A; f6 |) r; _
    ICR = 0xFFF0;  # T6 q# R7 X! ^" z7 Q4 t  ?$ i7 g
    IER |= 0x12;  
6 C5 H9 i) \( ~# u8 x    CSR |= 0x01;  * {2 a7 o) B' V
  n; c5 b: ^8 c3 a! L

' C3 f8 y& A" q3 M+ {) I9 @- _0 a
还有就是两个输入输出函数:
2 s. u: N7 @0 [* v8 k6 mvoid output_sample(Int32 out_data)
, F* }  W; \+ P- w$ R{
6 u) B# O. e8 {. {1 v  AIC31_data.uint = out_data;  
; \; y0 H4 m1 t1 U! x  MCASP1_XBUF5_32BIT = AIC31_data.uint;
# j$ x7 W" |0 d$ P. u# f' S, C}6 {5 _( ]7 B% z- ?. A% \

+ v' h# o; a- t; X5 L% ]9 JInt32 input_sample(void)) k$ T7 F6 ^# A8 Q5 v1 \0 ~
{  8 n$ z5 G9 s2 P
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
' t! n! F! Y3 N) F  return (AIC31_data.uint);
4 G1 r9 L  Q& s- m6 @) O}
1 Z8 G  Z* _/ `& U1 L) F: K) E& E
* S# H( O$ m6 M; A2 I! L% l
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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