嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:; W7 I. h5 h5 O
main文件:
  g/ ~" f7 F5 e0 c) p* finterrupt void interrupt4(void)  ! |/ A  }7 y' _5 G
{% {, |2 @3 O1 y4 i! y; P% f' m& v
  Uint32 sample;! i" T6 ?6 f8 }. l: q8 Q  h
3 G. `/ `" O) h6 E% b
  sample = input_sample(); // read L + R samples from ADC
$ T9 K" p' }9 d9 U+ y* [  output_sample(sample);   // write L + R samples to DAC ; m6 @* S9 u- t, X% X% ^
  return;
7 d( Y6 |  _+ P7 I) ~8 j3 b, D}8 Y4 f3 T# V* x' ]/ P2 m. ^

: E3 m7 _  M1 \- }( Mint main( void )1 b9 Y' z7 b* G" L7 Y7 H
{& i% P6 J* I3 w& _" C
: Q6 T& b% `8 `4 M  S$ Y, _
    /* Initialize BSL */. ]3 x6 Y8 U! M2 A* B
    EVMC6747_init( );
$ B2 s+ ^( i* \9 S( M/ T" O$ I  A        /* Call evmc6747_intr function */
) G: p8 L* D5 t( l5 c    aic3106_init( );# K: B) C; {3 x( i) B, G
        while(1);
, ]8 N' F: J7 E7 l/ w: O: @$ N( u}
; Z; k* Y, ]9 c( E) T4 t  [
$ h7 }/ i, W0 w+ v, }3 w# G
0 B6 A& G2 f$ ?0 M5 x) H! v5 Paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; a6 k8 F$ u/ k8 Z& W/* Initialize MCASP1 */
. j9 i9 G$ C5 O2 \: P+ q    mcasp = &MCASP_MODULE_1;: I& k/ u6 z/ h
    mcasp->regs->GBLCTL  = 0;       // Reset
# y$ `* P5 K4 m- [; q    mcasp->regs->RGBLCTL = 0;       // Reset RX; }7 a+ b5 R3 Q, I. X5 z) m/ J
    mcasp->regs->XGBLCTL = 0;       // Reset TX( `9 ^0 R% N( j: g- N! k
    mcasp->regs->PWRDEMU = 1;       // Free-running7 c9 {+ X! }" Q1 [0 O7 p6 U" y
   // configure McASP0 receive registers
  _2 A; G" y; P, P7 N$ s    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used0 n1 n/ }" A; i2 m2 u
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 F2 {) P+ H0 m, `% x/ X% B  O0 R
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ U) I+ }- d! @, g    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! ~+ S% K& x3 |9 }4 g2 ?    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
+ X7 }% p) ~. ~9 p    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
3 F. p* T/ I1 C+ E% R% l    mcasp->regs->RINTCTL    = 0x00000000; // Not used
2 n8 E! F9 k6 B+ \/ V7 @. y    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ f3 h% i( d: |% b1 z! m7 B- Y
; D1 y' ]7 i% X# k2 s3 k    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
/ i! f) p( d* z2 I    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) r# P) R; C8 B$ _" s, w
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word) F! r* N( b1 d4 l2 b/ G
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 Y) r& t  {8 [3 ]# e
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK' H; P- d0 f) [8 o$ f0 j
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1$ K+ M, N  N4 |% E3 J& K& k
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
5 N3 z; A9 O1 _9 t; b    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 R" p- r4 w: p* |( q; S! Z
2 W* P) \' V/ Y7 |( w# T. K    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN. I- J" G( Z" t- |% F- Q: L
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT; H/ J$ S& X' ?0 d( x# U
    mcasp->regs->PFUNC      = 0;          // All MCASPs
% x# @! x1 C/ l3 l: X    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX19 l+ g" h3 U  F# R# B. j: a

* e) Q$ Y' f4 w7 T( e7 i    mcasp->regs->DITCTL     = 0x00000000; // Not used9 W: k. y' g. C+ ?5 P
    mcasp->regs->DLBCTL     = 0x00000000; // Not used$ P# i, n, @3 N% c  _
    mcasp->regs->AMUTE      = 0x00000000; // Not used
$ E# C9 J1 |4 i' s9 a/ g3 g5 R- q. Q# n; A) V+ j& d
/* Starting sections of the McASP*/1 U( L& T# j- A2 E# Z+ W
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ) ]1 y/ o/ A& r! b/ R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
, Z+ m8 k+ ]2 e! B( Z3 @/ D9 X    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 U8 ~4 Z" \& V3 c# h( b' M    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ a( z. c+ |8 s4 p
$ c/ K- h, `8 K9 R8 R7 e    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) d. M4 ~+ k, a; M+ F+ L5 d( D( J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );2 R) D% q( H# W, f9 ?6 o
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % s; n- _; z' W4 \* `9 O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );: ?+ j3 I+ x0 ^
% i- U. H' Q2 z
    mcasp->regs->XSTAT = 0x0000ffff; ' @4 z) J& I6 G6 W1 n
    mcasp->regs->RSTAT = 0x0000ffff; 5 j$ Y$ ]7 i7 |- _1 x  G4 C
