嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:, ^- w$ Z* S3 {* F
main文件:
# h( |! ?) l2 Ginterrupt void interrupt4(void)  
' D$ ~% P# k1 W6 t{  x' X$ }0 f' b  P6 Y+ z6 {
  Uint32 sample;/ A% S. E/ ~! q/ ?3 u7 e9 p2 R
- B: Y; \$ S& B* o5 ]
  sample = input_sample(); // read L + R samples from ADC5 x  C2 {  W: A3 @1 G( ^
  output_sample(sample);   // write L + R samples to DAC
2 z! K: O0 m* }5 t  y* j7 \  return;
: G' Z9 A  @/ Y" y7 C& J# a- m}
7 T1 Q+ Q0 C- d1 Q( J! g8 K5 x- T) y( p- R  {* f" f# L8 U, d6 l
int main( void )' ^( t7 a3 f( S
{
; X- E# N( F" O1 ?) G$ F, Z% ^; s9 R
    /* Initialize BSL */
( @+ K5 y7 h$ y+ d, e5 @    EVMC6747_init( );
3 ~8 ]8 b* u1 h. f3 }  Z        /* Call evmc6747_intr function */& c7 B- a9 `# F0 r' N# z, J' e
    aic3106_init( );
( F8 j# O. R; F5 j& S. @+ I: L( H        while(1);
( o" I2 h5 R$ F6 {8 V}
8 d: N0 r# G$ I% l% [( {8 x: m1 ~0 g9 ?3 e
: s. e5 p. h. h; L" W
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 `- P! Y/ `" q% r/* Initialize MCASP1 */
  `  u% R# W+ _1 _4 t# r    mcasp = &MCASP_MODULE_1;
3 Q5 T' Q4 b9 g) I    mcasp->regs->GBLCTL  = 0;       // Reset) R  K4 x. p! }! n
    mcasp->regs->RGBLCTL = 0;       // Reset RX
. Q$ n4 B( _* E9 R$ B8 q" }& a1 }    mcasp->regs->XGBLCTL = 0;       // Reset TX3 \4 B9 Q7 c7 r3 h/ X$ {
    mcasp->regs->PWRDEMU = 1;       // Free-running
; z- R: V. f$ c8 Z5 Q   // configure McASP0 receive registers
7 }  |9 K0 R$ w    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used3 E2 p. F+ L/ a* p) M
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 e1 m6 b. j% {$ L
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word3 z  t& P! b+ f! v2 x6 G3 H
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)( A, M! A! o" t4 S+ j+ g$ f- l; o
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)- |3 h; L7 U, R& ~; o
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1  L9 C- W) g$ o' A2 Z. t
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
. R' o0 q0 n  X$ R. E* }    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; \! m/ C* g: n9 {% X" p) v9 |) A
1 T- M- Z( O, s, }# u
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
5 i+ j3 r0 D  n/ |% c* ?# `    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" C9 `% e$ s% d7 \* a3 x0 h
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 o! h' K; t  T8 i" K2 Q' r, c
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 i% a' y! V1 l( p" W    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK& }) C- A! |( j9 ^3 a
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1  R2 j; x& o+ {3 `
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
" V8 t0 a: g$ U, N' j% z* Z6 S$ Q* i" [: k    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ a: u7 K3 P7 L
- C3 u3 h: E6 f$ Q7 n4 D    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN) H" N' t4 w3 v4 b" R+ r3 C+ y% \
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT# l; @( m9 v2 X9 \; ]) h
    mcasp->regs->PFUNC      = 0;          // All MCASPs7 S; U2 ]' [, c2 _* w
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 b0 I8 Y, Q9 M5 ^# k

; x3 i% M* d9 y% M$ S" y$ o    mcasp->regs->DITCTL     = 0x00000000; // Not used
, J, h9 q: E; k+ k, }    mcasp->regs->DLBCTL     = 0x00000000; // Not used
. d) u, S+ N+ B  J/ `    mcasp->regs->AMUTE      = 0x00000000; // Not used
0 Y4 I& n( ?9 V0 f5 s. e/ {$ i& Y. M& w: K
/* Starting sections of the McASP*/8 O" y5 c0 R& j1 \% A
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 D. F! T- a: N# @$ ]: N  T' W) _
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  , E' \$ F; ^: B2 k, w
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 3 @0 J- q7 r6 X9 r- ^
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );) i/ N4 d! ]- ~- W

' k- _% d- ]0 e1 q6 m- U/ L    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( D: x% p; X% m( j! X/ `4 _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 j( ^9 E7 g# u0 M
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * z2 H6 X$ C5 X9 X. x2 Y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 B: o" E4 N# a/ C7 V" E1 ^; ^; M5 _
    mcasp->regs->XSTAT = 0x0000ffff;
6 b: |; L, x) m) b0 r8 k$ v    mcasp->regs->RSTAT = 0x0000ffff;
$ f: S5 o5 U2 y8 C# K9 x7 a# N1 A
0 _. x( @9 X  P3 X' ]    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% f( W* |$ K0 T    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
  l! S) z0 e; c2 i) o- Y# Y    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 v8 @3 k  E, U# U- o% W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ e! O2 V. w* Q2 |5 a8 g

# U1 G) S  R3 c2 R    /* Write a 0, so that no underrun occurs after releasing the state machine */& W+ J3 ?  M" F3 x
    mcasp->regs->XBUF5 = 0;
2 q" }* W" c! t) d  D    mcasp->regs->RBUF0 = 0;
* {: _$ W% d  U& T/ n7 ]2 G8 i+ |
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, ^9 E& Q  A5 S* n, U: \8 m9 z6 v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );8 ^. v+ }+ ]/ E6 W- D' Q
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; d8 \; k8 W: x/ l4 k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 [* U4 ?* T2 m/ ^* S; I

8 J/ A) `; P. ?9 x' Y) D$ r/ H( e* J    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; K' A$ B/ ]: R/ ~0 V# {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# g' _( N' I' \3 ~' G5 }1 M. c' u    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 2 m3 A) p6 o% Z/ ?5 i5 P
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 A9 h! r4 r. x+ Z4 u
4 @, g! d+ b4 w5 [; b6 b# F, l    CSR = 0x0000;
6 N" p, n6 E9 I% z4 w( Y/ D    INTC_INTMUX1 = 0x3d;$ y$ N6 Y1 |! J9 Q7 V
    ISTP = (unsigned int)vectors;6 ?5 X4 P9 \. q" @1 x
    ICR = 0xFFF0;  5 {# H  E# n9 `8 J) o
    IER |= 0x12;  
8 O" ?9 R! d' ~" [  L    CSR |= 0x01;  - J3 {0 R" \& l. y
$ w5 L( \' U; Z! T0 q

4 V6 N: [5 @& a7 D% `% \! W" n3 w9 F7 B8 q+ i3 c& Z# U
还有就是两个输入输出函数:  p1 T" a. C. y) q; q
void output_sample(Int32 out_data)% X. j8 @* U9 H
{' @9 H  A$ J0 I
  AIC31_data.uint = out_data;  
8 S0 R5 o" C( c  MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 X9 y) \* a# }4 e}5 {" N) [; ]$ S: v; b( k
. e: [! C: y; Q0 X
Int32 input_sample(void)
. D  i, L# K- ]" {" x( f{  4 O6 Z/ s$ e8 e
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
) Q( r/ y& g2 K8 z# @9 C  return (AIC31_data.uint);" y( B9 Q6 k7 s" B1 v, ?. t5 o
}
: v# y9 W$ Q3 B# }; P# b7 D4 X
% _' F9 z* F* M
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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