嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 ~. g+ U' L- ?6 B! [7 y$ Kmain文件:# B0 h! G0 V9 r5 p9 p* v
interrupt void interrupt4(void)  
: U& S! g" v' N9 {{4 V* e+ m) x! Q
  Uint32 sample;3 U  O, D  n) z( h
( t  P; o$ x6 p" i, W# g
  sample = input_sample(); // read L + R samples from ADC$ a- U: V' m0 v2 ]' h7 z
  output_sample(sample);   // write L + R samples to DAC ' V7 W6 M! n0 Q3 i0 {4 c* Y
  return;9 L9 O: J4 V0 M- B, V
}
6 K9 W% i) ~6 s9 K" A/ ?5 h  r" c+ t$ }6 Y: R
int main( void )+ k; K9 W4 k. m8 ^4 c. d  Z2 D
{: C% {9 T5 @: g; ?4 f
. L- N( z- J: g; f5 `2 @9 g
    /* Initialize BSL */5 P* x; `8 b0 w7 _
    EVMC6747_init( );2 Q4 R" Z2 h& Y( O% G9 X. q& d0 r2 A
        /* Call evmc6747_intr function */9 v& X+ P& q$ T+ J
    aic3106_init( );- {  s  `! M7 x6 _
        while(1);
- D+ Q9 b# k+ y+ |}
" O7 @; l$ c5 M: F
( `$ r' f5 z( h( B3 D- H1 b% w. t0 k: d2 {& p7 H4 P2 v
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ j. Z% |  I, S7 e" m5 Y/* Initialize MCASP1 */" \7 A  f- {5 g8 V- P
    mcasp = &MCASP_MODULE_1;
( W( G* }  O; Z) r' |    mcasp->regs->GBLCTL  = 0;       // Reset" U0 A0 ?1 D. s& X$ K( s0 t0 E# T
    mcasp->regs->RGBLCTL = 0;       // Reset RX) b* `. @6 `  X- S( E
    mcasp->regs->XGBLCTL = 0;       // Reset TX
" g" W* j* \. A6 W5 B, r    mcasp->regs->PWRDEMU = 1;       // Free-running
4 Z$ }! v& n9 k4 b' @   // configure McASP0 receive registers$ w3 }3 a& Q' l: K. o5 _) i: o5 V
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used3 h- G7 O, b3 @# `1 I
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 U6 o) u+ `. c
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word8 a7 z7 ^1 ^+ t; q; _( w2 c0 J
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. b/ G& {0 z1 b. v/ w3 n    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
( X9 P# W; I% l/ S5 m) x4 o    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1, ^5 v. `, L! O4 ^7 r1 B* [& ^
    mcasp->regs->RINTCTL    = 0x00000000; // Not used9 W, K2 {2 ?6 a; _6 u( Y
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 Z$ N# \4 D# p) V$ ]3 f& ?, @& }4 y* s6 N* {( }5 @
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used5 ?% x& R8 ]' J5 @
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 |) F) f# h/ ?' \/ A* u5 u
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word3 o0 s3 }# |8 s) h$ B0 |4 V/ c
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16- t  a. c" G9 p
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
8 x. q7 i. E# E$ N3 O$ c  W    mcasp->regs->XTDM       = 0x00000003; // Slots 0,12 [9 M6 R0 \- T5 k, r, d& K% R
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
- u0 q. k$ U1 }5 s3 H* o1 O    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 o: @1 X5 w  S# x# e- f  {1 a7 Y

