嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
  E5 b7 Z* H" x  {  r7 z3 Pmain文件:
  U! J1 E: m( ]) S, yinterrupt void interrupt4(void)  * D; F" f+ D! w
{
( @( {; y5 w, ?+ \  Uint32 sample;# G5 M7 X( D2 J- G. b" A

+ X: r. F3 v  E- ?1 g% u  sample = input_sample(); // read L + R samples from ADC' X( g; }0 m' H- }( V5 J  f- m! w/ N
  output_sample(sample);   // write L + R samples to DAC 8 n% \% l# R8 d% k
  return;, {4 E* r' O* P7 |/ k( D0 M
}
! o3 y6 F# A4 e1 I! M* U/ Z$ {( n0 }& J5 \
int main( void )
1 ?+ I$ K) s4 a{+ p' ?0 n* v0 B0 s

! G) E0 ^3 t. F0 B2 G    /* Initialize BSL */
+ {9 T! j8 ]7 A! y2 Y' u    EVMC6747_init( );
% v2 e1 {/ h& f) }        /* Call evmc6747_intr function */
2 t9 F" q8 D5 Q' b! M5 \    aic3106_init( );
; C' e- H+ Y; b9 [( \        while(1);3 R/ B0 q( S3 y) ?6 j& K
}$ d0 `* X& U- e: o

( e+ P" A8 y; d6 _+ p  z* O- y$ {* X( H7 a8 g
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题; \. H: o. B6 z+ f
/* Initialize MCASP1 */
3 T- p& S5 I/ s    mcasp = &MCASP_MODULE_1;
$ r, v9 S# G; |; ^    mcasp->regs->GBLCTL  = 0;       // Reset
+ ?) Q# m$ y/ _    mcasp->regs->RGBLCTL = 0;       // Reset RX
7 I$ b3 z2 v8 Z& b9 L    mcasp->regs->XGBLCTL = 0;       // Reset TX
* B! K. d" a; q! w9 v4 W    mcasp->regs->PWRDEMU = 1;       // Free-running
3 b# C% J6 F8 A. R   // configure McASP0 receive registers
. J6 U4 a% W1 }+ D* |    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
1 q' I0 G: R5 i2 F8 x- U    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& c, G, o# e  c* `7 x0 e
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word. X3 W- m8 O. C( m! n; Z% p( n3 g
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side). e( C7 v+ }' U. e, u! @
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)4 `; z4 c/ l( N4 w) L
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,10 B) B/ D( ]9 E
    mcasp->regs->RINTCTL    = 0x00000000; // Not used3 X! ]4 u3 h/ T% c8 M, f' g! s3 u8 c8 m
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 k% u: c) S0 u& L4 ]6 C4 X
3 w# B6 x: J3 Z% |5 B( q
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
4 R/ T; @3 g! g' P& U- p" D    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; S& u$ t( @) d8 b
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* H' s9 W7 v& c9 K    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, Z, \2 Z/ D" Y9 j) B- n$ }) v  q* j
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
! J' T1 B4 a' D" a7 E( B    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
4 W% U5 `- F5 b9 F1 ~9 T! Z    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit: H) e$ N0 M! ]8 J# \9 V8 k5 Q* L& k6 Q
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 ]4 `3 A+ g6 H+ N+ I
1 Q. Q# h8 U" F6 t% m# U, b" B9 P2 f    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN  F1 }- m7 T7 I  _
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
- j1 x) Z& g/ W" b5 t0 L! x$ p    mcasp->regs->PFUNC      = 0;          // All MCASPs
* H. x/ ~+ a/ c+ M' g0 l1 d# Q    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. a5 D  s. J/ k- `) R
/ g0 n9 w5 }0 t% u
    mcasp->regs->DITCTL     = 0x00000000; // Not used" G& A" W* K; S7 Y' @# Q- W
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
* }8 X% H1 @$ W* p6 I    mcasp->regs->AMUTE      = 0x00000000; // Not used% E- G0 d. |1 v% m% n