$ Y8 ~* J3 c8 `0 [: h8 u' V) e
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 c0 c4 m4 l) u" z2 O    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 M3 p! v5 \2 v0 A1 Y$ B! _
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; . V' }8 O: H  O/ W5 z6 @
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );, j$ @- u3 I' o5 n5 U& I6 t
6 z7 z; H9 `+ m- V" M& p
    /* Write a 0, so that no underrun occurs after releasing the state machine */
5 u0 q8 Y2 H$ Z- f# U; G9 A! f  K    mcasp->regs->XBUF5 = 0;) \" B+ {# R; u7 g8 K
    mcasp->regs->RBUF0 = 0;
/ y" J" l! X4 k* N1 E' T- b, \8 [- a8 b3 F9 s
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) P- o) A! A* s" ^1 O) i6 v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );' U* s3 ~# P7 _7 ?. j+ Q
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 4 e+ q1 C/ Q" `0 Q8 ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );+ G# \  m2 |/ V' d* N
4 ?- n/ N& x9 u* E. T
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ ]5 Q! d/ `5 _% x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ I* n/ c  F' e  K) L; u5 y4 A    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# @( i6 u9 E8 V! V6 L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! S( M/ n* T$ d/ h) }; _% m1 J: J
    CSR = 0x0000;7 h  t. j* t7 N# {
    INTC_INTMUX1 = 0x3d;# X5 Q$ b1 a9 a4 B) k6 p$ q
    ISTP = (unsigned int)vectors;/ z; w6 B. \, n& h5 L% e
    ICR = 0xFFF0;  
, B; r3 t! [$ ^! j# m    IER |= 0x12;  
9 W# e; G: x  |/ S' _2 a    CSR |= 0x01;  
  Q2 r/ v4 o+ q3 k0 [! P
- K$ w  [; W9 ^: I1 P7 s- J( E% `  d, [* I/ m/ c

, C% d2 x, y2 Z+ U$ m还有就是两个输入输出函数:) }, f8 B) u( s2 {0 y5 `" ?
void output_sample(Int32 out_data)4 D: g. j: {2 E2 u/ P1 G
{( K- G& Q) ?* Z/ J- |
  AIC31_data.uint = out_data;  
. a+ |5 L$ F) d9 w8 ^0 m7 Z  MCASP1_XBUF5_32BIT = AIC31_data.uint;
' r8 @; p) L3 N* \}
) Z5 i) m1 T: ~5 x  t# \& c* _. p; q) ]9 y7 j0 b
Int32 input_sample(void)  D+ N/ k+ Z- o+ W0 [( M
{  
& l: y2 ?  `: D. n: E- Z  AIC31_data.uint = MCASP1_RBUF0_32BIT;* R) B9 Q2 e4 B+ Q8 ~8 N
  return (AIC31_data.uint);: G. b% d+ n# u0 [6 F
}
0 \7 L5 c0 i, F
0 i# ?6 W) c! k6 T6 @- E" L; n; F6 E
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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