嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:9 Z/ y( K/ @1 L% v- A. ~6 [+ m0 b
main文件:, _) Q7 |5 X+ I: b
interrupt void interrupt4(void)  
' q8 Q2 d& _' v4 X: q  n9 c9 R( R{
$ [6 h4 u- S& p! K& J9 q/ A: r  Uint32 sample;
; j' I, Z- s# e. m' G' B# A
: ?; Z4 ^; T2 [/ F4 \( o2 I  sample = input_sample(); // read L + R samples from ADC& E3 Y8 i0 o1 C7 \9 x/ l6 J7 I' q' d! d
  output_sample(sample);   // write L + R samples to DAC
) x% s' `5 Q0 i$ @6 J& }7 H$ ?  return;9 A( |( m9 H1 }" |' \
}
3 |" @' \' a% Z' p2 h$ V) f4 e- A# e1 O3 Z! I+ w
int main( void )
6 y, S1 w' c& o" L3 p{! t- L6 n; x; y$ [# O
& Y/ l1 T0 A, T4 s4 D
    /* Initialize BSL */5 a: I# K  l5 g% n: u  ~6 s) w
    EVMC6747_init( );
2 ~- v1 j) d" `. ]. m0 H$ L        /* Call evmc6747_intr function */; H, @  _0 A5 U, y: D# O' _* K
    aic3106_init( );& `, ~8 _, H3 K5 G: w
        while(1);& L. ~8 t+ T: s  a& ?
}0 C( j1 f2 A3 {

' t. m! d) E+ v! y$ |6 ^7 d+ ]) g/ i7 a( s8 K& Q
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" n  ?, {5 x4 |* {% b: g- u
/* Initialize MCASP1 */
: G8 k7 T1 J. Y! L3 }6 ]. g- a    mcasp = &MCASP_MODULE_1;4 p  F4 m! b. T) m  m, Q/ Z9 t
    mcasp->regs->GBLCTL  = 0;       // Reset. M- H6 b  ~$ e' o# i+ o
    mcasp->regs->RGBLCTL = 0;       // Reset RX0 w# y8 L" s% u0 @7 k. y* F
    mcasp->regs->XGBLCTL = 0;       // Reset TX4 N. R8 K& R- n1 t4 i. n- f
    mcasp->regs->PWRDEMU = 1;       // Free-running9 t9 X, R5 C8 ]# A# ?* ~+ L
   // configure McASP0 receive registers
; W( b' K9 |+ x0 p3 ?1 D    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
0 @3 g4 Q' I8 W& w$ w" I* X    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus  `! O" T4 N/ q: I7 v; I
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word7 @, q0 Z7 a1 q/ @
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)) m" y8 N; `( D" y( r/ q- ~
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
+ R: b, e  W/ a, ^0 f    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
  d! {& x" G- ?$ S3 M4 }    mcasp->regs->RINTCTL    = 0x00000000; // Not used
2 ^& @, u& M1 @( m5 D    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! L, W4 `4 j; }& W3 W+ e
/ j9 Z7 E9 D4 i) A0 C9 r1 \8 u$ H    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used3 P" i4 E4 ^0 d( N; m
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% [: e% \3 S5 f9 @+ {7 u+ Y
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& Q; i. F9 @7 l1 Z, i/ {    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 p" V- C1 K) }+ `% l4 {4 Q
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK( q8 p, U- v3 p* S; d( g
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
3 f9 I, n' ]( V: V- T$ j& s    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit0 u. C% f/ a6 `0 `2 ?. V: l: z/ S
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- q; K9 q# \9 t( u* M2 U* D. N

, H$ u1 ^8 g4 \4 g; {! @    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN; o& @3 s) P- j8 }8 `0 y. @! D( ?
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
! X3 L+ D- _! e: t; g* N    mcasp->regs->PFUNC      = 0;          // All MCASPs
) o: @$ `1 W! z# o1 r' [" o    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1! n) x& x( P) _9 s. _
6 o) B1 l0 v) m- L, \, m, s
    mcasp->regs->DITCTL     = 0x00000000; // Not used) f4 S$ x' h- }; D/ R$ n
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
( r0 e! g5 x/ p) A2 n    mcasp->regs->AMUTE      = 0x00000000; // Not used. g8 I. ]. \0 g( I4 @
4 {9 q& _; `( W- M4 ^4 v
/* Starting sections of the McASP*/& O! @& b; `+ p/ W$ S5 ?, S
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;   h9 a" x/ Q" A. q/ }& Q3 ^
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  . ~3 s  v. p  P$ |: |: \
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 2 Z$ c( g1 V$ V: B" ~; N9 e
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ [# S; J+ `6 V; k% y7 H. C

; r9 y" _# S. I5 ^) r    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; & D& K% n9 o/ [5 |1 H6 Q8 w6 u# p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( [6 ^# L( q* b    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ {0 }* ^  ~, f- h7 b    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: Q( d  i* O6 e. S' }+ t& B" |3 l& b6 c$ i0 `
    mcasp->regs->XSTAT = 0x0000ffff; 6 g& W/ i1 x" X, N
    mcasp->regs->RSTAT = 0x0000ffff; - A3 I3 r, N& ]; I' F
; l9 F: e* N  n9 X1 y
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 }: ?# I2 B  b8 G3 i8 P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) v  y4 B. M% U4 D+ ]; g
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- t3 H# t4 a. B; ^5 v    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 D" K" y/ h" x" t% P( b, s7 F9 M3 i6 s& c; {! ^
    /* Write a 0, so that no underrun occurs after releasing the state machine */, J/ J6 e+ N7 C: Y: q
    mcasp->regs->XBUF5 = 0;3 q0 j5 ?3 l) r9 Y* @
    mcasp->regs->RBUF0 = 0;
, }* {7 `0 Y& N- B* [! c# Y7 t0 F# h8 K' c- g
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" l* v2 ]% V7 `( R5 }    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 g9 ~- Y/ W$ b5 H5 F6 I, n' Q    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 ]( S4 y9 ^7 E; o- K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# H( C& e2 i5 f4 R  D
3 z* `) V* s+ j
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; $ [% `% `* \2 G7 Q; {' H# o) |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );* H( s5 a! E# O, R# O; n+ {/ S
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; " X) f7 [. O# _( s
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );  [( G3 ?) K* c6 p" e
1 H# K% _. p8 f" p& S* d7 f( m0 e
    CSR = 0x0000;
- f; }6 Z) _, w; j3 k! k2 P2 G3 O    INTC_INTMUX1 = 0x3d;! ]4 j+ @$ m3 l& k/ f4 F
    ISTP = (unsigned int)vectors;3 a% r( @9 F  b; Z0 t- B- y) Q7 P
    ICR = 0xFFF0;  
+ t& X7 p- c& U    IER |= 0x12;  . E9 @+ R" ~( T3 O
    CSR |= 0x01;  
- {$ F/ S1 b) y
. U/ K. p* `* y& K) W: P- I4 I/ K$ l! ?  [7 F8 [# B
1 ?+ {  Y2 `) D* ?/ `( a
还有就是两个输入输出函数:4 ~0 b% u% t/ q, H
void output_sample(Int32 out_data)
  p& R3 _- Q$ V2 y' @0 s{1 W% W, N2 Y- G( S! [0 W+ q- l
  AIC31_data.uint = out_data;  
5 B7 F: G! Q8 {2 b7 C# Q  MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 U" o) H+ M* q9 e+ Q}
% D, x- @; k: C' x: v& Y4 ]! S' a
7 a; C9 Z: M  k. ]6 o/ `+ kInt32 input_sample(void)8 l% q; b" V4 a6 A3 x
{  
% ?* r) i4 o5 z; c9 e; }' k! O  AIC31_data.uint = MCASP1_RBUF0_32BIT;9 W& w: w" a+ A8 g
  return (AIC31_data.uint);
+ _7 q- I: H# @# _$ x% m}
  ~, u, g* d/ F/ @4 }% D! U
0 U) D2 M# O1 f1 ~( d6 m$ a9 b  B, D
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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