嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:9 P, I2 H! J: a3 L9 ~: }
main文件:
/ z- ^) g# Q0 }# w5 O: h3 iinterrupt void interrupt4(void)  
+ n9 ~! w' _" x' Z7 x{
& C; J8 F$ N/ ^( c4 u  Uint32 sample;4 W& c0 K! n' _3 b
7 G# ^2 j! t# b
  sample = input_sample(); // read L + R samples from ADC& ~0 M4 N1 a8 \! Y
  output_sample(sample);   // write L + R samples to DAC
' z5 |( t! J4 l3 N1 z  return;
; z" q3 ]9 ^/ ^: L  }+ ^: x& C  N  X}. U. Z" s! n5 A, N( Z

* H' _; S) x) vint main( void )
5 p$ e+ w! V/ H{# c$ `$ s0 e. e/ M8 ~) Y% |

% A! `: G8 E9 h( q( P' n    /* Initialize BSL */
) [% z; z  m& f0 A/ q% i/ ]    EVMC6747_init( );% }! i8 H" U4 b/ J/ l* b) C
        /* Call evmc6747_intr function */# m0 l2 e( T6 [
    aic3106_init( );, T# _5 B( z9 h
        while(1);
4 T8 b8 q# {  L1 z* l( U+ j4 a, T}5 \* w: I8 n# b$ ]+ a4 D- Z0 ^

: J7 |0 `; ~2 ?# a! I8 W6 m2 l! d8 M% i& V% f9 x; B
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题4 X, c  }( ~" A
/* Initialize MCASP1 */
, s# t4 |: ^0 ]5 {+ Q    mcasp = &MCASP_MODULE_1;
5 e; g/ m. {/ Z' x: v    mcasp->regs->GBLCTL  = 0;       // Reset
( U# G8 P3 g2 J- n- g/ R2 P5 S    mcasp->regs->RGBLCTL = 0;       // Reset RX8 o2 m5 l0 R$ P" G
    mcasp->regs->XGBLCTL = 0;       // Reset TX
% D/ C+ |# v- _    mcasp->regs->PWRDEMU = 1;       // Free-running
1 d3 X) l- n% \0 G. E* b   // configure McASP0 receive registers
+ L. j! B( d; U2 }- t  E& G    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
! f8 f1 b  q( E& o    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ i' w/ l4 C. A+ k" _& V* f+ N    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
  p& v+ T- J- C% O    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)4 r& E6 g, v9 _
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)/ {. M8 J- _- t! A
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1; J1 L. r( @4 o; O" F
    mcasp->regs->RINTCTL    = 0x00000000; // Not used! e- \$ _, {6 ?# P. W
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
  N: |8 p( C+ F) K0 h4 c
! p& J2 i; {6 W' T  D& j    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
. I3 |* d# T  c8 a    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 r0 e# o7 B$ \( v9 q- R    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& I7 `* D7 l! Z) k  w    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' M! E2 c& h& X  S2 M$ |9 M2 x    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
; g: H( U; C; u    mcasp->regs->XTDM       = 0x00000003; // Slots 0,13 A' W  p3 M5 A2 t1 b
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit0 r) S5 C# R; p1 H  K- s
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 z' j6 f0 ^" C" ?
) c) A7 O4 T3 R- O# }, V8 l: ?  m
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
7 v7 A. L+ X2 v5 V, v    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT4 b0 O; |& R) b1 Q0 O1 M5 \
    mcasp->regs->PFUNC      = 0;          // All MCASPs
$ X. |, G  }8 }- [9 H0 w5 {* y    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 j8 `/ k' k0 L- B( ]
7 a/ C3 D1 N" F5 P1 p4 Z5 E    mcasp->regs->DITCTL     = 0x00000000; // Not used
8 z& K9 B' ~# O6 J- ]# t2 Q3 U    mcasp->regs->DLBCTL     = 0x00000000; // Not used& x! W5 B- {0 ?$ `, M+ c0 h* ]# Q
    mcasp->regs->AMUTE      = 0x00000000; // Not used: _: X; J  O7 O6 J+ C& I
2 t7 ^8 ~+ J& E
/* Starting sections of the McASP*/
% E& R  P2 W, v    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( Q( i0 u# f4 o% d. _' b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  " D; n9 c* ^& X
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
; D% m  Y1 v1 f1 a5 U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 [3 y- R& P3 P$ u1 u+ D& }& v: `* b2 p3 K
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 q. t, C# w" x8 h7 F. I* D2 s% l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );) L2 K3 l  P" i" a5 H% k( f
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
! r2 H# c" X0 H6 w5 J: ?. K3 a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );4 B! P9 h- c( w9 \
3 o/ y: O9 p: _: h2 o
    mcasp->regs->XSTAT = 0x0000ffff;
( O& T! `2 T+ t" Y- `/ m    mcasp->regs->RSTAT = 0x0000ffff;
# {. X+ N) \4 H( D
8 _; V, n' t  q0 H; Z    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 u2 i: y: i4 }( U6 }: X
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );3 _2 D0 X% ^* J
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ f8 h/ |+ ?1 m, T% }- X+ ]- f% `( B+ M2 {    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 ^0 F3 F) t) ]) q) b" Q% K* a
$ i8 `/ }# c7 a6 C    /* Write a 0, so that no underrun occurs after releasing the state machine */
8 v0 v( L1 r3 _% b  q) [, \    mcasp->regs->XBUF5 = 0;
' A* T/ M, A& u7 P) ~5 b    mcasp->regs->RBUF0 = 0;
1 r$ z9 p, i; Y( z. I! v2 ]' j5 p( q$ z# _* L& D
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" J$ ?( b' |3 M; c! y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% ?% N; n' \7 e. f* ]    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; % R9 {8 s* B. B. b4 C' a) A
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
) m  e* J7 e- B/ i0 d; p" W1 f. Y5 d9 h
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; * T. T6 H6 t2 h; w  I! K
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 w; N: ^% Y0 q2 d    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 q7 N5 C* o+ K. x) o- l    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );/ _" Z2 l& O9 n0 J

