嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ M# C* c: [9 k% }+ u* Gmain文件:
! o. I3 ]( _4 \# F2 j! g: Yinterrupt void interrupt4(void)  
" k/ g- _8 K8 d4 {3 j0 m  T{, X. j6 D( [; _7 `* n8 h2 N% N' l
  Uint32 sample;/ [& j# i# c" w$ s  ~9 M
, s1 f" Z' T/ \4 n/ W+ h
  sample = input_sample(); // read L + R samples from ADC! ^0 `8 ^( T" [. \# h7 e5 w
  output_sample(sample);   // write L + R samples to DAC
, m- @! a% R6 X8 P6 A$ [) E* c8 ~  return;6 w; G* ?' B' i0 v+ N. {
}
+ T1 r" g; M$ i- j+ h. X2 z% [2 E+ _! p: k
int main( void )
9 M4 n+ g! [" M, L, o6 `( `{  N' j: [- l* Z4 _& ]

2 a5 ?( r$ ^, q) o- r2 f    /* Initialize BSL */, a. }4 B# A9 G: S2 [
    EVMC6747_init( );  e5 a& x" ?( T7 b
        /* Call evmc6747_intr function */
; j+ O' Q' q/ m9 V    aic3106_init( );' ]+ L  W2 e6 S1 v' Y( m3 f
        while(1);0 ~) e( L/ x3 y" m# {/ n3 L8 ]) J
}
/ N) P8 z- X" X% S! }" [* b
/ y' z6 k# e$ b
# Q2 U$ R+ I9 s9 H4 |2 H  W; A" Gaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题  m% Y$ X7 N0 s, S6 O
/* Initialize MCASP1 */
1 o2 G, Z9 R+ e7 j    mcasp = &MCASP_MODULE_1;- i0 s$ a6 j+ Z6 {9 Z- s3 a) j
    mcasp->regs->GBLCTL  = 0;       // Reset
8 A# C* U+ Y; {6 X' V5 _$ @    mcasp->regs->RGBLCTL = 0;       // Reset RX  Q# M+ ^8 ?) c
    mcasp->regs->XGBLCTL = 0;       // Reset TX
2 e$ K# u( C# G- J! S- O" {. Z! x    mcasp->regs->PWRDEMU = 1;       // Free-running5 q  s4 k9 P; {9 E. D
   // configure McASP0 receive registers$ E) `) ~( H! d$ ^0 O; r
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
( U* j! u4 X7 U/ B    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) E9 E( P' i! k2 @
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* D( Q8 \0 m" u/ m    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)# R5 W; z0 f. s
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
' ?- K. t. x1 x+ m    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
9 f9 \- s, ^' T    mcasp->regs->RINTCTL    = 0x00000000; // Not used8 W. \' h# r9 _$ I/ h' |. c" g4 Y) |
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 P7 Y. m. Y. L7 K8 O3 k* Q

# d; Q* K& l1 S5 H2 }. }    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
( }) ^' [, i# N' b6 r    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 V9 ?9 T) `, e6 F    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 i# ^- n" D! X8 \1 d: j4 \( C    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, Z% v( G; Q( w5 ~3 t* j
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
# s- \7 N# M' M# G    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
' m  D/ d3 g+ S2 `& |    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit7 K8 w! R* D  [, g& }
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' e' b3 L: q6 O1 C

- Y# ]! l3 h9 t  u, i    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
; S$ p% K7 q: F/ j2 _    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
- {3 X$ B% i- y) C4 b4 \% z+ h7 c    mcasp->regs->PFUNC      = 0;          // All MCASPs
6 Z5 w/ b7 X# j4 _- Z! o    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ z4 P) I  t8 {# ]* d' R8 c
! l% ~8 ]2 }/ z% Q; d. D/ E
    mcasp->regs->DITCTL     = 0x00000000; // Not used
% ^+ S+ z; d1 Y, J: F5 W    mcasp->regs->DLBCTL     = 0x00000000; // Not used, x, L7 d8 @: D. Z( O7 r0 K1 r6 }: M
    mcasp->regs->AMUTE      = 0x00000000; // Not used
