嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:1 f3 C+ G- v2 o2 r/ k
main文件:% y- D3 V4 `3 D
interrupt void interrupt4(void)  . x* ^7 a  Z3 l; X
{
8 b6 S. }! \4 T- l& p  Uint32 sample;
  v( L4 x# \: O+ S( l& N. g$ x' o, `9 o: M2 C$ O' G. S* M
  sample = input_sample(); // read L + R samples from ADC* M1 M1 m* Z+ u' g3 F6 S
  output_sample(sample);   // write L + R samples to DAC : E, N0 x7 f5 e- F/ M8 W( N
  return;
0 u' I8 M. q. b  }/ n}# j4 M+ M& x& p' w% G% X/ ?
/ H5 J# Y. R3 j& G" B/ i5 \
int main( void )# l2 x4 E" G$ G
{
1 g4 H5 b" m$ l5 k' S$ F2 _5 l
/ ]% B3 l* R& R' ~# m    /* Initialize BSL */) C3 \# q8 V0 O3 p# n1 d! m
    EVMC6747_init( );. Y2 x7 B: I* q0 M$ E
        /* Call evmc6747_intr function */
& I8 r7 v5 w1 `1 u+ c8 q    aic3106_init( );4 x3 q9 L7 z) m
        while(1);
. \2 t- ?. G5 z  F& _* m}
& M# G5 E' D1 q7 `# I) M$ E2 D% a
# T4 d% a  [! s% s5 G3 @' i( J* I/ F  f& J
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* O6 p& R1 E: ~  a) N( i/* Initialize MCASP1 */
$ f6 R  Q8 c# l; V: B* a    mcasp = &MCASP_MODULE_1;
- r9 t: F7 e5 O( i7 Y    mcasp->regs->GBLCTL  = 0;       // Reset. @$ ~: b" T5 q$ o
    mcasp->regs->RGBLCTL = 0;       // Reset RX( k# @4 E! w4 ]) y, g$ |- x3 F1 E
    mcasp->regs->XGBLCTL = 0;       // Reset TX
% R( q) P0 u  y' L4 U; e' F    mcasp->regs->PWRDEMU = 1;       // Free-running$ J1 O! k( s6 }4 B
   // configure McASP0 receive registers
2 ^! d5 X6 h$ E! J    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used1 y- Z: r$ J, j' w3 }; m8 p- {
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. f6 A# p6 S# e1 W    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* d& @6 O, q; @/ F+ n% b3 o    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 @% h2 z9 ^4 n, h% {    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
6 @) K3 T  j, G    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1* T6 ~3 ~9 Q: ^& Y
    mcasp->regs->RINTCTL    = 0x00000000; // Not used2 _, |! C& ~' d6 t  C2 N2 V/ X0 L6 e
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 ]5 ~! P; P; ?
" A8 B" o2 T" ]    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
: f) m! @0 V; `  A- F! g0 r    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ t$ m" W5 \9 |. a0 E6 H
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word0 ~8 f8 `, |6 c
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 W+ A/ a4 V2 V& o$ M, j    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK4 H5 |& G( ^9 w  M6 L1 s% m
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
7 Y- x2 v% t) ^) u4 c9 y1 ?    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit2 ]; u/ F7 w5 a- D6 k1 o
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 \$ t4 G% w8 V3 R4 ]; K

3 d: [) F& v8 k1 E# D& I! b    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN; n2 E) W6 h" e' w1 C( T- k
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT$ x0 u) a$ ?1 ~4 e4 g% K
    mcasp->regs->PFUNC      = 0;          // All MCASPs
- Y, O# f8 K5 G- B1 ?7 j0 k2 T5 ~5 O    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 o+ _- o; G- d, R- ]5 T
+ G' [* Y# b5 t" |5 }- O
    mcasp->regs->DITCTL     = 0x00000000; // Not used0 w6 F- H/ h. j. z, I( D
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
8 I* |4 ~- d# G% B& d1 `2 p5 H$ |    mcasp->regs->AMUTE      = 0x00000000; // Not used1 l* d) s( S$ Q- x( T+ X, X

