嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:5 Z$ A  F* ]& k& y
main文件:+ u4 m# ?( Z* f- P4 [" \& T; v
interrupt void interrupt4(void)  ' C! t" p% O  [7 H! f0 I) M
{6 i- a& W  O% {  q# X$ U  S
  Uint32 sample;
. X0 y* F2 k9 `; H) P9 r2 |! C! Q+ v5 W7 z) l( p
  sample = input_sample(); // read L + R samples from ADC
6 m$ ]) e* R) \" w9 v) x. n7 o  output_sample(sample);   // write L + R samples to DAC - J+ p& K7 M: w. |! ?& @3 V
  return;- B. k  e% [# z& j- N1 c$ g
}
& E. y  @0 n8 C; E
' ~; p" d" a8 b+ |  T1 Z5 _int main( void )
  K/ C$ u7 `; o{
3 ^. [$ Y  ]% w& n" h
0 q. [1 B; D" \    /* Initialize BSL */, }; k8 R0 M; f1 Q, L4 g7 ?# [
    EVMC6747_init( );! r5 m/ |( C6 a4 {9 h7 ~
        /* Call evmc6747_intr function */  H4 F* P' i* t9 r: O
    aic3106_init( );% H1 m* A; J& l
        while(1);0 O: v( Q5 n, c, W7 N" ~+ \  {
}: \" K  I1 z( \( f) e% o1 Q! _; _

+ h* z2 U* S! c7 h2 x$ ^9 |4 [0 c/ q+ x* N  L$ s
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题& g& m1 T& R5 Y. M5 t8 h6 V
/* Initialize MCASP1 */
# t( P: Q' Z: Y; }; D7 u    mcasp = &MCASP_MODULE_1;: ^, ]& ~+ e* I% N/ j& l8 {3 T
    mcasp->regs->GBLCTL  = 0;       // Reset. B. g% K4 ^( Y
    mcasp->regs->RGBLCTL = 0;       // Reset RX7 v! Y  N) E7 k- Q5 d0 D# l
    mcasp->regs->XGBLCTL = 0;       // Reset TX) Z0 }3 W: d8 p' W
    mcasp->regs->PWRDEMU = 1;       // Free-running
; i. g, A2 i: z   // configure McASP0 receive registers: V7 x2 G* g' j3 l8 S- T: O' O
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used; i  a" Z, [. r8 k: i# [0 u
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# Z- r! K! |' o% \6 ^( _
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ \+ p6 [. ]6 z    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
) H) d: J: z* E2 E7 d    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)6 H- N6 a/ @* s. j* @
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1: v4 P) a( z3 m3 L# L. c' E) \. Y8 g) v
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
1 ~8 s* r+ ~1 w' h$ k    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, u& S! R$ \' j: Z# Y! `

! @0 Q* q3 ?% _  K/ G    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used( r) ]2 V1 ?% s+ J# j: X+ Q4 X# x
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 ^; P+ x) k. H) g
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* @8 X  _, y# k5 [6 Q, x% `6 w. g3 C    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 |1 Y% D* H  m& {5 f    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK, o, Z. e1 b6 T9 f6 S0 x; i. s
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
- {5 m) n8 V# r( h7 I: G+ X4 D7 @    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit/ X( v9 J3 c2 I) c) l
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 ?" y& g+ A; J- [
0 H8 Y( ?8 m: }
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
) z# K" q$ l9 w* u4 W; \$ Z    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
1 ^$ w5 ?5 W2 ^8 \( ^, z    mcasp->regs->PFUNC      = 0;          // All MCASPs9 Y# J" \4 n# U  z
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
; K6 T0 z' }7 V4 j0 \: z( f$ K) c: ], @: E* p5 B1 Q. h5 f
    mcasp->regs->DITCTL     = 0x00000000; // Not used1 ^( P7 o( b1 u* I5 n- Y
    mcasp->regs->DLBCTL     = 0x00000000; // Not used/ m$ @' d/ z' p2 E
    mcasp->regs->AMUTE      = 0x00000000; // Not used% Q, M% L# f2 r/ T

* s7 p" O/ m6 {! Q/* Starting sections of the McASP*/: l4 ^/ T) O9 Q0 l/ S3 f( W
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 2 i8 q! M) z3 m3 P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  3 m! ?- ]! [" }* s
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 h* j# L- v' }& \    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 n, x" K- j  t/ O
+ u; ?6 K% W' s* D/ r    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. C" p  ^4 g, H0 ^8 v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );" E+ o; s6 v7 b( ^+ e% ?/ Q3 i5 f
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 G% a3 o3 X+ }4 |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# S: P* k& i- k5 [
6 O+ E" A( I, S# y$ R1 U
    mcasp->regs->XSTAT = 0x0000ffff;
