嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% D3 t7 p3 J( v, t# z/ U' lmain文件:! C, i8 I9 ~2 [
interrupt void interrupt4(void)  ' S8 X' o7 M+ {6 G7 ?# U' e! b+ g
{! a- n- V( l* W
  Uint32 sample;$ x. b2 z2 L- z7 _3 f

' @1 e( r4 ?# Y' k" B9 S  v  sample = input_sample(); // read L + R samples from ADC
2 o' S+ E6 S# `- j- K; v$ W1 h2 a  output_sample(sample);   // write L + R samples to DAC ! i, ]6 _0 H& b. h1 S2 Y& D; f: p
  return;
4 w) M4 y7 N( {}8 t/ H' ~- W- ^2 u% l/ E, x  p

  a/ X, v- T5 p: Zint main( void )
' z( W$ g. X& r6 q% x; d9 y7 X" `{
  p  Z: y- o) g( [) g) H
& Q5 _' N6 ~7 S, p$ i  s    /* Initialize BSL */$ Q# h' }' E% B  B/ K
    EVMC6747_init( );
& a: s, i' p" M7 k4 l& Q/ o" K9 }  b6 `        /* Call evmc6747_intr function */4 ^& a8 x" I& U' {  j
    aic3106_init( );% u# t+ F2 u! B
        while(1);4 ^$ c4 @  J' s4 A" y) g+ K
}
6 C; {  b6 d& L8 {' O$ W; n4 a1 p- G) G6 |  |3 Q. \0 p, W5 ]

  @2 N/ q2 ~+ Zaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( W9 ~2 q2 h( {3 R
/* Initialize MCASP1 */2 k5 p, s, Q! A: Y
    mcasp = &MCASP_MODULE_1;
4 ^1 C5 Z- r: \5 B3 A    mcasp->regs->GBLCTL  = 0;       // Reset+ M  ]) s4 T8 n1 y! L0 Z' z
    mcasp->regs->RGBLCTL = 0;       // Reset RX
! i6 s# ~3 a+ [    mcasp->regs->XGBLCTL = 0;       // Reset TX' F& F; D+ V" ~4 Y, p$ d
    mcasp->regs->PWRDEMU = 1;       // Free-running
+ H) L4 h& I& D" N4 W8 \   // configure McASP0 receive registers! ^5 T8 a' q/ ]$ B; s3 t8 U4 N
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
4 P( F7 P8 o# \* g" I/ H# v    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& l2 T" B. Q! Q& _0 L
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word7 W1 w* ?! k1 N+ O6 q! B
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 H$ ~! P, K! u6 C
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)7 U7 x/ m; r0 X9 o0 C- B
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,12 r. e! V8 X' k. t) w# k
    mcasp->regs->RINTCTL    = 0x00000000; // Not used. g9 _0 @1 A9 S% F3 [) J' l
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, x0 d" e" N% r8 G+ I& _( b( i5 U1 x9 C  B0 W& ^0 r( w2 B4 J
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used2 k- g# m- ]0 }& M
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. y% w, D6 }1 {+ f1 J' S& T    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 g( B. _  K. U1 C    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 U6 a$ [$ X! p* B* e
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
# c/ |. p1 b3 @$ z$ B& o; z    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
6 r  d& c8 f1 [  n: l" I; ]% B    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
3 |! C  G) p% \; U4 b    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" G% ^# ?: g; }& F
: w$ |6 J$ O1 r% H; S: }4 E
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
( O' [% K! c$ V    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
' r3 t, J" x9 x/ t" O7 O& s    mcasp->regs->PFUNC      = 0;          // All MCASPs* S% i' R8 {( D; R/ C3 o& {7 h
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
) b$ w. I  i- M( D, G9 E
4 ^5 r2 P: z% b) Q1 X/ ^( `/ z    mcasp->regs->DITCTL     = 0x00000000; // Not used  r# G6 T3 h4 |5 |& \
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
' e: `" \: U) S  q0 U    mcasp->regs->AMUTE      = 0x00000000; // Not used
; ?# ?4 }* {9 M
7 ~* s9 o$ {0 N- V8 {/* Starting sections of the McASP*/  S# @4 k  D0 J9 h
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* c" d' @$ z& j# |9 T( D    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
, e' H8 q7 q* y/ s6 }3 P- b# i$ O    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ; @: x# `6 b7 ]6 I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 X9 ~. L4 C$ I2 C7 i
5 K* v3 p) I% P& s3 S
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 4 f; E4 P4 G$ G7 [* Q# t4 V* @
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );* t8 v/ }; n; N' }! x  F% v7 u
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' G; E% u; V2 |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 W+ Q% J7 e! T; o( m: Q! A
% l4 _' q. _4 |7 b6 h    mcasp->regs->XSTAT = 0x0000ffff;
# C3 j& I0 _; ]0 B6 Q0 }    mcasp->regs->RSTAT = 0x0000ffff; 7 R/ G2 E' H1 @2 Z8 n/ V
- h( M! U3 j3 K+ t% h- a: j
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;7 L* t$ K2 g& v1 k( B
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ ~: |' v+ Z& ~/ _) F2 w8 n    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;   B, {; r7 B5 F' x, {* d4 u% C, B9 r
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% A" A/ I: a" J9 R3 y! |7 ^" ]$ F8 O# w
: e- J: p0 u: `3 U) X2 I
    /* Write a 0, so that no underrun occurs after releasing the state machine */
+ @; N) v: {4 I* S, m  s8 I- |    mcasp->regs->XBUF5 = 0;
, _( D2 L& V% S    mcasp->regs->RBUF0 = 0;" D2 M! A: z5 k% Q
. R) e0 K) }8 d* k6 F
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
' J. ^' s0 H! Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" G) X7 B6 G( k, k2 t
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 x! L& c( Z% K  U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ g/ @1 b7 ^$ p4 [# P
+ l) f/ E1 B+ w! [( y2 j    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- p' H) t$ b+ B! K& K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% ~; V+ x0 k* t$ |8 v; L0 Z    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 O0 p* a1 j. k& z$ g6 f5 ~; j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );3 h" h) ?+ }/ ]. L; K, U
  T) }9 u5 b3 ~% h4 d3 A. W
    CSR = 0x0000;
" c, r: p/ j4 K8 o0 f    INTC_INTMUX1 = 0x3d;
/ ^  J  W- O* U; k5 S$ }    ISTP = (unsigned int)vectors;0 e& z6 B! o+ e, R6 D
    ICR = 0xFFF0;  1 H, S4 O- L5 f$ K& E( B
    IER |= 0x12;  
* v% H9 {" ]& `" M, A' i6 ?    CSR |= 0x01;  + d1 `% q$ z/ f! l2 E2 F5 P! b
2 P- ~! n$ Z# ~
( x. r) Z( ~; x, ^6 B5 n6 {9 P

5 v2 t1 a) C3 P3 [2 T5 a0 E, V还有就是两个输入输出函数:
( h' S( G3 F" I6 B/ yvoid output_sample(Int32 out_data)8 K5 }# U# \) B
{
) H3 F% M7 f' M/ P0 l  AIC31_data.uint = out_data;  ! Q: A, x, Z  b2 _1 D% r
  MCASP1_XBUF5_32BIT = AIC31_data.uint;# L" G( x9 p" b2 ~& z
}( E! v$ y) Z7 O
% T$ g8 `- p1 c3 j# `
Int32 input_sample(void)
( ~3 |# o! o6 ?$ L* g{  8 K3 `! s, V; F5 {9 F2 _8 Q
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
  I5 [' O% f7 q2 r  t! t  return (AIC31_data.uint);
# c% ~2 t6 Q8 {0 Y" L0 Q}
9 ]' P9 n! m- A1 }0 _8 ^6 E0 u/ a$ n. d/ x) ^* O1 E$ j. A3 G9 c

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




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