4 @; v" [: A" i) D% J/* Starting sections of the McASP*/
) Y0 V' M& f% V# V) D" [    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 B2 j+ N7 l& ~8 @. ~& l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  8 b9 \; \2 C- K4 q
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 8 k5 e4 r# R$ j- Q  ?- s* m4 H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );6 K  i* T' J( `: m  L7 M6 H4 a
7 s# S  A$ {6 N/ O
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& J( a: L+ f! V  o$ V0 I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 Y" e$ f3 E5 ?% t. O( i! v  ~
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) F/ C/ @! J' p+ v; l' n" V% O0 H' O    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );! r5 ]. a; ]& L! Z9 U
; l2 n8 Y) ~2 O. v# i
    mcasp->regs->XSTAT = 0x0000ffff;
8 O9 o& R7 @' M( X7 k; D    mcasp->regs->RSTAT = 0x0000ffff;
" c* n8 ~: Y8 k2 S2 o+ D3 T6 S0 U/ Z2 m+ D. k' i9 v4 O
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;# M) T0 a0 ?! U) `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 p( V9 H/ j" T! i
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 Q1 i  s( o& @: i5 T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
  i8 |0 |( t/ V) R7 j6 z+ P+ B: K3 R2 s. d8 }6 p
    /* Write a 0, so that no underrun occurs after releasing the state machine */3 w2 c. \* ]& G$ B, u; |
    mcasp->regs->XBUF5 = 0;
1 @: K' X2 l! h4 _9 E( q    mcasp->regs->RBUF0 = 0;3 c7 o( I) P" c  n1 f: [
' G) P! a, o. o& [4 w) |
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
* g% @( u) b9 n# G& Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( A! j" ^( p7 u. K7 c( M% U3 |    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: p" j3 c8 v; t5 u3 W* ]    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
5 `/ c0 `! G9 p) a
3 q& T6 d& A) g9 i' G! g& t  ]6 ]- V. C    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! D6 v9 z1 l7 v5 I' P/ ]* z1 |6 u) Q) i  z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& u- V4 o3 H' T! X& Q: f# \. }& }    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" W. f# ]) k* r$ f: F4 B8 h    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
% \, W! o8 U+ X; U6 t* W+ t
# q1 r; p$ T) C$ u4 `7 y    CSR = 0x0000;6 x; s% d# E; U" y6 B8 z& d
    INTC_INTMUX1 = 0x3d;
4 @7 Z$ q( j* E8 C  w2 Q    ISTP = (unsigned int)vectors;
7 w3 d0 Y# _: X( E0 n/ q    ICR = 0xFFF0;  
, E9 ?8 d. O' s9 P& [    IER |= 0x12;  
! X6 ?( m/ \2 ~: o    CSR |= 0x01;  9 b* w' o6 U$ Y  X

1 k" w* k  m* N
9 t. {6 R7 j9 `8 h6 c9 z- \0 t
$ X# D8 P% e) l( @4 o. i还有就是两个输入输出函数:
0 Z# m% s" {4 G" Tvoid output_sample(Int32 out_data)  j6 p% I: M: M" X/ i' v/ \
{
) `! H# Z; a3 z9 S! |# n/ `7 ]  AIC31_data.uint = out_data;  3 x0 z" D3 A, c' f
  MCASP1_XBUF5_32BIT = AIC31_data.uint;$ u8 l! B" b% h! _* I2 W) m
}. B' X* Z! q$ T; @) ]) [. n" p. `! g  y0 K

# c5 M, s  u$ j/ j1 `9 _1 {  IInt32 input_sample(void)
- r  e& _& w% S+ [' l7 U{  
5 f. a3 @3 S8 J/ c+ b# N5 k  w  AIC31_data.uint = MCASP1_RBUF0_32BIT;
) k, }8 J% k3 E  return (AIC31_data.uint);
$ F' z. `+ [) ~( Z}( ]& p, j# Q+ b) M! o

7 M! b0 X& C4 U/ J$ d
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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