嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 H6 r2 e" u6 b/ K3 wmain文件:
6 k8 p$ ?) q8 Cinterrupt void interrupt4(void)  . c- ]# R# S) M
{
' d# s4 d$ |5 o" P6 {  Uint32 sample;
' f4 [) B& K5 }3 Q& ~: t) Q& k) r9 D& V( X( E
  sample = input_sample(); // read L + R samples from ADC
- \8 [, N& g* Z( |, {  output_sample(sample);   // write L + R samples to DAC
  l  j  |1 w' x+ w$ v% R/ q  return;- q1 j) `/ p4 p, B
}
: K* O+ N! F9 M: H0 W  |; l5 e9 E, }" S4 g: a
int main( void )
! F1 z$ b1 ~- f' A{
9 I7 H, h7 r8 D. ]: ]2 f  F: H% F7 ]2 d% T  a9 D
    /* Initialize BSL */2 U" o( P' x& d) Z3 k% F. C
    EVMC6747_init( );' s  n2 c) \) W' ^' @
        /* Call evmc6747_intr function */
# p, P$ |8 V, I0 ^( m: P    aic3106_init( );5 u) @& J$ G1 H  ~) Y' w  [
        while(1);
7 E# B( d# d, v; m& O# K}1 [5 d  |9 {  Q5 H' W  Q; R6 p% s

0 C# p/ t) X0 t4 S) ^; n* k1 S9 [) a
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题% i/ Y% g3 A' A: |8 g  g! {
/* Initialize MCASP1 */7 a, v4 P* M: M) S% t) Y0 v
    mcasp = &MCASP_MODULE_1;* C& e1 t9 `2 h( b
    mcasp->regs->GBLCTL  = 0;       // Reset
+ Q& G* w2 r$ u; }- c0 `7 n    mcasp->regs->RGBLCTL = 0;       // Reset RX! a6 q  f2 l0 p! P
    mcasp->regs->XGBLCTL = 0;       // Reset TX5 f9 z! b2 m* i# }! G- s  M+ O
    mcasp->regs->PWRDEMU = 1;       // Free-running
# V3 S. y# Z1 _: N   // configure McASP0 receive registers% O$ a1 o: k" V4 m2 E0 d4 ~6 Y
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
9 ]! \5 Y( g. I0 P; s- k    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, w' U% Q. A9 i9 f, T
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word* L4 ]3 t. f4 L9 ?) }% z
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( V: u0 t( p+ e0 a% y4 Y1 Y    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side); k* _$ h/ d; w6 G: f; C2 N
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
2 a- |  v: ]# V5 J% W" h4 g8 O    mcasp->regs->RINTCTL    = 0x00000000; // Not used
- k( |9 ]4 m! w5 d/ u" X* {    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- k  L& [, E0 |- \