# N0 p" V9 s( u( ?$ z1 O$ D+ r; g# p    mcasp->regs->RSTAT = 0x0000ffff;
( R: u5 Y2 A8 i( ~1 P1 X4 o3 ^1 ~3 j( ^/ ?! X
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;: o2 w# r( ]& e5 l3 G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) N( o) k' |, V9 Q, C$ a8 B& m    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( t0 P9 o# g! O    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );) X/ y" ~( h, I

: f0 E# _6 X  m, g: b8 k& a    /* Write a 0, so that no underrun occurs after releasing the state machine */
" @/ |9 j3 r) s/ A    mcasp->regs->XBUF5 = 0;
: D- }* a% E$ Y) Z, M; @$ g    mcasp->regs->RBUF0 = 0;
* H. W3 p' r! o2 R
+ ?3 \  g/ E( \    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ; ~5 t1 h- f+ m! P' w) G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );8 H4 _) S0 N8 T9 p* m$ `$ q
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 m) N, d" {# I. [. }  C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 q# z: ^5 U1 ?' ]% W
; K1 f/ q- X  R
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - q8 w" [: o2 v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 V! F4 ]4 c4 O/ O4 n% W; p  d" X    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 {% r: Y. O  c4 J" g  u6 M
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ m9 J4 y+ A. S1 l$ x6 C2 b2 `# v
0 K7 z  i" W$ ?- E2 K: p9 C    CSR = 0x0000;
4 n2 }' g! U2 I: @    INTC_INTMUX1 = 0x3d;
- ~, z1 j9 a, i9 N0 @% n    ISTP = (unsigned int)vectors;
9 u- C. b6 l! ?6 ^' x( c    ICR = 0xFFF0;  + i4 ~  l, x: z$ L5 C: C7 k
    IER |= 0x12;  
1 X* z* n, `" P7 t    CSR |= 0x01;  , i, d% H6 m9 @5 l* i) S3 f' }! V
/ z8 l" x9 |( ^% f7 K
6 T8 h6 f: |; t; ~; ?; K5 a" k

8 }- \  \2 `: i2 F4 R. l, u还有就是两个输入输出函数:, u$ ?9 N! z* e8 p3 T
void output_sample(Int32 out_data)3 l1 e) x% w4 R4 k8 \% C  Z
{
3 x4 l* U  s  A  AIC31_data.uint = out_data;  ) j- B6 g  t7 h: _- }4 _- ~
  MCASP1_XBUF5_32BIT = AIC31_data.uint;  [; _! p. t+ i8 B, N) i
}- r" a" m3 ?( h, {! \

" y9 f- e$ a! {6 y: B. GInt32 input_sample(void)8 @$ W$ O0 k! `/ b
{  
! M  ]! [. g1 ]$ P5 E' x# y9 E  AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ X3 Z0 s" R# `5 x  return (AIC31_data.uint);
& B/ U' {0 {- U/ V}. V1 s( J( M- r+ ~' d

4 N0 h( e3 R5 {; p+ v
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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