嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& q( l/ N. g' ]' [4 Wmain文件:- L! i9 V( j. ?& e
interrupt void interrupt4(void)  ) R7 }0 R3 y: H, ]: I: b8 ]
{: w3 L$ e# z! s( }- g; a* h
  Uint32 sample;
  z7 T4 o5 V. l4 H1 [4 z/ e4 n
- r- n" O% U* a  sample = input_sample(); // read L + R samples from ADC/ h+ Q; @! m1 M  X% k" W
  output_sample(sample);   // write L + R samples to DAC
6 ]  W, W' K2 Q# F7 r  return;
! y& p0 v5 ^% {8 S( l7 `}# {5 q9 Y6 s+ r; q
' r0 \' T, ^7 C( F
int main( void )& L0 g; c$ G7 }' @$ P6 H
{
: D" e; c) ~: }5 `+ Q, X& V+ h0 Z0 y% o5 f2 F( q* G: V( X: D
    /* Initialize BSL */
9 S) {$ C, A1 m1 C* X2 ~" K    EVMC6747_init( );, {" m/ d; F3 q5 V0 K8 \! W' c& e. p
        /* Call evmc6747_intr function */
0 t9 i. c8 M9 K9 H! q/ j! Y2 \    aic3106_init( );5 ~# K- E5 w* q2 M" h
        while(1);. U' R# g. y: o( {
}8 q$ R: I3 k3 `' f2 J) L
; C7 x6 K7 v) e1 B9 i
- E$ i, W' [4 J6 V/ N. n$ F) r; a
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( D' ^& d0 ]' q( W# v" v
/* Initialize MCASP1 */& G& a8 D. Q( F- j! `  R
    mcasp = &MCASP_MODULE_1;
- d9 Q" ^: F" U2 t    mcasp->regs->GBLCTL  = 0;       // Reset2 B4 F  Y) L6 Y5 k; Z+ K/ {
    mcasp->regs->RGBLCTL = 0;       // Reset RX8 L( u) z0 X6 s. B, H
    mcasp->regs->XGBLCTL = 0;       // Reset TX& {. g3 j2 g- w/ z8 a
    mcasp->regs->PWRDEMU = 1;       // Free-running. `( _, d/ _5 l. @3 D
   // configure McASP0 receive registers
0 k0 d& ?$ F3 r+ m5 I    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
" [# ~' A% N4 X& s* C3 G8 q    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ l; K* F, O8 o( @7 s4 a. O    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word8 Y, z6 O: |0 W, [. I
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)1 H" v! ?5 R1 G. y( `4 g
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
1 b) ~. F5 Q' _/ X    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
/ U, Y  X4 E# c    mcasp->regs->RINTCTL    = 0x00000000; // Not used" V2 R& v" L+ H5 O: Z1 O* K; r5 }
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: v8 m8 L3 t( M' s. K
7 {3 N2 p4 ~- H# D# X$ d" y& j
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used! e) U- F; M' ^
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 g8 V( @) f+ n4 f- \
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word: J4 E. F, j; U; ~, q8 }9 V
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; _; A+ W9 F2 @+ k    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK" m/ z3 M, h7 o# G0 u
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,11 I1 F/ Q7 e: T, V  D$ A# r
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
$ W. j( H' `5 f3 r5 N    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ @* Y( V' }) u5 {5 d6 J2 i1 T4 h
% a# m) p9 x- _9 j1 N  w3 ?    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
, \; t% k$ h1 |% ?    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
9 S( `) Q; D$ |9 Z7 w    mcasp->regs->PFUNC      = 0;          // All MCASPs
7 Y: Y( T% W2 }- h8 L    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1' \) i9 Y% S( b" M

2 k9 X. v+ ^7 |1 `& z0 W8 D+ t    mcasp->regs->DITCTL     = 0x00000000; // Not used$ w" y/ l" R6 d" X9 M" i* U
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
) p# j2 y0 f" n$ I5 m" C0 x+ q3 O    mcasp->regs->AMUTE      = 0x00000000; // Not used: M0 |; ?% f. M0 m5 Y* `8 K: P

  j2 F2 ?6 n, }/* Starting sections of the McASP*/
7 m$ v$ O% T. m- f" y4 {3 ?2 P    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
  [+ c: d& m; H. ]2 b; _2 Y$ _* u4 H: K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  & P; Q% T' c1 c: h: ^( M2 G7 H
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / B. K$ \1 ~8 T( I+ E) ?" ~
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 o  Y4 b* P: s8 G$ i' H% @7 I0 |0 f
( _2 `0 v/ L' z  q0 F" [" H: t4 i! K1 ]    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 9 B5 D6 y4 ~/ i6 Y- t6 v' E( G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );( K8 O$ _9 K% G& t
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 3 x9 N% W2 c7 R9 q; k$ ]4 O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );% D' g& L# C# i0 X
) t, y  x0 U: x+ ~$ [
    mcasp->regs->XSTAT = 0x0000ffff; * C( V5 k1 B+ c0 L+ c
    mcasp->regs->RSTAT = 0x0000ffff; . K* o0 Q; V5 q

7 S1 z% L# _# Y+ u7 I' o$ W    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;7 a* l% f( r$ H' m5 S" n' i0 U1 a
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 Y- r3 R5 q6 I1 }
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ z, h. ]  t0 F    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 V* L/ R' h: L7 I& @' `) G3 D

" L; \* I: X0 x% ~0 z) D3 O    /* Write a 0, so that no underrun occurs after releasing the state machine */
$ m2 H" F: X0 y    mcasp->regs->XBUF5 = 0;
/ z' D1 k* G/ `/ o) V! N    mcasp->regs->RBUF0 = 0;
; p7 A9 B. n  ~% O/ M6 t
# N' X0 W/ G/ q+ h' e2 M    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 G' L% {1 F' D% ~9 k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );$ s: e! J2 I3 Y2 o
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; . M6 N1 w9 b" [, p0 m2 k0 H9 \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% p7 A2 @1 \- U8 A' O2 }
; R+ z; V" s$ R) m( _    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 0 Q: Q+ `' Z7 S' {6 g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );9 b; W) m, M* Z. C/ t
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % e( ]% u+ y9 C/ _' t
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- X4 i- g! K. W- x) |; ~4 a
5 d: V9 [8 S2 W$ T1 q: n    CSR = 0x0000;
  x/ g8 c. p5 d5 {* ^5 X/ k+ c    INTC_INTMUX1 = 0x3d;/ ]  l* `& K; v# O5 r
    ISTP = (unsigned int)vectors;
' C, Z7 P. Q6 I. m5 ?; `6 N; s: Y    ICR = 0xFFF0;  8 q; @- ^) w  f9 t- n# V! K
    IER |= 0x12;  8 t+ [2 a, r" N5 C
    CSR |= 0x01;  
& v# x& @9 P' l5 T$ p: Q
$ k' ^3 Z7 R3 z5 W) t" Z( S- T$ h
$ }) T( k/ [: m" C7 Y' E' j' j+ \+ |4 t
还有就是两个输入输出函数:& }! [3 y! r6 @# S/ L
void output_sample(Int32 out_data)( }0 u6 y6 U8 c$ m7 g
{
! `# a2 @* `: U* {6 v  AIC31_data.uint = out_data;  / b  r* w5 j3 P( }+ T
  MCASP1_XBUF5_32BIT = AIC31_data.uint;6 |9 k% j; Y! W6 n$ p" n
}
- t' @5 c( w6 i
$ P/ w$ d) b/ q" w$ m1 `) k7 lInt32 input_sample(void); |4 r# U+ @, y7 ]  x  C# v
{  4 D6 z# Y0 ]- z# [3 j
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ H5 G4 T* N- R+ B  \1 X( I. r  return (AIC31_data.uint);
- J  C0 ?2 r$ B  L}
' A5 S7 M8 C; `- q$ ]
, F& _! c6 ]5 m$ a1 u; v3 O% T8 \4 F
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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