8 S8 d9 ~9 L5 c  H1 M0 W- L; X
5 h7 ]! X; e+ |8 t7 f! G* c% d/* Starting sections of the McASP*/  t* S! H! w+ t$ K6 a: r* D
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! g$ h% ?( }- m4 @9 r    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
% E  G' ~1 ?  s/ s( _    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; % c- ^1 p9 J& @  X, ~' N2 N, z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 n; a/ ?1 |( I' }' i; G. w3 N8 @; @, [8 {
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 i. n+ b( E* |. V0 F* ^
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ y0 p: `# w. g; ?3 o+ {
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( J7 n" s: h+ e    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 F: A9 b, j" D$ E% V* }' k3 S5 @/ @9 V; C9 h4 v
    mcasp->regs->XSTAT = 0x0000ffff;
- l+ Z2 h2 Y* U& A9 m    mcasp->regs->RSTAT = 0x0000ffff;
4 m& g7 e/ ^8 C. V
+ M) [8 v$ G: K. {4 K4 B. T0 R9 F    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 E/ Z1 m6 i5 k1 D6 r    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( r* i5 W1 n; |6 ]+ }3 b' s/ _    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 N* D& k: J( ^, `    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 Y) b1 S. i/ Y$ f0 g9 L' Y9 \9 w4 Q) O
    /* Write a 0, so that no underrun occurs after releasing the state machine */, g2 {4 ]: X* J* \
    mcasp->regs->XBUF5 = 0;3 l  c  `" J5 [. p% O  a* e
    mcasp->regs->RBUF0 = 0;6 Q( H8 K1 w9 X" i5 y
7 \9 n, k. X7 y# x* y- o
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
' d1 Y( ?) o) F; v, Y4 z    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );, `4 x: v/ J5 ?; ~8 {0 }8 l
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : U; `; {4 O4 p. `) N) A3 d
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
6 K, ~9 p5 r1 i  M" n) t: `' H" s/ U( r0 i% ~" v! [$ @
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 Y( @% \% \/ f# I" Z1 \    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 q/ `' E- H+ ~    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;   l- H8 v& {% w; w' s3 w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' S$ C# Z- L: `) e. a+ [7 [
4 q, ?) J& t/ I# x0 M! Z    CSR = 0x0000;
0 S8 z. m* d6 E& H  a0 [    INTC_INTMUX1 = 0x3d;, e, ~- \8 ?3 z# e9 |+ ?
    ISTP = (unsigned int)vectors;
4 ]1 O$ G3 o) O  T# `9 z    ICR = 0xFFF0;  
- P0 Q$ S2 }5 r' l9 {    IER |= 0x12;  
; ^9 v6 t& t5 i1 b3 A3 z    CSR |= 0x01;  
3 D8 `! D+ L/ E7 ~0 c# v$ A  i

, q1 x+ L; a* g( G: X9 m" b6 F: g& d7 {, P3 A# G- N" ]
还有就是两个输入输出函数:* p& N. P  Z" d8 V
void output_sample(Int32 out_data)5 V' r  s: o. \2 a0 C/ j9 h' }
{) u: T0 v% E6 _/ u' g( \
  AIC31_data.uint = out_data;  # w, Z) j) W5 {, H  X3 a0 U
  MCASP1_XBUF5_32BIT = AIC31_data.uint;- X( W0 O4 Z$ G0 U
}- }% N, {9 ]# e- s# q7 y
/ a* j5 p! w* X4 N. A2 `! l
Int32 input_sample(void)8 G% y+ _2 ~' Y" D
{  
  l' m1 {  L. ~/ d# v  AIC31_data.uint = MCASP1_RBUF0_32BIT;3 N5 _0 e  D! M* B6 y0 C0 w1 z% w
  return (AIC31_data.uint);. |0 O. Q8 l3 Z7 {7 c# V- F
}
1 j, r3 g4 P1 A4 c& c* e& a. \. d" h( s& r

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




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