: O" i9 b% o) _2 A& i; E; d' X/* Starting sections of the McASP*/
, @* h( x) }- h+ D    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 t( g& {2 {" ^. I% y: {- g( c. ~    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  * H! [8 f9 ^! a% x9 T
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; - N6 n8 k) U% ~  z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 y" e" b5 u) `7 s2 r; G
, V3 e4 L. k* G  L; T
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. n% N  ^- V. {* ?+ C+ t    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 x. b" b& u4 ~# F* Z
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# ^! Y, ?, s/ v2 ?4 A7 e) D2 Q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
9 |' k2 X; C0 Q5 t; c! H! S. j
" w( c: x* f8 A: Y8 Q4 \; e) \    mcasp->regs->XSTAT = 0x0000ffff;
. j% {. \# t* j; n    mcasp->regs->RSTAT = 0x0000ffff;
2 C9 r( [9 Y3 W8 c. x) J* p. Y$ o6 b5 j/ A
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
) n$ `0 ]* {% w1 P! G    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 s: z' W$ @' g# x    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) Y! I( m  O3 l$ j( @3 K( K5 m5 M    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 [  R3 Q/ a7 L( ]# y5 l

3 ~1 T& n" }2 S7 {5 @, y$ J& w* H    /* Write a 0, so that no underrun occurs after releasing the state machine */
/ ~! U1 M. d/ I+ u    mcasp->regs->XBUF5 = 0;5 e# |" Q8 T& d5 d; q& U
    mcasp->regs->RBUF0 = 0;
) Z- u4 V& \  a* Z" Z+ f2 T6 c( c3 E
4 K: q& P! s6 r  \" h0 B    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % T# B1 f+ ?9 ^9 R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. P& c& Y" M8 y/ u6 ~$ o+ m    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, T! n* X# q. C) E. W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );. M" ?7 o% B  a. a: v
* S- U$ q! f4 b9 ^& T3 i( n
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' v% G: g( ?5 v( e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# N/ p) V9 M( {# d$ X$ f    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; @- i6 g+ l8 u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
8 \# s5 N4 g- |
' V. ^6 ]7 |# I" G- M; F    CSR = 0x0000;. Y5 A9 L2 }! I+ O& h4 a
    INTC_INTMUX1 = 0x3d;5 t) {# }9 J3 x2 R
    ISTP = (unsigned int)vectors;
& T* ?# h7 Q, Q- S( j8 Q5 a    ICR = 0xFFF0;  ! |9 F% F- d7 h1 g6 R. {; o
    IER |= 0x12;  ! A4 h! L' T6 G2 K( h
    CSR |= 0x01;  
; k+ P9 o$ b: i* ]* w% u
( Q& @9 e& n6 O: G  H9 U# q6 }, K5 B8 I$ ^% k  q( D

" J& ~  L5 Y" i5 d9 ~( H还有就是两个输入输出函数:
8 D2 o1 O. s. r  y$ L9 }! Kvoid output_sample(Int32 out_data); t, S9 ^' q4 ^& X& n7 j
{
8 r$ L8 l. M1 h9 g2 L: X4 B  d  d( g  AIC31_data.uint = out_data;  
; V0 @& ]' t5 w" X2 D9 x" e  MCASP1_XBUF5_32BIT = AIC31_data.uint;4 W' _7 m% [8 |$ B# X
}
, k! N9 a$ T$ Z1 x% A1 F1 Q3 u4 _+ c3 p; z
Int32 input_sample(void)
. B/ [* ?% ^8 s- P{  
" Y5 b5 U2 z& o  AIC31_data.uint = MCASP1_RBUF0_32BIT;( ?' H; G, Y9 V! ~8 T, p3 I5 s
  return (AIC31_data.uint);
7 s+ A6 q' |. B! o2 ^: B}; U  r0 E' o8 B, ^8 [; c
* F; B/ {0 `9 }1 I! _

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




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