嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:: g. h; ]% e3 f1 d0 F# [& S
main文件:
8 \$ |9 D- q/ T4 \# finterrupt void interrupt4(void)  7 d( E# x3 B; }* x* S/ ?+ L1 c8 E
{
7 T$ l3 c8 |3 p& s' X  Uint32 sample;
! \% D( ~& @! N" O3 i
* @, f4 o0 h2 s4 x& f! w  sample = input_sample(); // read L + R samples from ADC
) o/ B: [% {  @) i  output_sample(sample);   // write L + R samples to DAC 5 z0 P& e# P( g# a+ ?6 Z
  return;
. R0 D5 R+ K2 |% o; a+ _8 B2 k}& o  t* i' Y. @5 Q) y: h& d8 `! t+ p4 J, C

* m; _) x, @2 L# L, O/ c$ Fint main( void )
; ~! k+ [2 s1 J$ ^2 l{
3 d1 V) h. M9 Y
' i& _( t) i  z, v2 v* y9 E% \    /* Initialize BSL */
9 V9 S! b) n4 @4 v, K    EVMC6747_init( );+ r7 o+ N7 H; o3 H
        /* Call evmc6747_intr function */
# n/ Q! g) s4 U    aic3106_init( );% W- [, ]8 u- N* s, Q8 v7 `- k
        while(1);
. \: y+ w2 ?. E$ A! s}
" c) F; V& b: V3 a- e/ r! I$ Y5 J6 K$ o1 S0 H' G) b
- B0 a9 Y( T5 ~9 O: {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题, y% x# c$ H: R
/* Initialize MCASP1 */! A% s# ]* L1 c9 i
    mcasp = &MCASP_MODULE_1;
- i0 _2 R- G  i6 j  |8 S; S% E    mcasp->regs->GBLCTL  = 0;       // Reset
; z. a: S8 A! v. H    mcasp->regs->RGBLCTL = 0;       // Reset RX
  b$ p3 x7 u: v2 v" d    mcasp->regs->XGBLCTL = 0;       // Reset TX
" g+ p0 b: }* u2 E    mcasp->regs->PWRDEMU = 1;       // Free-running7 m8 E1 x% [" f
   // configure McASP0 receive registers0 f( g1 C$ J4 W5 m7 N1 Q& {
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used2 V- t* E- G  T) p2 B) \
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% g. o/ P0 [- o. `  ~) ?, H    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word% C" i! B, _# d3 {; Z
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; Q3 i/ ~; J, r! u" [    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)# Z2 l: }3 B2 O# y* v9 S  i8 ~' K8 C2 E
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
' Y1 U& {* t9 p: I    mcasp->regs->RINTCTL    = 0x00000000; // Not used
8 ?! u( g# F# T1 P9 `/ i. `& _5 K    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ L( [7 `; a5 @# f( s2 |
; l' L! G7 j( r; u& b0 J2 t    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
0 v& ~+ H5 Q: l6 ?$ }* R    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% U* `$ B1 W1 F9 P1 p( K; ?% [/ ~    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word5 \2 x5 Z- a4 z  X/ h4 \3 V/ K8 Z
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 ~! a& ?5 m% J( {( T3 B
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK. i5 v5 \/ [$ X0 ~2 o% h! t6 ^
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
' y" h) @7 _- V/ P8 u9 D" v    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit2 K# C" F4 M% Z  z, s' ]* r6 s6 c
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, I6 |  t% l* j5 n' z/ j7 t. N% J# s7 z) p, [5 _) m# G
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
$ }4 ~; o! z, B$ l1 [' w% w    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
$ g. w6 g$ |- }, ^, J    mcasp->regs->PFUNC      = 0;          // All MCASPs, @, N8 q& ~/ F& E$ r8 d
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 d2 y  C7 U/ D2 q6 i( U# O) C5 e7 ^( |
    mcasp->regs->DITCTL     = 0x00000000; // Not used
: _% f6 O( b$ Z3 h# ^! |' }    mcasp->regs->DLBCTL     = 0x00000000; // Not used( Q; m: j9 P& W% u( [
    mcasp->regs->AMUTE      = 0x00000000; // Not used
% ]; H1 E" K2 Q$ ~4 |9 e# b+ ]- t3 e. l/ B
/* Starting sections of the McASP*/2 L8 x- T) Z5 j6 w
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 ?1 i4 C) y; \7 \( R, J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
) p5 U1 H- F; u/ ]) j  ~) M0 Q    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, H0 A* w% R, [, [    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ n' R' j3 s, f- A+ n  t0 p
* e+ v& m  b# w. y  V# n1 r% t
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ) b$ T7 S, a' j9 M& f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 @8 t5 k2 X! }& @    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; , c) E& q3 ]# ?+ T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) x$ w( `" A& I: p/ n# b  n+ s3 O1 X+ K4 g6 R/ c
    mcasp->regs->XSTAT = 0x0000ffff; 0 w" I4 w: x, R
    mcasp->regs->RSTAT = 0x0000ffff; 1 \; W3 i# l& P6 D* b& T  c: t