1 ^" r1 i; }4 e4 g5 k5 d1 I4 r    CSR = 0x0000;  ~# O; W! q- w/ U
    INTC_INTMUX1 = 0x3d;$ h& C& A# y6 g. _5 h
    ISTP = (unsigned int)vectors;
3 w9 [! l1 }8 b* l* ]" Q    ICR = 0xFFF0;  
: I' h& [. z( S6 u    IER |= 0x12;  
2 [/ t- B0 s4 I    CSR |= 0x01;  
: F# W1 L7 o; h- a9 y+ R6 d' z' U  F

$ R! |; C5 S- F" d  G) {: a1 b, n5 b7 A8 k+ Y, t5 o1 F
还有就是两个输入输出函数:. I! J$ A# k8 p! e2 r# [
void output_sample(Int32 out_data)
. ]* W: ^" I& g$ T$ G$ t{3 A8 w, @( ]! c. v# |7 @0 [: y
  AIC31_data.uint = out_data;  
) A1 t0 A  X; T& _3 \! Z6 y  MCASP1_XBUF5_32BIT = AIC31_data.uint;/ E2 Q+ b5 h/ ?
}9 }- c4 x& h4 s  @; c" F- l

' @/ ?2 ?  I/ G  J$ D4 E4 oInt32 input_sample(void)
9 Y0 u3 u( W; p{  
. {9 D0 h' f, D3 ]  AIC31_data.uint = MCASP1_RBUF0_32BIT;
- S# y# H! |1 L+ G  return (AIC31_data.uint);
; h$ G- ?. M* X/ c% }7 ?4 [}- F7 n! Q0 i) A6 R: C2 \8 f0 h
1 ^$ a, _8 C3 l! O% h% m* f" H

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




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