0 L6 B/ H- w- a. G" u4 w    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
" s7 d3 O3 q; j( \5 e, ?    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- M3 `, [4 |2 R) D    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word7 W" I6 O: o  W0 x
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16* D( t8 ?0 d4 N. ]% G# R
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK( f3 r$ H& J4 B! S. C7 \
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,17 x- U' X4 ?2 ?: e7 i+ c/ x+ x
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit7 s( z# W9 }0 ^6 v
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 a( w2 U  `% S9 G, m* O. ~* o' ]  Y6 Z# `4 G
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN; w- m: d* f6 A0 R( z
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT1 l# V5 W" C! M# }' T! `7 m
    mcasp->regs->PFUNC      = 0;          // All MCASPs
% y/ }) |% y! y    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1( q$ N/ G: j8 \, j
& h2 J. |' F( p' x+ S. E
    mcasp->regs->DITCTL     = 0x00000000; // Not used
4 e2 q" ^8 p6 s4 k# w8 h4 D3 s    mcasp->regs->DLBCTL     = 0x00000000; // Not used
2 q! ?4 C+ _; j' R/ \    mcasp->regs->AMUTE      = 0x00000000; // Not used: C+ l4 x7 ?- R5 Q. n7 E

6 {$ j' M/ `$ |0 [5 R/ i/* Starting sections of the McASP*/
( x$ h3 T4 g4 R9 f    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; # R6 s! Q9 ^) ^) |1 W* U- |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  & _; a  _" `. G7 _4 H
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ! M% _# |" P+ v6 ^  v1 I* ^+ w1 g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 y3 Z6 }! y, L8 \
6 G8 o. Y$ I3 }; ~    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
  k  b& m% f1 y& Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 k8 J+ v% ~( C0 R    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ) W# |% _8 [8 V6 U
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );1 m2 K% M; g' @
; z2 L% g7 b7 d) |4 k8 d9 D6 M' z: g5 ], R
    mcasp->regs->XSTAT = 0x0000ffff;
( K2 T: H- k5 N0 _5 x7 ~( R- |    mcasp->regs->RSTAT = 0x0000ffff; - B* a5 h" o! j( \: m& ]+ d% _2 t
& Q) M" a6 Q' I9 q  h* P
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 ]9 ~" F* @2 G8 K$ |! H  h    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 C" T8 v6 ~9 }( j& x    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& n5 T& F% W  E4 m8 x0 o2 {- ~    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );. C9 J' e) `$ i6 a' l
1 ~6 p) h1 j) h
    /* Write a 0, so that no underrun occurs after releasing the state machine */2 ~' h/ U- r; e- J% r, S
    mcasp->regs->XBUF5 = 0;
  o" e. ^! s4 o+ c6 \2 u+ @+ ~    mcasp->regs->RBUF0 = 0;
: L3 F9 S5 y+ B8 G: f
- ]5 W- j6 D" |: Z; |( y    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 6 M1 k! j: K+ b' q# @+ b
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( M0 E! y4 k9 U5 ]" @/ G, @' [
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 3 G4 O) e; h1 ?+ x! @/ S8 ^, D
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );& Q$ X& E' p1 z. j/ f" D

1 g! }5 ~& t! M8 I    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # A* V1 `5 n* k" q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 e8 A3 i8 T  c& k3 Q5 L: j  G    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" ~9 }2 f" n, m6 ^9 F3 \9 v; ?3 l    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );* }& e. H3 d5 b& H

2 @. n! ^- F# i7 p0 k    CSR = 0x0000;* G& w# S% C/ u( A
    INTC_INTMUX1 = 0x3d;
! j' m3 [' Q1 [7 s; ~/ {9 D% x- d    ISTP = (unsigned int)vectors;, M. d% o8 f5 m9 q. W
    ICR = 0xFFF0;  
( O5 M- k4 g: D    IER |= 0x12;  - ~' M$ b+ n/ x
    CSR |= 0x01;  3 J& N! s- I+ o' q3 G1 G* S* r
5 _9 n5 G9 j2 {  D3 \/ ]9 u: M

0 S5 N0 o2 S5 J7 p5 ?1 w
; C' E0 Y' x# H4 X" j$ P2 Q$ ?9 r( I还有就是两个输入输出函数:
* Q5 i) X0 V4 zvoid output_sample(Int32 out_data)8 V5 o; x' @, o: e7 \
{% X9 J. \$ Q5 C! L( V
  AIC31_data.uint = out_data;  3 [+ D6 ]% X! c/ D% I5 y
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
& x) A  i& ?/ E% ?. m1 k; m}: f4 B( t/ k* g- s# o1 I

% I; U& {% @9 U5 H  |1 q6 M' nInt32 input_sample(void)
# G+ a: {9 `: q" b% _) k{  
- q/ Z3 c1 b# `0 u/ e  AIC31_data.uint = MCASP1_RBUF0_32BIT;3 }& u" z/ U& b7 U  c( k
  return (AIC31_data.uint);
! A6 z9 \* t9 W% W# L% C}
3 h8 X. m9 Z4 j2 K: [. U. _  e7 }, ], ]5 v

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




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