嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:3 x, S) c* ]3 G. [
main文件:# r+ J0 e. j) t* u. x  C
interrupt void interrupt4(void)  : h+ Z: Y4 }) N
{
2 j2 O' Z! ]" I! [  Uint32 sample;
6 n  j) }+ O, v1 h, ?3 U7 J. S9 D( r" }7 B. A
  sample = input_sample(); // read L + R samples from ADC5 z) ^7 E1 O  P( {* v1 c
  output_sample(sample);   // write L + R samples to DAC
) p! Q( {. X4 q( p  C8 ~6 G, ]0 P" H: i  return;5 U4 E# j0 l6 n) {
}9 \- z' Z( ], d4 R$ K' j' j
6 _# y0 H( Y5 F, m
int main( void )! H$ ~: S7 u! P
{; Q2 |9 a  c; a/ ~

6 v/ S) b! S( y& ~; x' N' ~    /* Initialize BSL */
) i) p. }2 A2 R    EVMC6747_init( );, i( R. i0 j. x. d6 \
        /* Call evmc6747_intr function */6 i" d7 N/ Q. E  `2 m$ a
    aic3106_init( );
0 o# P. p! v+ o3 k        while(1);
/ M( w$ B0 N  g% ]. k6 X}9 w& F3 Y3 S: O2 e. q6 K1 {7 c" _
- E* @7 z. n  O: ]

2 U; V  V; a1 faic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- f7 j& z2 H$ ]. V! b1 W; f/ L/* Initialize MCASP1 */+ C$ U% t8 n, ^' e
    mcasp = &MCASP_MODULE_1;3 T* G' `) h, X" V( N
    mcasp->regs->GBLCTL  = 0;       // Reset
, L, a: ]& }; D; Z9 \( v* Z/ O    mcasp->regs->RGBLCTL = 0;       // Reset RX6 c( V8 A$ X# t+ x5 f* P3 e" s
    mcasp->regs->XGBLCTL = 0;       // Reset TX3 u! I0 ~4 Y0 T7 I
    mcasp->regs->PWRDEMU = 1;       // Free-running2 K" `  B% V% J. B' s) N
   // configure McASP0 receive registers
2 f: K- i4 `$ ]9 D1 S$ E$ R) e8 i    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
, U$ c- Q. L+ w& p. j8 c$ M- O4 Z    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- P' O. k! i. {, Y    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word* ?' s9 Y  o" z9 j0 Y
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side). U' C5 |$ t4 m- O0 @) M
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)/ R& m1 f* |! s) B& w! E% T/ g
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1! e: J- g* |% I; w7 X
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
% q+ x' u& U# `# i1 h  F/ I    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 _9 F# @/ w5 i' e  c6 d. j5 S( L+ p9 h3 x5 x# {
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
1 k3 R1 ?9 E7 Q    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 }) a) n/ n: ~/ H: j8 E6 t
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( y' r/ C; F+ S% N/ I    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 v9 H# c. Q- {5 P4 U, m    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK, V, @* O1 S  x0 i+ ^% \* [& ]$ e# r
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1# l: x! `0 ~! Z2 f, K% `
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
; r; i' ]( s/ M1 l/ L- C    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 A: E" [4 s( ]9 q

9 w6 ^# R. q4 ]- o( ~1 j6 W    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
5 U9 E2 w/ L3 Z- Y( j& [, `9 M    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
8 ~. w! Q$ U. x, `    mcasp->regs->PFUNC      = 0;          // All MCASPs( L# P3 v7 L3 }. F
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 h9 }  ~# M, }( D1 |$ p* L4 D8 b
$ f0 T2 q: n! y, F    mcasp->regs->DITCTL     = 0x00000000; // Not used1 R7 y2 G* F: @. I5 e  b
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
3 f  @5 F9 t/ j# J2 t- F  V" D    mcasp->regs->AMUTE      = 0x00000000; // Not used
, ]. R# Y2 w+ |# q* B# g
8 J3 O8 A, X0 T! N+ n/* Starting sections of the McASP*/
- K  z% c5 B/ F9 i    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 q# N, [# ^9 X
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
+ J) ?% T* J6 k. t    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! d* B6 m4 \0 d3 u    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% g, P, N! X) a6 W" q
. I" I- A" L0 v    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# V% M9 j( |, v; m# K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- ]$ m2 ]7 }- M: l; ?. I    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 K9 @. r. [3 M& \2 X& p% ]5 F    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );; U# z% n3 O! H9 w, R6 X

