嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ x5 P: O  e& I2 F- @- q2 }main文件:' O1 v! F! a7 a& n# y
interrupt void interrupt4(void)  
7 P; X. j! z* X/ h% m4 b; P* k{
9 O1 C- ?3 G3 c- d  x" e  Uint32 sample;
8 J* _/ {! G$ C: [, v# E; z
2 T; c* w( x- {( A7 s, F  sample = input_sample(); // read L + R samples from ADC
+ @1 u; V' Y$ i  output_sample(sample);   // write L + R samples to DAC
% J- v" F! S3 Y" Q  return;
9 F; Z3 L- z/ e3 A: H4 Q) N6 K  [3 B}
$ x/ @4 s$ F3 G) X" S0 m( [: Z
4 h2 D/ e3 ^. F' f) l! n: {int main( void )
  z3 C! ?1 Y6 y$ b* a1 o" p{
9 u+ ^0 l/ f0 T3 o$ {2 a
" Y, p+ B* j# N% O' }    /* Initialize BSL */$ \$ Y1 X" k0 B
    EVMC6747_init( );6 Z" O8 [4 {, K4 m3 C
        /* Call evmc6747_intr function */$ A; T4 `. ]2 j# e; L0 q* K, o
    aic3106_init( );' V) x% T0 R1 t, p& d& C
        while(1);% ?+ V* J' e6 k- _; P! [
}
: _. W$ a: @1 {; R0 O' f# o9 V
7 k& ~% r3 A8 @# x) e1 }; w$ E' G4 G7 L1 }9 R- N- H; n
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题8 x7 c" e- K% k* z# n- ?% f0 v3 E6 _# A
/* Initialize MCASP1 */
: x$ _# L# V# |: z    mcasp = &MCASP_MODULE_1;
5 G- ?. o, K- e% F$ m) s    mcasp->regs->GBLCTL  = 0;       // Reset
% J2 w4 P8 x1 R- ^" n    mcasp->regs->RGBLCTL = 0;       // Reset RX
" O% T7 B* {( r, C    mcasp->regs->XGBLCTL = 0;       // Reset TX
9 E* J7 D- o9 I( h    mcasp->regs->PWRDEMU = 1;       // Free-running7 f! q1 O& U+ h  H# Z7 ]4 L8 V
   // configure McASP0 receive registers. e6 {7 ~+ d- k$ m0 h
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
, k# m& \/ f& I' g    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* m5 J4 C* i5 f( S4 P4 y1 n( T/ H6 |
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 g# h+ G7 C; ^- V2 h    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)- [/ O% S5 O% [% M  a: z
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)" A5 v* J  ]! m3 F" I+ J
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
0 q5 n7 H+ y. Q/ b& t$ _( S5 A    mcasp->regs->RINTCTL    = 0x00000000; // Not used. V7 ?2 H+ a) t" ~; u: x
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, G5 a6 T* i5 I

: Y) m, p4 A8 r% c    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used8 e' H$ t% q% ?& y" w) y3 Y& f
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! c" N" Y$ H, o% v+ Q8 i% h( t4 }  X    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
" {# u: D* K, O    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# y2 ]* j! Y6 |- y    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
) \- T# r6 y# B- C2 _+ @4 I    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1+ V; v; g% A( e- m5 U" ]8 F
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit+ {" l  e- |) ?
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! C( p, {/ O) s( y+ i8 X2 L# C- U5 S/ z
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
& ^+ m( L( J" j5 N5 X3 u3 Z    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
3 Q( \; p5 V' I) R& j    mcasp->regs->PFUNC      = 0;          // All MCASPs
. V' L* b8 X& |% F  @. O    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ r! ]' W6 B, K6 l' d& c0 ~" y
+ V- |5 ^" e! ?# p, N    mcasp->regs->DITCTL     = 0x00000000; // Not used
9 u/ O* \: |7 o% m0 ~; u; o    mcasp->regs->DLBCTL     = 0x00000000; // Not used+ F& j% |0 c$ M3 Z' @
    mcasp->regs->AMUTE      = 0x00000000; // Not used
! l1 k9 L- y/ O' o: k$ m
" t* q- Y! D$ P( S3 j/* Starting sections of the McASP*/+ t9 {6 X. @0 F7 x* \
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 2 H# D' @! I, L6 z; a( T) `! s
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  $ N' L0 Z: K0 {8 }1 n
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 2 ~, T3 X6 s' y( \+ j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 J* V0 t# Y" z
! S/ b! ~- U: I2 c1 \    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 2 X8 t* t/ s, R0 C9 S( y) y5 `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! a& S1 k, w0 B( v4 T    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 h$ K( `# ~" T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );+ T9 ^. m' {9 a

8 [" u8 ^4 j' X$ o$ |7 i    mcasp->regs->XSTAT = 0x0000ffff;   ?4 V, r% O9 }* v1 d  ]
    mcasp->regs->RSTAT = 0x0000ffff; # v- ]6 L6 r! d; k# M- a7 H

: W4 S1 R+ V. X    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;  t4 s( q( P5 F9 Z& G( s" k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );: s; o1 f9 j% `8 d( p1 J9 e: x
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; J8 D1 v, @* k- A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
% T' a6 h+ [# e
. E% [  [0 d, e5 F+ R    /* Write a 0, so that no underrun occurs after releasing the state machine */
( I) Q( L2 W) s: C" T$ W% l. i    mcasp->regs->XBUF5 = 0;
, t7 h! |' G$ w2 [: P) B    mcasp->regs->RBUF0 = 0;# Y( j/ |* k+ W" K
* D* o  s) Y  w3 `5 B- ^
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 P6 |, W. S( b; b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, p  C# _+ H4 e0 P5 a    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 J" f: y4 G! _- z8 t
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );7 w) F, f$ {" I; i# z( l' y

) K3 u- }+ s2 ~2 G# P: R1 U    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 T! n9 s6 F- ^1 P. _+ U" F: _+ A: O    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 a8 N. B  V" N* J  g    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; - b. i) W5 C2 e# M8 Z" E( ?
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );6 ]* E6 n+ ^4 ^& q4 P9 E

' G/ ~0 X8 b1 D6 |* v- u6 M    CSR = 0x0000;
$ \3 _; V: M2 [; B/ r0 a; u    INTC_INTMUX1 = 0x3d;
- z% h$ a+ i) t3 `9 X    ISTP = (unsigned int)vectors;0 i- t7 R! b2 z! `1 t" {$ C$ g
    ICR = 0xFFF0;  3 H7 d( \1 V# s  ~5 Q# m0 ^* _) Z
    IER |= 0x12;  3 F" w& A/ P; p; \) T5 U$ }
    CSR |= 0x01;  
$ G0 i! H# V/ |. f
# ^- O6 a( B0 Y$ I& F0 N, j  t" t3 i" [  a6 F8 {! Q' t

. y# E  Z6 g" ^1 V2 a还有就是两个输入输出函数:, j& u! x# M0 K
void output_sample(Int32 out_data)
! C% Y9 f! J3 Z: r6 z{
0 l. Z& N; h9 F  AIC31_data.uint = out_data;  & Y( b( K& z) B' [, T
  MCASP1_XBUF5_32BIT = AIC31_data.uint;% `% N- I. Z* `
}
+ l" }" O: _* F* _) Y. y' n7 S4 \9 y
6 Q0 e. W% s  n2 N1 V1 ^: Q; f& eInt32 input_sample(void)5 l1 Z: C, `- x$ b6 [6 x3 n9 g
{  
' @; Q3 f+ P' [1 R  AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 K$ o* _& a& {* R) M8 j- \  return (AIC31_data.uint);" A0 l. j' Y5 t! H4 B9 D/ p
}
& T8 j2 b) D7 f2 ?1 ~3 a6 I
) U* C6 ]# a2 K- ~9 n
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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