嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:  r% L6 w2 \4 E9 v! F
main文件:; G7 P0 f, Y$ Y# q0 U
interrupt void interrupt4(void)  
  g; v! m& s& r8 D( x% e{
: S$ `+ u$ c3 s, y( O/ \4 i# R5 [  Uint32 sample;
& c! l/ `) e5 P. C+ H
  \/ Z" n- f! u) O  sample = input_sample(); // read L + R samples from ADC
+ V' X+ p; X$ x  q$ A. F  output_sample(sample);   // write L + R samples to DAC " p) w" v$ p: X( Z2 ?
  return;
; C( S2 r+ B2 G+ E: I7 u}! Z, ?2 U" }) U9 O8 o
, V3 \+ K# i/ H
int main( void )4 f, j+ [9 ]! D# \5 x
{7 _3 E* B2 K# V& Q/ B
, R! g5 j3 b3 z
    /* Initialize BSL */
) N; R7 O; ?" Z' ]* f# r/ G    EVMC6747_init( );: [& }4 |% P& n$ D, A: u
        /* Call evmc6747_intr function */
/ F. ^9 B( l9 D    aic3106_init( );
% L8 E: F4 T" A2 b0 Z3 p5 p        while(1);( y5 S* t7 ]8 d* X6 z# m$ m
}% f+ ?5 ^  z; T; d, a
8 J3 |& V: Z" M' i
3 `7 q' D; z* K: M
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
  `+ \1 z5 N& E& c3 I/* Initialize MCASP1 */
3 }  A# \0 [5 W0 G    mcasp = &MCASP_MODULE_1;
, U9 u9 x1 L7 B2 z    mcasp->regs->GBLCTL  = 0;       // Reset
) F2 ~3 q+ H" K/ _/ {    mcasp->regs->RGBLCTL = 0;       // Reset RX* s" L# G7 t" ]" r7 E
    mcasp->regs->XGBLCTL = 0;       // Reset TX+ I- _4 e: @; K  k+ I8 f7 h7 p
    mcasp->regs->PWRDEMU = 1;       // Free-running
8 \! Q/ u8 @4 `& m   // configure McASP0 receive registers* U9 P4 L/ ~  \  Q: f& V  n: d% }
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used) l( D& s5 o/ K
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" k; R. |$ {/ O6 q    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word" G! P; c( z' z+ Y( G
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 U* D" ?  c6 T, }0 m    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)9 z- I, N( r5 x
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,15 a; x* j: }2 z+ Q' A
    mcasp->regs->RINTCTL    = 0x00000000; // Not used6 i2 J* z% R, A: ]
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 L" l  K( B0 k, o- b4 W' @
# V. U1 e$ z% p0 y: P; n
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
4 g6 X+ `& q2 h* v    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 B" P! q2 R/ H3 Q- e
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
  e; s9 g$ x8 O' Y. p0 P    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
6 h6 P  @+ j  [4 R  B    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
3 m, u, D7 O3 E, w* \$ L- n! `    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
: s# e$ H) ~" S: P# i! M0 @    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit4 N4 ]. B0 G* Y$ p) F
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. f' F5 h. G2 @8 a& T! S

: A/ V: \: A, P# K) I: ^" z    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN8 V. C8 ]& T( N/ ~5 J
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
( ]9 b; o% _) ^    mcasp->regs->PFUNC      = 0;          // All MCASPs
9 G; U2 b) C2 \: l+ j1 W$ q+ y+ Z0 P7 l    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX19 E  n% Q! ?" g" {; `, }% G0 N

8 p6 r  S3 W; k2 }, Q    mcasp->regs->DITCTL     = 0x00000000; // Not used: F. W. Q% z2 @: I
    mcasp->regs->DLBCTL     = 0x00000000; // Not used5 z( I+ N' P" k" @7 ]
    mcasp->regs->AMUTE      = 0x00000000; // Not used: B( \/ l  z7 |( {+ I9 U- p0 y

