嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( S  N8 U. k( @' P, ]: N  @6 rmain文件:/ H2 o; U4 j; Y% @9 D
interrupt void interrupt4(void)  
% P4 T) |  h; b- e6 c{
+ k1 Y$ X/ r0 e% n  Uint32 sample;$ C8 e1 c! c. Y. j2 z

" I+ ~& U# h) a; i' I* f  sample = input_sample(); // read L + R samples from ADC
3 t4 \- `, c( L6 ^; S* }6 u  output_sample(sample);   // write L + R samples to DAC
/ l" l2 u$ n: ]' m+ G, S9 W  return;# V6 k- D' p& T
}" |2 }: q. X, }; m7 O
$ U( z& Q& t1 h1 _- u- |7 T; u" p
int main( void )
4 w1 b( h4 {* T8 }{7 @, @9 v" J: U) [& E& \. m

, P+ G0 ~8 w/ p* z2 S0 Q0 R& `: L    /* Initialize BSL */
: J! B: S, n. e- Z5 ~- H    EVMC6747_init( );/ B, K( q. _  N% p6 F
        /* Call evmc6747_intr function */
0 t6 J5 ^5 ?6 K    aic3106_init( );
* Z% b8 U/ B7 r* T( l8 [        while(1);9 d0 {9 |" F0 b
}
3 z2 X) `; V# B! ~
5 g% B7 m4 m8 e
8 H2 _- u! q8 K2 n" Iaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题* c- _" _5 Y$ V
/* Initialize MCASP1 */
7 G7 K8 L' b5 V# I; u8 ?: r. u" N2 [    mcasp = &MCASP_MODULE_1;
5 ]$ w, q7 I  X9 @; u/ P3 Q    mcasp->regs->GBLCTL  = 0;       // Reset5 N: ~  s; F  U9 D
    mcasp->regs->RGBLCTL = 0;       // Reset RX7 V" p# @$ U+ d# D+ y7 `
    mcasp->regs->XGBLCTL = 0;       // Reset TX
0 ?, n5 Y( l2 }- y2 ]' ]  Z) {    mcasp->regs->PWRDEMU = 1;       // Free-running. z7 L# g& O* M4 C) I7 p9 x6 ?
   // configure McASP0 receive registers
, f- ~' x/ Z5 ^+ K" H' d; {" C    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
8 w8 D( g8 M7 L+ n/ D    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; [1 h, \8 x( ]    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, L3 t) D+ O( J1 [* ]+ J    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; y8 x8 b9 R& o  }0 q# k    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
# g" T% z. L" ^    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 @3 |0 i! R- y. {- M& ^    mcasp->regs->RINTCTL    = 0x00000000; // Not used0 |% W- j! d5 K) M5 _2 h
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# u3 ~1 h' I0 E9 a2 f9 |. k, @9 v

, |+ N4 U2 Q& K8 U* F" Z% h7 _; k    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used0 q5 E& W) A* ^1 I! r( U' ~
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 E+ C2 A% x9 I% p& a) h0 w    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* }: I& g  @$ r! k5 n( g; v4 d    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16' M2 l1 P4 r1 e. O' _! j+ s1 b
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
9 ?  R9 z. i. j" o- N' [! ^& g+ q    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1. y0 u. z* }6 ?
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
* j# l5 @- R& _! s5 v( Q4 h  e2 Y0 x    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. b4 ^' M, |- Q) N+ f% Y% \+ e, q5 z* C! y, i8 v8 U  a! f; `
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
2 s/ K2 v, J  A, x0 u    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT' N/ ^0 `$ r% L
    mcasp->regs->PFUNC      = 0;          // All MCASPs* c; e7 w- N1 u2 {0 j
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ @& s" V( d; V5 l, l9 e7 s9 ~+ R, P$ S' e
    mcasp->regs->DITCTL     = 0x00000000; // Not used
/ F5 ?  s; z' ?! `  X5 t    mcasp->regs->DLBCTL     = 0x00000000; // Not used
7 E7 m& G* d7 R    mcasp->regs->AMUTE      = 0x00000000; // Not used* l1 i+ h$ u  k+ t! e
7 P0 a! x" h/ K( q" X8 W& i3 `
/* Starting sections of the McASP*/
! ?/ x$ L' A5 j+ E. g  n4 W& h5 A% I: p    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" A& Q1 i1 F2 \- [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  * Y2 `& H" @1 T2 a9 x; {# Q
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 ]2 i$ g% v* r( i* |7 e4 a
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );" S- i$ c6 g/ I: {) ~9 }' t$ L

$ d5 q# Y4 B! `  O: w* x& ^1 G% @) n    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) p# E/ m+ T! x# L/ ?8 X+ ^    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; B: v: d  `5 K/ q. n    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( e3 z8 {, h/ S4 c
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" V% c/ ?/ t) c4 ^+ \0 D* s# F" |
$ R$ I1 c. ^. u    mcasp->regs->XSTAT = 0x0000ffff; / u& i% I- N6 W, F  F9 }
    mcasp->regs->RSTAT = 0x0000ffff;
3 h( m* t; o8 |' a0 U! N2 u& q" ^+ {. T& ~. `1 {
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 W9 q, t3 X4 O% Y; @: Q+ b
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ }1 W+ K8 m. B7 o8 Z3 g/ ?. M
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 ^1 M8 F5 o, G9 L) g" w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 f% u) Y+ n9 V! n5 c2 r! ]! K6 U; B. A# p6 r* y
    /* Write a 0, so that no underrun occurs after releasing the state machine */2 `  G1 y2 w  D( W8 M
    mcasp->regs->XBUF5 = 0;1 }* g" @$ C* h2 s) p( G) q% Y0 C
    mcasp->regs->RBUF0 = 0;& V4 D; E1 ]1 P3 Q( u9 Y' }( ^
3 q1 e) Y( R  T1 [' ~3 y  O
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 v. W- K/ b& }$ O  a    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 x( s+ R9 Y1 b0 f3 D    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, ], ?+ `8 \2 t$ S. p7 |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 U0 ?; g8 {* X, N: P, H9 _! [

; v  f# A8 I. R  C  m0 T; v" K    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 0 A8 Z/ ]5 z6 E- }8 t: A
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 Q# ?0 d% A% _- b+ ~, `2 ^    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 a: C. H$ J$ t    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 ^2 N) ^; F7 Y# k5 t; i9 Q) |6 _9 A" o
    CSR = 0x0000;0 I* X/ E* F4 C$ J' M& f! O
    INTC_INTMUX1 = 0x3d;5 X' |$ W( g/ I, l& T. z5 R4 [2 r
    ISTP = (unsigned int)vectors;
- z8 P4 w3 ?; ~4 f3 q1 L    ICR = 0xFFF0;  
" C  c& ?% s' y. R$ ?4 O    IER |= 0x12;  
5 |# N9 l3 O! O    CSR |= 0x01;  6 h  T! O& F  K" l2 g
+ @. K$ |2 T/ f6 D& M, U

4 X3 o) h. _# ^6 p6 I. E0 ]) n+ b' G7 X$ U: z; r! r+ z& m
还有就是两个输入输出函数:* l1 @3 C9 Y7 U) A+ a; \6 S* [
void output_sample(Int32 out_data): V2 k4 O5 `( U! u$ s" c5 z
{8 t9 |, ^, X7 Z: O/ R: X3 N
  AIC31_data.uint = out_data;  
& J6 E0 D7 `( F  MCASP1_XBUF5_32BIT = AIC31_data.uint;) S" K: Q& |( R0 h1 j
}8 O! D& S2 \9 E9 j/ G
5 h3 d1 _- d6 a7 ]
Int32 input_sample(void)$ j  g, X! v/ s' d9 P. `
{  0 h4 [0 ~$ T% Z% ^% l
  AIC31_data.uint = MCASP1_RBUF0_32BIT;9 c% M9 V; p3 K0 \7 ?4 d$ s
  return (AIC31_data.uint);* C( r) B( m4 E6 X9 r* K7 e
}4 |/ p5 |* t7 v
* _0 p$ A  V3 b6 U; \% N2 I

作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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