嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
/ U% @' A) L- S. W% o, _main文件:3 P" ?. p( P" z1 z: }0 M; R* l
interrupt void interrupt4(void)  6 W2 I3 q" _; f2 L. o8 v
{
6 i7 H' K% C7 C6 x  Uint32 sample;# ~1 L% N5 _2 g8 p8 Z: r

4 \1 W2 b: y7 g& I1 b* P  sample = input_sample(); // read L + R samples from ADC
' v1 O5 I  V0 z2 L& m7 U  output_sample(sample);   // write L + R samples to DAC 0 _4 j: x6 Y' R) _( F6 @7 i. u( u
  return;, q: g+ F) O: C0 k+ @
}- l# [' l3 l1 u# U

, q0 S* e% Y+ Y& w9 \' \. Wint main( void )* ?/ e- Y+ a0 ?) `
{, J% n8 J! V3 k9 g4 R. T1 d  O5 z2 Q$ y

: W2 W# S: a, p5 O$ B) P( E    /* Initialize BSL */' l: ?% t( r: m3 D
    EVMC6747_init( );
0 j' t- R- N% w( d* x3 f' n        /* Call evmc6747_intr function */
: J9 T! V! `3 ]; b% Y- [    aic3106_init( );2 R2 O, U' M5 k4 W4 P/ ~* ^
        while(1);4 v- y! V/ s# V, w/ K
}
5 m& Q  e) g8 O
' y4 s* n. R8 x  H0 n
6 i$ t1 J, u+ z6 q" Z# Z  caic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题! i( L6 D3 E# b6 C9 d) L! h
/* Initialize MCASP1 */, G7 g+ v- t+ E* O1 m
    mcasp = &MCASP_MODULE_1;! W1 d" t5 E# y3 H$ w6 g
    mcasp->regs->GBLCTL  = 0;       // Reset; b4 T3 M, y4 ?" I" T
    mcasp->regs->RGBLCTL = 0;       // Reset RX4 K: ~" N5 K5 x- p: D! N2 ~$ |; \
    mcasp->regs->XGBLCTL = 0;       // Reset TX
1 R1 n2 G2 F' I& S- i8 B    mcasp->regs->PWRDEMU = 1;       // Free-running
) G# z$ {6 W; F6 l6 K/ d   // configure McASP0 receive registers1 _5 \7 ?+ E7 o6 d+ |) @5 Z0 p1 }! _/ i
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
$ b# G; b+ a' ]0 O: j    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ K" v- A& v/ m' h" Y9 w0 k6 r    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word% t, i5 G* h; ?4 _& ^/ S, q) [2 |
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# @, n6 T1 E/ j' Q  i    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)! E/ T% @6 {( l6 p& q) Q' G& f
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
; ?- B" u2 y* k9 c- i% f/ h; H    mcasp->regs->RINTCTL    = 0x00000000; // Not used* x- ]  V6 a9 @  C% f' {0 W# T" \
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ c0 x! Z9 t6 G* Z' L$ ]2 _0 `$ w1 O* f; T0 H7 k3 F
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used" k' k! g/ i) N7 i
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' a& S% A6 }- P& o% A# m4 t$ B    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 g0 H1 f4 ]1 I* A3 S2 |    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 }( I4 N1 N2 S) L$ V8 S
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
) C) f/ W5 L% R) s2 _    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
! `2 W' U! L3 i# R1 n    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit& r2 e! |: b5 d1 y- |6 [0 }
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, B2 I) f, ^7 x) c5 K. g

3 B( b0 ?$ B, o    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
. V3 S4 C8 e1 F- L8 ]$ B5 n    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
1 T; \+ u0 e0 A    mcasp->regs->PFUNC      = 0;          // All MCASPs
' U/ a$ M# t% l# f, s' Z" \2 Z    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" r0 o' U: p% X' }
2 ^9 {$ S! N  h+ ^0 p6 o3 G    mcasp->regs->DITCTL     = 0x00000000; // Not used  L' h. v1 L+ N9 ~; G" T
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
$ Z' R! C& ?* Q+ z2 }- P    mcasp->regs->AMUTE      = 0x00000000; // Not used: ~4 Q8 T# R. i3 B' h
% s4 A( W# K7 n4 Y, g+ _0 v
/* Starting sections of the McASP*/
' x& s7 j) S! m8 N    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ) @5 y% `$ l% K' j8 m5 o) E
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  : _& l) _3 h* F2 w
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # i% x4 B* v" y, b2 _% K) r
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- V' @# ~; y" {. s* `, Q/ I' |9 j$ R& L' p* _. b
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
+ G0 F* v" r8 {' q# N5 Z$ o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 @7 q. n% a- e4 _5 {
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ' _9 ~& s; i6 y. p; i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) J& y$ o: T- J4 P% |2 _/ [. l% t/ R
, {3 h9 @8 X2 n7 R* e2 S
    mcasp->regs->XSTAT = 0x0000ffff; 4 j& ?8 P4 T+ h3 e3 b
    mcasp->regs->RSTAT = 0x0000ffff;
2 s3 D6 Q  [( K1 L- J. x( B/ v" A, l
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% q% p1 \1 K$ ?, R) L& z    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% n6 R; Y; `" ~0 s+ e/ U5 i    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 4 |8 ~6 W7 F3 ?- N% @4 ]9 Y1 \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );: G- W) H. `: |  C. }  c
# l: y! ^! O' Z1 B; \8 A% ]
    /* Write a 0, so that no underrun occurs after releasing the state machine */6 q, C, j( w% {$ {) G, \
    mcasp->regs->XBUF5 = 0;
' p6 Y; Z; Q1 q7 J& }    mcasp->regs->RBUF0 = 0;4 c- ?9 U+ s! \, P
3 v( e# E: B7 A) s- S) T( |- K
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " x6 S4 T1 r) V/ o8 f  |! G2 d; _
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 x* o: |& g# ]9 ~7 W% I0 f9 f. f    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ! }% J7 y" B' N' s! _: m8 @! o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );+ |( q* ?5 o8 `0 \9 z& g& v
- G1 b# M) \7 [) L! \
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 {& k( h  b  G    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
  i8 ]6 K, x" c$ Y, E+ B3 P) Q% I    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 l5 E3 [8 G& h: I) E2 [    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# V" O, Y( |' d; H9 |/ d$ K

" B0 ~7 E! ?' d/ `" j4 `) W2 q& H    CSR = 0x0000;
) L2 |! z6 K/ o6 P0 Z0 F    INTC_INTMUX1 = 0x3d;
" |' i+ Z% n# v    ISTP = (unsigned int)vectors;
+ h- {1 l1 F" }; L$ R0 I    ICR = 0xFFF0;  
2 o+ Z+ y4 G: r8 h3 b6 J    IER |= 0x12;  
* e* M! K# D3 f5 W+ u! v    CSR |= 0x01;  ; ^1 Y. F$ t3 i# {& Z( `+ U2 q

1 g; N+ K3 W, ^* ^* Q! q1 v! ]+ r& A- u  t* R6 u
+ X0 ?6 f; k8 K% o6 x* p- j
还有就是两个输入输出函数:
+ {+ E/ O) r& }void output_sample(Int32 out_data)7 h. i! g/ f7 }/ X' f
{
. O" j# C( E' M  _& o" m  AIC31_data.uint = out_data;  1 I0 R- ^0 g9 \" q* T& R" Z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 Q: d! G2 |0 b8 J# ~: n! X* O% A}
" B- {" M: s" @$ x( k! E5 H/ l/ @) U9 ]
Int32 input_sample(void). c3 ~; r( T  s: P0 v2 s
{  ; Y! G8 M4 x) v6 y$ p, b/ |" s
  AIC31_data.uint = MCASP1_RBUF0_32BIT;/ J7 m/ `4 N+ a1 |9 l3 p
  return (AIC31_data.uint);! U# q- ]& D  L
}
8 I9 Y$ I5 E/ i  y8 @- T: O, |1 P% [7 e

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




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