嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:8 w$ C' f$ \* v, a& m" |
main文件:$ ^2 x5 F! P9 q& z
interrupt void interrupt4(void)  
, e1 p4 N+ m0 Q7 r$ l0 C{" q: {" N# m2 j0 f+ K0 l
  Uint32 sample;
) A0 s' s/ ~5 ^  b0 r$ C; o) E# I+ k4 B* J' M
  sample = input_sample(); // read L + R samples from ADC
- [. f9 N3 l4 u) c$ L8 `  output_sample(sample);   // write L + R samples to DAC . f) R4 i! b9 i: n" P* r& R6 t% ?
  return;
+ U1 A9 t8 f5 y; y% M}" J4 ?' O) l$ f* r8 d. W7 S) E

( X6 N( ~3 i  A& B8 i2 m* d" fint main( void )6 r+ S' t! _! r2 m5 ]: j
{
4 O( Y- {7 _1 U1 [7 z; s
( t* Z* m3 {4 [' p) G; L0 \    /* Initialize BSL */" R: Z1 {/ s4 `+ R8 v
    EVMC6747_init( );, a/ p3 P* U  X, r8 f, _
        /* Call evmc6747_intr function */9 R. W. g# V5 {+ V7 q% u0 D4 w
    aic3106_init( );
$ R9 Q4 _. `. M. W* t        while(1);' J" j4 o/ ^% ^3 p! {
}$ `8 p: C: Y6 L' f/ N
) ~5 y3 i* j2 q8 ~
  k8 v, i5 W9 {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- f+ o1 n: k) x5 r/* Initialize MCASP1 */
' J5 i! h+ e5 ]    mcasp = &MCASP_MODULE_1;
' o; q! D9 ]! U; w    mcasp->regs->GBLCTL  = 0;       // Reset2 W  L( r, j( N) u  u3 A
    mcasp->regs->RGBLCTL = 0;       // Reset RX+ ~- ~) b! I! x: ]; o2 n- q
    mcasp->regs->XGBLCTL = 0;       // Reset TX
( r3 J9 c6 e, y: n; u) i    mcasp->regs->PWRDEMU = 1;       // Free-running
' e. u. n- Y% B* m   // configure McASP0 receive registers
1 S; t6 S9 w+ g) o) u6 v/ q    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
. Q; G9 C; [) \    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' H: v6 ]/ x. U. Z2 ^4 ?% S    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 _2 O5 |& C3 r( V' E    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* d( r8 ~! i8 d) `- [. O% r4 b1 x
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)+ W$ F! }8 a6 z" F7 z
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,15 f) K8 m4 X$ X- Y, s$ Z8 ?
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
/ M3 h# Z# C: l- Z: l    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 X, d4 _7 V' }* d) B0 T
1 J0 L* ?) f% J7 B1 G    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
. {0 \5 O) v$ |    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) y. b+ w1 C- C3 j0 K; H    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word1 t. s0 I) z0 O) d- \
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: {! j9 p; `2 k/ F5 f9 P# T; a' i    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
- H6 N+ I9 H6 H    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
5 V; ^$ Z6 f- l9 E# T    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit7 ]9 z0 {  o1 ?. x6 Z9 F
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* w$ U! B+ j, B" m; i9 ~  {3 V+ n+ x( f% y2 o0 A4 j
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN% r9 P( k- q6 Y, d- \) Z# l  V
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
# h' a& K' [3 w# z% E    mcasp->regs->PFUNC      = 0;          // All MCASPs
! H! I' d8 `. G( M6 S    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 H  }9 |3 S6 y8 q5 w  \

