嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:8 E; l' G1 Q( S+ X* l: E0 z
main文件:+ S/ h* w; {  u/ E, n1 I: ~( \
interrupt void interrupt4(void)  7 i$ e$ s+ e" ]" B. o" h; N. x
{
! C: B' q& ]) S8 h  Uint32 sample;; A0 t3 b! _- c5 y3 h5 [

, M7 q2 @* @: m, x  sample = input_sample(); // read L + R samples from ADC5 t7 L% A3 S2 g
  output_sample(sample);   // write L + R samples to DAC
" L4 M7 ?4 W! Q2 {. t  return;
. n1 b( B: p; `}
4 C4 v! _& I. S) M6 ]' J& t
* n3 X) O! _6 K1 ?# qint main( void )& k, G: _8 c6 E/ Q# r+ m2 f# l
{) q6 ?$ l* S! s$ E
: a0 l  g$ ~+ ^8 z* y
    /* Initialize BSL */$ K8 k: @* x- p* U
    EVMC6747_init( );
% _* {* J/ A4 q$ W        /* Call evmc6747_intr function */) [9 a; b& n" [$ `" e# T( h' k
    aic3106_init( );
  N" S* T' M" B2 ~: |& O* U9 |        while(1);
+ b9 [, v5 k2 J. y* k9 R}. v, c( d7 X7 n/ D, p  A9 m

- H8 R9 r) L9 y1 o, `1 x  E9 v
$ Z* g/ B& Q9 o# `- r: Waic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ n: W! g2 _! y0 C/* Initialize MCASP1 */1 e% `9 H6 A8 ~) A
    mcasp = &MCASP_MODULE_1;
% n$ u1 [) A1 w" u    mcasp->regs->GBLCTL  = 0;       // Reset
- R! g' q; Y+ H    mcasp->regs->RGBLCTL = 0;       // Reset RX# S" {6 b4 b* a3 i
    mcasp->regs->XGBLCTL = 0;       // Reset TX- p' A: `- }; x# p; O
    mcasp->regs->PWRDEMU = 1;       // Free-running
, u* l& P! c5 I3 T; s   // configure McASP0 receive registers) x- [& _* I. e
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
+ @" W# H2 \$ {4 f    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* W% @) X5 B* P" Z  h2 f( c    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# C+ }' G& ]+ Q/ J$ u4 b    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side), z2 z8 u# e) B4 n* n- E  k
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)) O; ~+ Y1 N* x& V
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1$ i4 i5 j$ d/ E# O
    mcasp->regs->RINTCTL    = 0x00000000; // Not used- f( b+ S" K0 M" p  g) w
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( }# F1 M, R4 I$ o& Y( l5 d# M
9 M. T" _8 A, u) b: i8 V+ ~( f    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used7 i, ?. \2 [7 ?; w9 C
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: L* H% F3 Y) `* e, W    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word7 ]. B" F! @* z( d
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 ^% s2 a% o- F- Z) d    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK% K# f- Z+ M1 Y
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
% J- f, N) u2 M# V/ L0 |    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
4 @: N9 |: _) y: `! G    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. Z6 X- T5 k0 G/ A( |% f1 v
& m7 B, k1 F% i1 O$ j
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
1 x4 D  C  k) P8 C& o1 M. D    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
% ?+ X7 M' b6 z" T' {& a    mcasp->regs->PFUNC      = 0;          // All MCASPs
9 ^- s- k# P" C8 W3 W0 b  e. P    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1" C  r8 |9 z3 i0 f: d, x9 O* u

# W) L5 [& e: D    mcasp->regs->DITCTL     = 0x00000000; // Not used8 T$ D$ B( q. \) S5 x" p
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
4 G$ j* ?9 M% s/ v/ f    mcasp->regs->AMUTE      = 0x00000000; // Not used: {1 U! H% D5 B( _& }( x2 l3 T3 K3 X
6 n8 R/ E: T2 ^$ x9 W% x1 N; G
/* Starting sections of the McASP*/7 z' f# t2 R, z! U5 ?* D! S
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; & y! j$ f5 v  |3 U% m; z* d! a8 B1 v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  9 |- k& }1 T3 |6 Z3 X2 b
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 }1 B, p8 i0 C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
8 ~) B0 c7 G& X  `% r$ C* i3 e4 Y* W+ S. a, `3 Q. B( M! |% \
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 g7 Y. O3 d7 X9 f+ L& w- e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );" T! D5 f+ ]  z+ F
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
9 g! Q5 P) X  p* V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );" V2 F$ ^! @5 n8 a3 h
: U7 r2 B; x1 B, C
    mcasp->regs->XSTAT = 0x0000ffff; 2 }# i: y& [* Q( C. [5 [
    mcasp->regs->RSTAT = 0x0000ffff; ' ]- v0 e" J* [7 g! a3 ~! F% S, D6 J9 Z" {

) Q# j6 {+ y/ w8 H% h    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 ~* Y# |& e7 d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 x- A3 Y& Z* ~0 x* i' {- y    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 3 c  {1 H  h4 e% N0 Y! l& C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; x( d& Z2 J' T2 F! @1 z) ^

) I( v4 [9 |' H! ]- @    /* Write a 0, so that no underrun occurs after releasing the state machine */  U) E. ^% [) r4 s& \
    mcasp->regs->XBUF5 = 0;
) N' E/ N! K2 `3 W1 g    mcasp->regs->RBUF0 = 0;
1 o0 x& D' Q8 l  O5 _: o5 Z4 D
' @$ [) ~# o" O" _  b# M( Y    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
. |( }" J5 U  S( E    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! ?1 s+ B; n+ x/ Y% L
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; % ^9 V9 o! H! d* d, G" ], O5 R
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );. e3 i1 v0 A1 U  q% `
3 l5 ~" f5 a7 o3 c  A
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , S1 V: S4 L; B  D0 @
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );  ^1 _, c4 H+ f1 F# C7 X0 c
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( g6 @! M& f. T  y) s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, W% {! B7 K' c
9 `: }8 N. {# ?( [$ [& Y; J7 ~
    CSR = 0x0000;
8 O1 r4 t2 P7 j    INTC_INTMUX1 = 0x3d;( a% H$ D% P4 V5 G' F
    ISTP = (unsigned int)vectors;
' l: x1 m+ B# F" E5 u    ICR = 0xFFF0;  
! H; X( \% G, U3 ^    IER |= 0x12;  % ]4 w/ ~) m& P$ {1 r! _$ t
    CSR |= 0x01;  
  U& Z9 j* w1 p! I+ X9 T5 e3 u+ G$ R) \/ K/ a# p
: ~' M# v6 e) G" a

  F4 P- }& {* l- E0 l; n, P: G还有就是两个输入输出函数:' L4 W- k. x3 C5 `8 v) d7 ^
void output_sample(Int32 out_data)$ M6 g1 _0 {% T/ B5 r" ~: M
{3 s* g) ], J& e3 v% f
  AIC31_data.uint = out_data;    ~  E( K2 u9 H4 J  c1 y3 }0 `! Q
  MCASP1_XBUF5_32BIT = AIC31_data.uint;: ]5 P: M0 i. a' }- D  |
}& N  R+ e! Y4 V
) \3 J8 N+ X7 v2 P# i" y) x7 i/ c& u0 f
Int32 input_sample(void)$ K2 S5 U$ C7 @$ q, _3 ^4 g3 s5 F
{  
- W0 L# c& V2 a+ r! k( W7 d* \  AIC31_data.uint = MCASP1_RBUF0_32BIT;% o/ C$ c" a, o" Z$ x
  return (AIC31_data.uint);
+ j: L  ^' @- E/ t- ~3 ]! F}
7 q+ D! K3 m& o' i4 W; f2 u
  x2 D  Y* u5 B' C) ?
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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