+ b8 }! q8 @" e0 u' X% _- m/* Starting sections of the McASP*/9 N9 Z1 i: c, K/ R- x
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ v/ N. l8 Y& n  B* ^6 M6 ]    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  1 s- E. g7 C9 ~+ J' K" \% n% G
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 b+ F) }! `; A5 c" d7 }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );% D2 e/ ]  \  k  S& t! o

2 e, k) F4 u9 _# K2 d! p    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ |4 n9 q7 F) h: o! n2 g3 Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" Y" M& a* i# f1 y    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 {+ k1 ?. e( x    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( X) [1 X+ B! `) e
' f: {2 Y7 Q0 U6 X" I    mcasp->regs->XSTAT = 0x0000ffff; 7 d$ [$ d. u+ C7 s
    mcasp->regs->RSTAT = 0x0000ffff;
8 v) r8 D! G" g7 S" \( A! u, d2 ?. x8 Z# b
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 R! d! `  o) C' g$ z. Y- P2 t. L
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
' F% V, Q. Y' ^; h: Q    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; : B" s7 ~$ e& W& Q! L3 R' ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% \9 m, z+ Z  q9 I1 L

& s% n; s7 l8 t7 Y    /* Write a 0, so that no underrun occurs after releasing the state machine */# a& h; Y' x! N$ ^3 w
    mcasp->regs->XBUF5 = 0;
1 N3 f: ]7 e6 D! F! @) [/ v    mcasp->regs->RBUF0 = 0;- v* S: A2 h1 W3 v/ I1 R6 Q7 x
: w/ @! c7 \8 g" y5 ]' }0 h5 _7 p( P
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 m" @, W/ S3 v( A! B$ N4 g( v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );9 t  \! y  m. J4 w# a9 d( j
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; K  Y' l/ X) W; Y* ]7 Z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. m" b- Z3 n. ~8 w* l% {% w, B" q7 r" Z" B# g
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - }1 C. _5 {7 n8 i8 {# M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 y! ^+ D8 \8 m5 T+ j& |    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
% l6 E& S. v$ Z* I- M    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, i  a6 K) `" A) ~7 K0 h
) b/ N5 |  L) w0 \/ E% f" P7 @& x    CSR = 0x0000;+ v8 W6 k: R& i! r4 C9 A& x
    INTC_INTMUX1 = 0x3d;& e9 v, x4 s4 n" b2 ^+ G$ R7 \$ o
    ISTP = (unsigned int)vectors;
5 A. f$ M" g9 D2 t/ J+ e% E4 c    ICR = 0xFFF0;  . l) L1 C2 n/ h5 ^
    IER |= 0x12;  1 u5 U( }7 W7 L: c/ C: E3 y
    CSR |= 0x01;  
' |5 Z* W' U* G6 R5 M2 L- T5 K2 R8 e: ]

* h) E5 c! q  V* z1 z' `  N  y5 H" a9 w# [) _! O/ w
还有就是两个输入输出函数:
/ d8 h1 L6 K7 q8 z+ ^- ?+ Vvoid output_sample(Int32 out_data)2 A: E( c% ]7 C" u& `! H
{
2 C+ v4 T% n5 s2 U  AIC31_data.uint = out_data;  
: B5 C" F: [" ^0 }2 f0 h  MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 _  E+ R* b6 ~}* \5 `% K1 `( K% q! \, h4 F* J

: D, x0 Q5 j7 k% D( U/ s* V2 MInt32 input_sample(void)! G6 x- B3 |4 ~" x8 }* l/ D& D
{  
: h8 Q- U+ V. N. a5 n* w4 A  AIC31_data.uint = MCASP1_RBUF0_32BIT;' C4 q4 r. G  V3 h) l; L( w7 M
  return (AIC31_data.uint);3 {2 g) U* M0 f* o' Q
}) `1 A" k" M' k0 H# D1 `
( R% p5 Z3 t/ ~* R$ G8 [5 ?

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




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