3 k6 ^6 v( L( W+ y    mcasp->regs->DITCTL     = 0x00000000; // Not used
+ N! Q- k% H3 P' j. q    mcasp->regs->DLBCTL     = 0x00000000; // Not used, T1 N& a6 y2 o$ G
    mcasp->regs->AMUTE      = 0x00000000; // Not used
& d+ r* I, g$ X0 i7 f  l- y6 n! C0 ]  w0 Z- e6 c
/* Starting sections of the McASP*/7 [7 ^; v1 F0 B3 b+ S2 T
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ p9 e) s- |: E1 z9 Y/ J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );    I# p9 L2 z& i, ]
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / r8 n- l) q: T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 |/ T* F& b) u0 [7 U5 a, A) H
' F: D! d+ Y* Z: s5 e) @: B    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; / M$ V& k& T2 n+ M8 f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 I1 L, E/ d. ]4 _7 n* p. N
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 {8 Z  y+ t1 _9 Y. \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
  D* |$ r/ ]$ \  L  p3 S8 i) M1 b$ |8 D6 w
    mcasp->regs->XSTAT = 0x0000ffff;
& V1 O; [' ^0 i    mcasp->regs->RSTAT = 0x0000ffff;
) ^8 r: v/ ^" i0 i  [! {. k# |* ~8 Q5 J" `( l. a2 u
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* k+ _% R7 Y, }- T1 F4 K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );. ^' u8 N& J( \" r. T9 S+ V. b2 x
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; {, t" \2 e: z( e  ~* G3 }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: m/ i& |2 Z7 c; h  \1 V5 M
! Q% H; q  `* H8 ]    /* Write a 0, so that no underrun occurs after releasing the state machine */% g6 e3 J- X! [$ Y, `8 e
    mcasp->regs->XBUF5 = 0;
2 p8 N4 Z  A) |2 M% Y3 q    mcasp->regs->RBUF0 = 0;
  @* p, a8 l3 E2 j* D1 p' e# H4 g, w' I8 I
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % u0 j- m+ C+ {
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 {& v3 }9 r% G- w( [# Y    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ y& M# }. r1 f# B- X# ]1 Q- p    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! }, |6 F3 S; D. v* H  [2 O* l6 W0 p0 U2 Y  J
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! [/ p$ Z. P# {% l/ y9 D0 X  A
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 g$ T5 _& z0 n5 K+ J" e    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
+ s- z9 v3 W- y8 ]# d% Q# a8 K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% z! V( t5 ]8 [# Q) D- T5 ~8 i1 X' |
/ q3 _$ x7 N! L+ K7 R/ g
    CSR = 0x0000;" t6 g$ V6 j" j) @) r& |
    INTC_INTMUX1 = 0x3d;. A, b5 e4 U  g) e- a$ k% ]% |) u
    ISTP = (unsigned int)vectors;! ?3 z" h& I1 `) G# [* P1 l
    ICR = 0xFFF0;  ' [7 g, r6 l0 X2 _8 _, z+ W
    IER |= 0x12;  - A5 _7 L- Z4 [5 @
    CSR |= 0x01;  
% w5 i+ T1 y" M  Y) x7 P
: ~: f: c( l& z# C9 W( c& o& @4 u' @' D) {
/ l2 b* K6 `/ q& |* l, a
还有就是两个输入输出函数:
2 C3 m  I8 R5 U4 h% Z: F+ `void output_sample(Int32 out_data)
2 s, M  r" T. L( K6 |{; U6 h! m3 L' W: p9 _. S4 O! A
  AIC31_data.uint = out_data;  
, y: H9 L# [" \" z  MCASP1_XBUF5_32BIT = AIC31_data.uint;! f! Y- \+ ?6 v
}
: E' L% g( z! q/ O$ @3 u' S# r) E% o1 s% c& L- h; I, u5 X5 H
Int32 input_sample(void)
* C; Q4 j4 C0 z+ L: y5 n6 o{  ( N4 @4 l; W' X& A6 z
  AIC31_data.uint = MCASP1_RBUF0_32BIT;5 C7 t; s* I1 n- f/ p
  return (AIC31_data.uint);2 R3 S+ |9 [+ b: C! r' |
}
. W* [5 M( _4 ]- O
8 b' s1 r7 [' C% B1 S+ z- d
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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