嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:3 G8 _  ~9 _9 i( I' |: W9 \! ^
main文件:
0 }5 N% ~' ~* p1 d! s' Dinterrupt void interrupt4(void)  ' |' P( w7 I# a) j. k6 k& @; H
{
! z9 h/ u) F9 K; W, I  Uint32 sample;( l& T9 X) q9 j4 ]+ ^( k

2 p5 e5 }. m' M7 q: G5 m  w  sample = input_sample(); // read L + R samples from ADC
& }( ?; Y) |# Y5 b, Z) W& y  output_sample(sample);   // write L + R samples to DAC 6 J! F) D7 m* X
  return;
5 ~) j4 e) v0 s' \! \" _3 _}$ ~% G$ t# r' f1 ?* Z! J4 J

; w. g2 T" h7 q% ]8 Y; P( vint main( void )4 U. k6 w" O0 }1 U
{
; A9 D1 G6 |4 u; }
: \) r' d  g* a& l9 ~7 V! k# g    /* Initialize BSL */( g3 N- W: o; f
    EVMC6747_init( );# r, i' `- Y1 T9 |4 y& e
        /* Call evmc6747_intr function */4 _5 _, s5 s: e3 {) u
    aic3106_init( );/ u7 x6 q+ m+ ^- U
        while(1);
2 q7 j# F& v0 O$ z: n+ q}
- [& H" Q7 T" ]& g8 k$ E7 L8 E7 T9 e: Z( L! g, k5 h
% }6 v; k9 _% k$ S4 v0 L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. u$ I6 l" I( N, x9 m/* Initialize MCASP1 */! W" O& v: m6 \8 P/ ^" A
    mcasp = &MCASP_MODULE_1;
' n8 E2 b. R6 Q; o, T7 @) _( B    mcasp->regs->GBLCTL  = 0;       // Reset
' {* M( W; ~+ F' R5 o) `6 M3 t    mcasp->regs->RGBLCTL = 0;       // Reset RX, a. d9 R& O% Y2 ?2 G1 i0 k- w% `. X7 {
    mcasp->regs->XGBLCTL = 0;       // Reset TX
  u5 Q! Q5 ~' v5 G: P  L    mcasp->regs->PWRDEMU = 1;       // Free-running6 W) P* c! i9 r
   // configure McASP0 receive registers2 v& C% ~2 B& D: A+ c; w& _
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
6 O  V& U  Z+ Q" e5 h    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 q1 a( ~2 l& X- K& C3 c    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word( W# [- n( g+ P
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side). ]0 I1 H' \* Q
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
$ Q" y8 b+ Z. @7 X0 l2 z    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1# z. e% Z4 y: d8 |$ O2 l* ^  ~' V
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
7 U5 }7 v% B+ Y  U7 b! c    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 c) G! v# i3 P
9 ]& ^6 E* R: ?0 x! J4 ^    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
2 H/ E+ n  P' X* Y# u, M, X    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& n9 h3 ^+ d  U9 q
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word; p( L% i" D* {5 p; X  c" X; i: ]1 F
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
  C* l5 l; R9 p    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK: k( q- O% M5 Q. j
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
) X% R! X/ U( E/ G    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
- b9 R3 q# i4 J; o$ i9 j9 ~' d$ n    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 ]  |4 p  U0 G! _" y+ `  Z0 i0 K. V) |

2 g- e7 M5 s  J$ ]" {    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
9 s4 y- E, K; y2 [  Y    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
4 T1 P+ B+ o2 K+ U, c" i1 v" w    mcasp->regs->PFUNC      = 0;          // All MCASPs6 u$ ^& b# R6 K& ]. ^5 D
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: D' y" Q0 s) x0 m( N

; R8 t$ @4 Z6 G' F% f! t6 o& U    mcasp->regs->DITCTL     = 0x00000000; // Not used
- S& m1 G7 X8 s5 u    mcasp->regs->DLBCTL     = 0x00000000; // Not used
1 i3 Y0 J; g% d  @+ n8 n    mcasp->regs->AMUTE      = 0x00000000; // Not used
3 A1 |' z7 K; u' n' c+ c* r& x- w" r& \8 S  A- M! G/ [; e
/* Starting sections of the McASP*/
0 F- _9 W- a4 o! c6 n9 h* x1 C9 c    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; + H/ s  N+ W4 Z; N- M& P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  6 _; M4 w, ?7 X( f
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% H  A9 B% h+ V' U* y; A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, I" a6 U  L! }7 |2 X7 t. X8 c3 P; A
0 I, P; i$ M" [5 @    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 2 Q  `0 x" W4 G( W- u
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );; z9 y! J: H" p. ^3 ^1 t3 d( o
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ) E2 u: [6 I) D# m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( Y3 R( \( f! X" K  b* m
- K6 K, n) h* R' [- n1 d1 h0 h    mcasp->regs->XSTAT = 0x0000ffff; 0 t6 R) W7 r* ]+ J/ w6 ^
    mcasp->regs->RSTAT = 0x0000ffff;
