嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% l7 G% E: Y% L: d8 {main文件:
9 }: ^1 b7 I1 ~0 ^( T- |/ Yinterrupt void interrupt4(void)  
  o% y: u5 m: H, b{- f: M' E: C+ c) P1 w
  Uint32 sample;
8 S: B( l" y; d9 q" t5 Q$ Q3 X$ r# [; q4 ^9 W7 U
  sample = input_sample(); // read L + R samples from ADC
- i# f+ l0 ~' I* D  output_sample(sample);   // write L + R samples to DAC / y. T0 U. E" g+ i
  return;, z- `$ C- \! W' l! d* A
}& K0 j/ r# N/ x1 {: j4 S

) [+ d( |2 I$ c, T7 X5 c, hint main( void )
0 O: \, j# \7 [  g{
  c7 w' F( z: q' L/ K+ Z" N/ \+ f" g$ ?) T; I
    /* Initialize BSL */8 k. Z+ G# s4 A/ |
    EVMC6747_init( );2 f+ w/ f  n1 X% d
        /* Call evmc6747_intr function */
# t) ]& R2 Z( `! e: A    aic3106_init( );
( o) p# H  }3 N$ m' a, W        while(1);
% }( J, I& s0 \3 Q}
/ @+ K* R2 h$ S" o7 p
4 _7 ?9 G/ H  N; B( l3 Y* F# ~  [# `& O. S6 r
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题# e% ^% ?& E/ n. j9 \2 [+ I! r
/* Initialize MCASP1 */% |" S) Q! z% e1 c& l
    mcasp = &MCASP_MODULE_1;
& k! _: s$ C- \3 i( r    mcasp->regs->GBLCTL  = 0;       // Reset
: f) H+ @- t9 S  E    mcasp->regs->RGBLCTL = 0;       // Reset RX$ ]+ d! y* b8 I8 W3 b
    mcasp->regs->XGBLCTL = 0;       // Reset TX
  s* Z3 x) _; z8 n$ J    mcasp->regs->PWRDEMU = 1;       // Free-running$ n8 c* l3 F, I
   // configure McASP0 receive registers% x- p6 w/ K7 E1 i
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used# X3 ~0 ]+ r* C8 D9 j
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 y+ {" I: q- g
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" T# r& }0 j# \7 i7 F' w    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)  Y. A7 X% [+ Z) r& u! w
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
+ D9 z, e( p5 O( |0 t4 e    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1) r% e+ z7 d, V9 n" W0 ^' e
    mcasp->regs->RINTCTL    = 0x00000000; // Not used5 N6 W: e5 W0 a+ }
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! j# ?9 \1 D, y6 e
% H/ @& x0 R& Z    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used4 p4 l& V: Q. @2 B" v
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- j  C7 i, Y; g
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word. f& J) ?& l# B/ l9 |0 l  h% D
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ u! M$ ~, _* {6 R0 `3 r& l3 {5 Z    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK+ n# S6 M' T- G8 {# L4 m
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
- [/ L+ j, g# T1 ~    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit8 ^0 F4 y; s, L) }
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 c" b, [+ V2 i" R9 S# R+ k$ Y! g+ h! h" \+ @1 \+ t" t, [1 }  l
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
& W) S  h& x& s, w    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT. E2 v( R1 z) n! S
    mcasp->regs->PFUNC      = 0;          // All MCASPs% Y2 A0 y/ j3 Z
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 y8 n4 ~9 Z, S$ t% ?9 W! u3 d! t
    mcasp->regs->DITCTL     = 0x00000000; // Not used
; h+ ^5 r; n* y5 i4 i# Q$ c  ~/ ^: j0 n    mcasp->regs->DLBCTL     = 0x00000000; // Not used
! P/ a: Y, n: ?    mcasp->regs->AMUTE      = 0x00000000; // Not used
& ]; t! C1 m3 H2 g# o  _2 h) Z2 h/ y1 F0 g  a% a5 z& @4 Y% x
/* Starting sections of the McASP*/( e0 z1 }! R3 X7 y7 J$ h
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 [# G- n0 g% t, Q& \    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
' c4 o9 [, D% l, g  X" t0 f8 C4 K$ i    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;   \: w6 x; w2 n; r8 z* _& h, |6 G
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 y: X5 ?9 q# z$ j
' Y% I% f. G0 m% a) b    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 e; @4 U2 S0 ~1 X    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );: m2 L) P# b8 }. V2 Q1 P' \
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; & n' n1 V: I2 g* }* I3 y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 s; S' P- ^$ `& R: O; D8 p, d8 ]+ w* z
    mcasp->regs->XSTAT = 0x0000ffff; . l5 a# g8 W0 W: f7 w
    mcasp->regs->RSTAT = 0x0000ffff;
+ N/ g7 x0 F* s. ?1 b% j! W% p( ^/ L* P) [1 S5 X( V. H6 A& X1 s6 B
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 [8 a8 [) g8 a0 m8 c) ?; i% x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 u) e& b  H: U8 t
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; + p* z6 m" z6 v7 f: q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 A) p+ M$ P* H# J6 ^$ f
+ H9 c4 x$ k; u7 ~; L. C9 a    /* Write a 0, so that no underrun occurs after releasing the state machine */3 E+ s* z: F6 Y, U) T- \' |. ~( z
    mcasp->regs->XBUF5 = 0;  d1 {4 i- S+ N) N1 o
    mcasp->regs->RBUF0 = 0;
/ b/ ]9 W" _; b# j4 p2 W& e1 z# H& ~. m' m3 D$ N! B7 N& A
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 X% O# F- C3 C# u0 k4 x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );  L- O: ]. O/ @: U
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 Z0 f7 t9 g$ \; ~$ \    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );& v. s/ H8 R( r' V
* g6 l# Z" I- R9 o$ ]. B* I, ~
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
9 Z# N7 E4 L9 x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 \1 k# e' z9 O4 d6 B7 Z4 F; I  s    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
  o. D0 u. u  @$ ?( w) ^( m    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. B* K% v4 D* }# B# j: L0 V, ?* U/ M
    CSR = 0x0000;3 m3 |# L: k. G1 W" R
    INTC_INTMUX1 = 0x3d;
) O" c: T/ f+ @7 o7 i    ISTP = (unsigned int)vectors;5 g) I6 F# V/ E+ A; \# V% m
    ICR = 0xFFF0;  8 Q" J) Y5 N3 M* Z% H
    IER |= 0x12;  1 P' y% l, @5 w' |# z
    CSR |= 0x01;  & h# M2 h: k: X+ e+ G5 @0 X8 u
3 h! V: W9 q6 j+ W0 A+ r2 U# T
( O+ J7 ?4 s6 r9 Z! j, {

$ P" B: M; ]! g* ^5 k1 L, Z还有就是两个输入输出函数:3 L' C/ K: A: U. F3 E4 p
void output_sample(Int32 out_data)! h) j* {0 A) |7 x1 n" |$ }7 ~( O
{
$ X, p/ A5 m1 z( c. z, k' `0 E  AIC31_data.uint = out_data;    H* `$ A1 G% M% F0 l6 V: K
  MCASP1_XBUF5_32BIT = AIC31_data.uint;; p# F+ K5 M! m5 |
}" e+ H# f1 A2 q2 b* ^3 d. `
% M' T; \7 Z. @0 I" N
Int32 input_sample(void)
: s4 {7 F3 S* a{  
! F( i( w9 t! m+ M) `7 |  AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ J  {& P. r7 A' F  return (AIC31_data.uint);
: F0 S% [; T, i3 f- P% ?' U}
1 G; j- ^# U9 [4 G5 P8 R
* y1 N6 ~+ u8 y- V% g
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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