* i- f8 _/ K: w5 x- ]    mcasp->regs->XSTAT = 0x0000ffff; 0 t) I! o+ l( ~6 E7 p& |
    mcasp->regs->RSTAT = 0x0000ffff; 7 e% I$ L! d2 }0 G6 r

$ d$ z9 u9 Z2 L6 u1 y' }7 u    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& |  j! j  {3 q* ]/ ^' \
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );# A" _# c, h' b- P; U3 \7 a' h+ i
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
8 Q5 f8 r8 @, y( _& `6 x: W( X    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 s9 R( m* [6 @, d9 x0 W+ C" \1 H/ d$ I  B* W7 O* c# P
    /* Write a 0, so that no underrun occurs after releasing the state machine */5 \* K" I! U1 s' y0 N" b+ \) B; e0 ]
    mcasp->regs->XBUF5 = 0;% L0 {. x& l8 u% w" A; p  c
    mcasp->regs->RBUF0 = 0;# P$ T% o2 d: q; l% r1 N& v! B, R  G* K
8 r* a3 D+ _1 A0 [% ~
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 7 T" u% {( h! |" L5 a- L
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );- a8 I4 |0 H: a7 H
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; % X* J% I. n- z' ?, U2 e
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );- v" W$ ]6 a/ c* K; \" }7 j

0 Z, j% y8 |: b) c% F3 A% H    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; : S9 n0 O  }- l& P# W9 g7 |4 Y1 w4 F& s
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( d3 O9 l" \8 g: X5 E    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; # C2 Z8 O0 |+ B9 B/ ~  U; p
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 x: Y# r3 N8 m  l4 p4 t. m* d# y: V$ `7 S7 @3 F! X
    CSR = 0x0000;% d  f( o7 g8 L0 O! J: K8 }' {6 j5 a
    INTC_INTMUX1 = 0x3d;) d- @% N; j# O  r" v" h6 }7 }
    ISTP = (unsigned int)vectors;
: V! [7 b+ Z- U) E    ICR = 0xFFF0;  7 D: Q3 b7 m; A! r
    IER |= 0x12;  / |; Z9 n9 z9 P1 k6 M/ K3 ?. Z
    CSR |= 0x01;  
# t; @# H8 G5 d0 B: }2 ]. k# Q
* [, m7 V; |" b: A  _
- @5 _+ n5 [7 T% [! {' ~0 i; H+ z3 @2 W9 h7 i, s+ ~- C" e
还有就是两个输入输出函数:3 M: V# M# `" |7 ~/ X
void output_sample(Int32 out_data)
0 p5 f4 f% t- X- C; B* F1 u- U{  F; z4 ~. w, l% @
  AIC31_data.uint = out_data;  7 Q. [' C) H: u' g
  MCASP1_XBUF5_32BIT = AIC31_data.uint;2 [5 a  U8 O; \* \' R
}
) q9 n$ |4 C0 w" f1 R8 C2 J
/ K. o5 `+ \0 R) sInt32 input_sample(void). J9 H  Y: U* Y* b" j9 ?
{  
2 s5 u, R. ~: Q. M) j! i- k  AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ _+ b1 b& V& d2 L" r  return (AIC31_data.uint);' j$ j6 X! o& u# r  ]
}
5 s' t4 H# a7 e# j( `5 ~9 ~6 w4 m% v% h2 j$ M& D3 s

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




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