5 U* ~6 c5 P4 Y" N' o    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% Y4 u1 |& z: i) e; @  q5 o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, \+ ^% g  p) `7 t2 [* d    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & I0 h: I  H+ H" [4 ?; X3 g! M  S8 l! s
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# I5 M# I) a# |4 C: h8 I
# l. P2 H- G" ?( M% [    /* Write a 0, so that no underrun occurs after releasing the state machine */
7 B* P) V) n' D; h9 e. Q( h! z    mcasp->regs->XBUF5 = 0;8 V8 L6 M1 T7 H; ^6 z8 ?$ v+ M8 |
    mcasp->regs->RBUF0 = 0;; K* F" E, H6 m6 S9 w
5 q8 j4 C" s- f$ M. I. g
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 w' y2 O) s( {* x) V) V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );8 f' ^5 k1 i; q9 F4 I0 z$ r$ ]
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # e+ n* X! t$ r5 e. g- _
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* E  J& Q6 Y7 y( X: P2 r+ {7 T+ ?% Z/ n
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # U  f5 s' \/ B4 u6 y$ V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) x, s- F+ V( d6 q    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 b4 s% {) S/ f9 V; b# s" y% V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );& W. d# L, F1 d5 K( U( E( E! I* N9 N
' s# R# A& g, t+ ^
    CSR = 0x0000;! e6 I6 t8 G7 w0 o
    INTC_INTMUX1 = 0x3d;
$ D. U/ x0 f4 @2 ]- O5 l+ v    ISTP = (unsigned int)vectors;" t' x6 N& e* B  K
    ICR = 0xFFF0;  0 p- g/ ?0 ?! V8 {: c9 b2 _; M
    IER |= 0x12;  
" i6 Y- v$ U5 y4 J& c2 o9 X1 {    CSR |= 0x01;  
& S0 G: Z( y  [. k7 B  K
- h% y' j0 H) L5 F
7 J' U" e7 @+ j9 I9 |
+ t3 U  w& P) ~# p" Z. J4 {还有就是两个输入输出函数:
3 k& l. I- J, D, H! U6 H% @void output_sample(Int32 out_data)3 c0 f, ~" W8 ]* b5 H
{( s  \! n$ ^0 u4 t) Y2 K8 L. {
  AIC31_data.uint = out_data;  
  I. z% B% B+ V( A' o" I  MCASP1_XBUF5_32BIT = AIC31_data.uint;; |! |' f4 o1 d- F6 J
}3 `1 P/ \8 J4 k' T! E: y: t3 z

: H0 ^; {  s, p# {Int32 input_sample(void)7 {9 B. C- H( R/ N% r
{  
1 ]4 ^$ X& @: ~& C  AIC31_data.uint = MCASP1_RBUF0_32BIT;
5 \' k2 x, G  N% R8 H  return (AIC31_data.uint);
. M; T  C; p( E5 j3 H" @% J0 r}% ~8 i$ W, G: C" T; _. E- j, \+ @
' v' u. X6 R! u

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




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