嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" ~% E/ Q. T5 d1 C2 _4 Ymain文件:3 T! [3 T: d' M' {. _; h. J, c
interrupt void interrupt4(void)  4 k0 J% f3 u0 K" o: I. E8 Y
{) q5 h2 N+ S% ]2 B. V
  Uint32 sample;/ u0 d+ m7 V3 ]5 {5 @; K6 o
3 K( r1 J0 Q  l- n9 C
  sample = input_sample(); // read L + R samples from ADC1 l% \$ y; Y4 k- R8 T* q: i
  output_sample(sample);   // write L + R samples to DAC ; t# J* K3 ~. k( V& u; F
  return;# r8 H  `& e+ x& N9 U
}: ]3 ^! R# c4 p; }) A& _1 P- h
& u+ ?4 n5 T$ t% d9 f: v# R# }/ u
int main( void )
3 v! ?; |" I0 D0 @. [{* b2 g3 C3 E$ e- n

5 R( B' Y5 S# u; }) u/ |    /* Initialize BSL */
1 m+ V: O; X* e8 J- u  P# X    EVMC6747_init( );
7 q( ~1 q' n7 c4 V3 W5 X        /* Call evmc6747_intr function */% p6 Y* ~  Y- v
    aic3106_init( );# T9 d, Z% Q" B
        while(1);
+ V  F0 r+ P" l; D1 o}1 w  j, E9 o$ X2 c$ t3 j' x

: F  b  E4 D& |
: W# {3 y' |3 T8 n1 e( h: R) ]5 {' K( yaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* U) A' r+ G/ `/ y! A! ^/* Initialize MCASP1 *// I8 F3 Y+ I% w7 w4 k3 z
    mcasp = &MCASP_MODULE_1;
. u: e( \3 ?% U  b& q    mcasp->regs->GBLCTL  = 0;       // Reset
5 H+ [: a4 o* v- |    mcasp->regs->RGBLCTL = 0;       // Reset RX. d% r3 w+ G+ d1 e8 R5 p
    mcasp->regs->XGBLCTL = 0;       // Reset TX  K0 r- `- X# `* z+ m0 y5 D
    mcasp->regs->PWRDEMU = 1;       // Free-running! `) y9 w2 p9 `9 u
   // configure McASP0 receive registers* Z, a* R# B  H+ |
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used6 q& [) w, @" a) ?' k2 N' {# g
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" G1 p8 W! f8 b  |1 m7 ]  K    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word  M7 R- }+ w1 p( D$ [, ^
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)- S5 `* D% m7 l3 r! [: _7 v; S4 B3 A- Z
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)5 n/ O: a& u+ y
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1# o1 c. N6 C) H& ]7 [" F
    mcasp->regs->RINTCTL    = 0x00000000; // Not used9 j2 G/ I6 F4 T( E( g% x, L
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ h2 B' r; y8 j# ]( D2 G
4 }; ~) l$ _  f7 p
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used$ |2 x9 _' `( G; e$ s
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. K, l# |5 H, T1 `/ N2 {+ q
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 x+ U- |  W/ k- N4 m3 x+ ]    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16% i9 R8 R  |* t
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK' Y8 r; H7 ~' }& D  P& Y: ^
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
& o8 r1 r3 y; z& H& i; I    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit9 }( c) l6 E. e( j; H0 Q+ `% y9 Z
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* `+ Q; A+ s$ N5 L4 ^, r$ m. m6 y/ {2 H2 L; z. D+ L( Q: E% Q
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN4 j# @2 b& U) F* @' u. ?  b
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
  b' _' w& h0 H6 M! ~    mcasp->regs->PFUNC      = 0;          // All MCASPs# {6 L  m/ R0 k, A  Y3 \7 X3 l6 p
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1( ~; N9 f! P5 a, P3 U; s! N

$ z  A/ O5 v5 z! U" F    mcasp->regs->DITCTL     = 0x00000000; // Not used
' @$ s3 ]3 K2 z/ d' w$ @  K    mcasp->regs->DLBCTL     = 0x00000000; // Not used  S( [7 W' E, X; Y8 A
    mcasp->regs->AMUTE      = 0x00000000; // Not used
' M, F: k* F7 B- Q  V, b6 C* Y) Y% ]9 Z4 ^& F: q  r
/* Starting sections of the McASP*/- k+ D/ c; ~% R9 {
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; " ]3 H- A* M% {/ C& B4 R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  # P. ?; N# B9 m7 G' L
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; + _, A3 U4 G8 H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 t( A+ I- ]( {* S/ c/ @9 j2 h
, `! \6 R9 J# }  ?* A    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' N1 d" b$ Q8 O% m- Z2 d1 Z    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 @+ Y3 n3 z' T9 r$ n    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 s2 n+ ^6 J0 q5 m9 k! R$ I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );1 p2 R: a. B- d7 Z

7 r; B1 j$ a, e8 A    mcasp->regs->XSTAT = 0x0000ffff;
) w1 R; O5 J6 _. A# O# b  O    mcasp->regs->RSTAT = 0x0000ffff;
* r6 Z# ]/ j$ Y9 P$ T
% H! d( V# n& Z. \3 s/ S& ?    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;6 R9 P3 g8 n+ E% N, {. \
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( ?* E( n; D! X: r; O: A/ D+ L    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 x" e7 n5 v6 Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );8 z( {( @+ G4 K* _) i
$ I2 u; }" ]8 j# O
    /* Write a 0, so that no underrun occurs after releasing the state machine */
5 J: B" l1 d+ N6 U( _$ Q! Z    mcasp->regs->XBUF5 = 0;
% e& c7 X5 P" L2 q7 I) ?" g    mcasp->regs->RBUF0 = 0;/ h; @0 j) M  r( W" L
; n$ O: k' b9 o5 C  c; N8 k
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 y$ y6 l: K2 h% j& N: |( j; z' A5 e    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! Y) j7 I8 E. u
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# j- a9 Q) S) h# \$ L  R    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );) Y$ h) G1 e* v9 b

+ L- |* c$ ?% ?. _! T% w$ J    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; n  Y- ]% |; z0 M# ^& R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- N& z4 h- P0 c9 r. g3 e    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* k6 d3 L# [) M5 a$ ?    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );: w& ]5 f0 v7 C( q0 a( Z$ C; r9 N5 _

" f1 g" E% w% B% b6 h    CSR = 0x0000;& [! b% o8 z/ _( W2 o% o
    INTC_INTMUX1 = 0x3d;
1 X' n4 }- m) c+ C# r    ISTP = (unsigned int)vectors;
3 t! H  ~6 }. m: k! Q# c: \    ICR = 0xFFF0;  % o. _, s8 b& l7 k3 w# p
    IER |= 0x12;  
' {. o9 S0 U3 L- u    CSR |= 0x01;  3 \/ m  e. N) K7 E8 u
+ ~5 p4 b5 U* O" D) M% C( A  X

% f2 u+ `+ D. x. S2 v" Z2 E5 J+ A) o
还有就是两个输入输出函数:! H' X2 F: I* o4 `; n& [! a' b
void output_sample(Int32 out_data)
# ~9 N% d  E3 a4 Y# W+ s/ a# y/ c+ d! t{4 ]: \( R$ N* E- B, U2 W& d! f
  AIC31_data.uint = out_data;  6 [' }0 A* Q' T) q: i3 e
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
% S0 [6 I9 s0 s8 u3 ^}
% m' V/ h2 K1 e" W. o7 u
2 P- l# E  C  OInt32 input_sample(void)
0 a+ m: q. e9 Z{  
4 f! r, m$ Y% b* y- l! N  AIC31_data.uint = MCASP1_RBUF0_32BIT;% }' r6 Z, R- `& G$ k9 G9 s/ J
  return (AIC31_data.uint);" a& l) D3 N  f6 e9 q. V
}7 a- `7 N% j. O  a6 n) }; {, Y  i

/ u& q! K7 B2 _) G+ Q( o& y6 f
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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