嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! m, i3 w4 z" E) [. \main文件:
+ d% |5 ^: ?: G* V' F3 ninterrupt void interrupt4(void)  # _* R* J# f, t
{
* P# j; Q2 {. G4 B1 N' N! T  Uint32 sample;
: L# c) k  [9 i
( z2 f& a/ W- q7 T  sample = input_sample(); // read L + R samples from ADC& \9 w. X$ y% B( q8 Q5 a5 S
  output_sample(sample);   // write L + R samples to DAC + @0 W! j0 B* r. d
  return;
4 B3 H- H3 V# b" k2 m7 N}/ e: k. W3 v: c) j5 N! Q
& N( z9 }' e4 J3 B  Z
int main( void ), u- _0 k" k* W4 V; J
{
+ b2 F% ^; n6 Y2 T; A! G# i; K
9 `& S1 k# d/ f8 Z+ L$ U% n    /* Initialize BSL */
3 c4 E  Q% |' {1 @& Z# I$ f    EVMC6747_init( );
  T& G" t7 c  ^        /* Call evmc6747_intr function */
$ v+ y5 z. V( ~* H    aic3106_init( );
! |5 [% o8 W  ]9 v; g7 Q/ w        while(1);
* P  @2 s2 P! p, l+ p" k) [( C, x4 s}; t: H" L( M7 g9 x  m0 V, F
( H+ u* v; d2 O% d' M6 A

7 c9 z6 H1 V/ _* j$ ]aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) @* D; o- T0 X. B: h# F/* Initialize MCASP1 */: H% a; B. G6 f  x0 D) i
    mcasp = &MCASP_MODULE_1;  J* ^6 L, |: @
    mcasp->regs->GBLCTL  = 0;       // Reset
) f6 g, q- n! H  v    mcasp->regs->RGBLCTL = 0;       // Reset RX+ T. [4 x: \' Z" V% ~
    mcasp->regs->XGBLCTL = 0;       // Reset TX
4 W( k: q; \$ r1 C" {6 s    mcasp->regs->PWRDEMU = 1;       // Free-running# L; U' k, h# p, Y) [% F8 E- N
   // configure McASP0 receive registers) I4 k. k8 i* O% ^6 f! V' r# t0 T
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used/ f7 f& A* A7 ~: O
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% c/ E2 [% v. d- V: q* K5 ^2 S1 E8 p    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 e! S$ W7 w: O' h% D
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, K5 I3 V+ K1 ^! }7 W: p; i; S7 g4 Y    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
/ h/ n1 Q3 @/ l$ o* N2 m' D, }    mcasp->regs->RTDM       = 0x00000003; // Slots 0,10 M8 p. j4 q) L# x$ t; J. s
    mcasp->regs->RINTCTL    = 0x00000000; // Not used- J$ e- F, P% l6 i; l. k- V+ Z  k
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, t# {# F; P! K0 a% ~' ^- N

. ^8 u' [, t: z0 U/ P( t! i    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
6 }- E9 h- a. x: V0 U    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. y7 \+ h2 E; Z: o    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 {1 h: L" w  r3 I8 n$ j& R( @    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) |9 f5 f( T6 U6 y9 j    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
9 A1 z1 P3 `3 p/ T    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
. C5 D% k6 R+ G( \. X1 P8 N8 g7 f* |6 k    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit% \+ k; Q& b3 B2 }" Q+ C0 `
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- p: t, o' k* n* ?0 [, U' x" i) B) a" F* k' s" l
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN9 v2 \2 @! ]* y' W
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT( a) e3 `/ J0 g6 O5 A$ A0 n
    mcasp->regs->PFUNC      = 0;          // All MCASPs; N8 G% e0 k, s+ Q0 t
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1- M, ^: o, U* K3 ?

4 J7 m- {9 n1 d% {+ f- ^% p    mcasp->regs->DITCTL     = 0x00000000; // Not used0 n# J3 t( R  j4 N
    mcasp->regs->DLBCTL     = 0x00000000; // Not used2 O& Z, G& q+ c. m% q: L4 q
    mcasp->regs->AMUTE      = 0x00000000; // Not used
$ v% }, ^: F+ X4 A( s- u& q/ K
; d9 b+ q1 z& j, M7 n+ L/* Starting sections of the McASP*/
" H6 |* {) u% |- r) G    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" i0 T. R' }: [$ B- {6 l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  8 z5 f; _' S8 u
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 n3 B  @* A, {. N- q2 V
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );' V2 |5 D8 M4 f7 R* G' F, `) o

+ p2 B; R! P, [& @9 u    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 B* d: B# N6 @) I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );) D/ w2 j( G9 v& W% x
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 k; h* J0 A- B0 _: ]5 B+ Q- `; u5 a7 s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );* A1 \: C( R- l7 I
7 H! C$ O6 [0 z- l3 H
    mcasp->regs->XSTAT = 0x0000ffff; 4 Y! Z+ E4 F5 j* n0 R
    mcasp->regs->RSTAT = 0x0000ffff; $ \8 b% D# F! p

7 C8 D6 ~" n( ~2 f% m! p5 [    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;3 o, L2 R  q% S. e# _% P& @
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );' D/ ~+ S, ^# r
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 H. z5 V4 d/ q2 D    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 W  v* w, ]& H( A1 T, s2 c
: }5 ?$ m/ _) ^. T. G7 W# g    /* Write a 0, so that no underrun occurs after releasing the state machine */) {; f5 b" A1 [; P. V, w) b
    mcasp->regs->XBUF5 = 0;  X: y2 [. y9 a% J, S
    mcasp->regs->RBUF0 = 0;1 x. T) }+ `- b
. u# U* E" B% H
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) F2 B. m1 t; ?: ^& C
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );0 \; E+ ]: {7 C9 `: Q
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 H9 a. F. ?8 F( z. G% z: C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% _3 E2 I% B7 \  d* l: y- [8 h) F0 `- {+ L' x! |
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& Z4 D9 u8 N3 q" J) i$ z' G- F. J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );) k0 k- d% M2 l8 v$ j
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; / p4 o: y2 S5 n1 @
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. |- S' r+ Z9 K' E' A. ~, A
8 B' q5 I7 `8 f    CSR = 0x0000;/ t* _. Z4 N& a8 g( n( \5 H
    INTC_INTMUX1 = 0x3d;) c, t, e, R% ^
    ISTP = (unsigned int)vectors;
% Q+ q7 n: \7 z1 X: w' y    ICR = 0xFFF0;  * W$ E6 V) f+ ?" g
    IER |= 0x12;  
: ~) G9 k7 W+ {, L. @    CSR |= 0x01;  " v" a! h6 c3 c# @! P$ p0 u
- P$ b, T1 ^# W, D9 [

, F& a$ G3 m/ m( o: E' s* L/ q) y" o! \& O: T+ N/ ~
还有就是两个输入输出函数:
1 ^" V  C& J: U( q+ J# i' zvoid output_sample(Int32 out_data)
% B6 V& F* Q$ R$ a8 V/ x{6 t! d. p: N& f9 O2 W- q
  AIC31_data.uint = out_data;  
" B# |! f! m9 O0 P0 k4 S  K% A* k  MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 b7 `' d5 h1 d* f! n# {9 w% A}
; E+ _9 Q5 w# X& c8 W4 N
% i# ?3 o$ a: g, IInt32 input_sample(void)5 a1 [, s* e& O! q6 [" u7 o7 l
{  9 _! @3 c' b. F/ \
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 ]  O. U8 l3 _  m  return (AIC31_data.uint);* Y1 \3 D. |" J6 N+ t5 }; p
}+ u. P. @3 n: @

" v; p' o9 M( N+ f; Y$ l1 ]- e
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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