3 ~% @% X, H% ?! ]- `; S    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
& y7 x" `$ E) l( q    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
. U/ z  _. n; ^0 `1 i# y! I- r    mcasp->regs->PFUNC      = 0;          // All MCASPs# s/ G0 C+ C8 u9 R
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 b# M$ Z$ O% y1 ?. ]# i  E8 ]
7 ~5 D4 a4 s% R- Q6 r
    mcasp->regs->DITCTL     = 0x00000000; // Not used
9 Z' X) P2 N& X) I9 n    mcasp->regs->DLBCTL     = 0x00000000; // Not used9 z$ U: x2 B( |+ M5 ]
    mcasp->regs->AMUTE      = 0x00000000; // Not used% n$ m0 |- |$ a& q" M/ z

& H3 P6 V6 G4 e4 G/* Starting sections of the McASP*/- G/ A3 v$ h) M( n/ I6 i" k1 x
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 y2 k* c; y/ l' d; [$ K/ h
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  - s- a" Y! `- Q4 M
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ Y/ A/ |, Y" i* R8 a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 i* O9 C+ M3 c
7 v6 H: M9 q: [! d2 Q
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ B5 m+ J6 d8 t' k: J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );3 x5 a3 h* n' e3 M4 U
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) v3 h: D8 C7 U  z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );1 z: `! [+ Z# H' M, W) d
1 P: g8 t! G- X1 d+ E; @$ ?
    mcasp->regs->XSTAT = 0x0000ffff; ; {$ v- ]$ b4 j( \
    mcasp->regs->RSTAT = 0x0000ffff; ' H: w, f2 b2 P* ?7 e
  ~7 s7 }1 O% L* m
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; m% t# c6 N3 r7 N    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 I4 I# C  E1 f! u7 _
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 y% L* I4 ~2 G* f* G
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 {3 M  E7 {9 [% e
  E; {7 w+ @$ \/ B7 i! F    /* Write a 0, so that no underrun occurs after releasing the state machine */* Y9 }- d$ c2 s( r  Q2 S( o: |
    mcasp->regs->XBUF5 = 0;
3 c' w: R' p  Y, T& a$ E) s/ z  ?    mcasp->regs->RBUF0 = 0;3 o  z8 \5 ~- P, h

0 ~$ T- Y) W  Z! Z5 ^    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / x* _# ?7 [% W- V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% @/ ^/ J1 g6 Q4 n, ^7 |; P
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ A8 K8 r. |4 F0 R: y) m    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 F. J& ^2 E0 ~, ~. J5 p, n- `+ X' d; J3 U1 D8 {" C
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 F% z" |# G) B) z$ ]$ y/ h% M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" V+ f3 _/ A2 E" G- }, p/ d    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; . ^$ A7 z5 P- I, |$ [4 u: P5 O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 I+ [: `9 o' f% V6 p) x+ a
: c$ C. X1 W' f; j& d# K* b, j* t
    CSR = 0x0000;
' }  Q- b5 v" ?1 t$ J    INTC_INTMUX1 = 0x3d;
; Q  k; \) G# m& x& i% W    ISTP = (unsigned int)vectors;
* F* w- A+ [: O! _( m& ~+ b; ~    ICR = 0xFFF0;  6 `! A7 I; C, g
    IER |= 0x12;  ; H1 V2 q* s& B
    CSR |= 0x01;  ! v4 J- l  u1 n9 d0 P5 z

3 l4 f' E8 h* r2 W1 }4 d
# A: B" Q5 J, B, V1 X5 r$ _( S$ c3 |3 W0 i% Y* U
还有就是两个输入输出函数:
, n! S% S2 T( ovoid output_sample(Int32 out_data)# C- i& V7 O: w" ]& ]* h+ X
{" x& ]. K% A  ?. y2 o8 o2 f/ O
  AIC31_data.uint = out_data;  
( C: t# U3 F3 ?5 f% w  MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 _; O5 \  p: F) L( q+ G' D. A}
% L4 H; z9 b2 V( ~8 @9 D  u
! G7 Y( Y$ k3 K) M* a. HInt32 input_sample(void)
3 p- {) E4 n* T2 V4 q. S{  ; I6 `1 }3 f5 H; w3 g+ ~5 @% i
  AIC31_data.uint = MCASP1_RBUF0_32BIT;2 v' r4 _8 w( D. Z/ i
  return (AIC31_data.uint);; \# ]( r( m' U( k4 R
}- P4 f1 b. m, [7 l

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




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