2 o3 ~: o. W+ R. [, K# p% V! t; n$ f/ q
4 \6 S: r) I9 i- e- h$ W    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;# ^8 c3 `9 n3 ~9 H6 [* w7 J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! {5 u& w' {( O: i7 S    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
  h$ b/ V( v9 X+ F. s/ W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );) a. t; N# o/ W  q& }# \" u7 z" \

7 {  W! T- _+ B! ~3 W    /* Write a 0, so that no underrun occurs after releasing the state machine */' A% B  u2 D: t  K3 N6 ?  m' V0 K
    mcasp->regs->XBUF5 = 0;2 u! R9 E8 \# m$ J/ Z3 J
    mcasp->regs->RBUF0 = 0;
* U! s: {# u, G0 W9 t7 A9 ~' S% T' T! z7 Q# L
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; # Q2 q1 d' e+ D* Y1 [( S1 _+ y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
; v& V9 A# V# y4 c9 d5 g4 c4 P6 E    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( H+ ~7 y5 b6 E9 @/ I3 b+ h    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 X  e8 K' \4 m+ K* I2 N5 @/ G4 V. d, g  B4 |
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; $ R# q/ d# j$ e. j. U- J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% C0 `- G1 c; k7 M. z. m    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 3 Y8 f. j3 x& F
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( I; T* J1 s7 E6 L8 }% p2 H. y7 o' n! v- e2 L) d( @5 e
    CSR = 0x0000;
8 z3 H" ^6 X/ P( n. l. A" A  K    INTC_INTMUX1 = 0x3d;6 K- |! i7 K% t, K+ n* P
    ISTP = (unsigned int)vectors;
  ~% i8 z% Q, i+ t    ICR = 0xFFF0;  7 h0 J$ M, l" ]$ A1 U( F" n
    IER |= 0x12;  
6 g$ B; X3 d, Q0 `6 _    CSR |= 0x01;  
7 u$ _" q( S$ i/ e, j% u6 }% a# p

8 \- y, n; M, m# t$ e1 Z* J2 {5 j( B3 {& o: t, N/ d$ ], Q" u
还有就是两个输入输出函数:5 P6 l' b/ `+ [& r
void output_sample(Int32 out_data)
) Y1 B5 s3 V) `8 D! E, }{, X( k( I! y+ s  V; d
  AIC31_data.uint = out_data;  ( Z* B) E$ S0 T% Q
  MCASP1_XBUF5_32BIT = AIC31_data.uint;0 H4 m/ G6 m8 ?2 T
}. Z6 N# s; ]' i

7 F% ^. F; e) z6 o: U4 H; aInt32 input_sample(void)# {' h% H% i3 ^$ K% F9 r7 J( @: z
{  : q9 n6 D; \7 V1 ]
  AIC31_data.uint = MCASP1_RBUF0_32BIT;3 }( J! d2 v- Z1 I! G3 [
  return (AIC31_data.uint);5 N7 {- N- R5 y( |- C( c4 G
}# r2 C, T6 \- E& A

5 l, U; ?6 u: j/ @9 q4 _. G7 O
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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