嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! _" ~" C/ d: z7 v2 I1 _' rmain文件:
; [1 z7 W% C4 d# c) u# sinterrupt void interrupt4(void)  ) W# b9 L+ K5 O( f- S2 |3 N
{$ [7 y0 Y; I( f8 ?8 h4 V
  Uint32 sample;
# E# i6 ?: T6 ^0 }& u8 ]
% g; V  J' c- i1 o- G  sample = input_sample(); // read L + R samples from ADC
( r2 M2 l+ H. n9 Z2 {  output_sample(sample);   // write L + R samples to DAC # s7 O. t8 u- y5 c" I  T
  return;
+ T# R4 q% T# E! G}
3 }1 C# ^9 g+ {8 m7 M- a* W
9 _- y/ p0 s. J/ V; Lint main( void )
: x8 X1 h+ Q0 A7 Q( Y2 j3 e" c: H{) t- w4 s4 ~) e" t& V6 t% G

' r- _1 x; J+ K9 w    /* Initialize BSL */
; g7 O5 z$ b7 M& R    EVMC6747_init( );
* J  n5 [9 x" R$ C5 X        /* Call evmc6747_intr function */
3 Y7 v- t5 G2 z$ }5 m$ P    aic3106_init( );8 ?. R* H! t  K7 i. y6 i
        while(1);! c5 F  K) X" W+ [* j9 X4 ]& {- ^
}
0 n7 {# x; {; C
! k/ D) _5 K# a/ h4 M& f7 a3 L4 @9 u: U( [
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 V0 S' N' j5 k' V, p0 w" H/* Initialize MCASP1 */
/ Y$ E4 z) }: J+ l) S! F  e$ G) a    mcasp = &MCASP_MODULE_1;) Q4 V0 h" K  X' s
    mcasp->regs->GBLCTL  = 0;       // Reset
4 Q# d; L0 e6 b( |" @9 P' F+ m5 [    mcasp->regs->RGBLCTL = 0;       // Reset RX# U% E" Q- ]! y  t% v/ A& m& w
    mcasp->regs->XGBLCTL = 0;       // Reset TX
9 e/ a# s+ M8 ?# T0 `0 o4 s    mcasp->regs->PWRDEMU = 1;       // Free-running4 O6 R1 @( Z; N( F! n3 v
   // configure McASP0 receive registers7 k. Q' K4 n( w0 {: d
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
4 \" `1 w5 g9 r+ ^' x; E% ]    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: _1 v2 A- P% u$ n4 \% z# X, c    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word  s' q8 p( p8 `. G3 H- Z4 e
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, b+ r& G) V4 d    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)" ?, Y" Q: X. f# ?
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 @) F8 A; |6 l& s* F6 Q+ u6 ~$ w    mcasp->regs->RINTCTL    = 0x00000000; // Not used
; @( V- }! _# M% h3 ?    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 y! `! n# Y5 B( Z  D6 i

6 U8 U! j0 P6 P# `' ~# W0 h    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used( [9 m6 K7 h- G* m6 I
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: b0 X# m2 _2 J! N. _, a
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word1 l: S" }3 d9 P4 {: x: C0 x
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-167 @' e0 n! C' E1 |% Y
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK: o( W& j* v0 d0 N6 n5 A
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1% u2 J( U0 r# B: ~) S# T
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
* I- Z* T5 V; n    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; i2 v2 x: F) b+ Q3 t
9 W% b  O( P6 \$ {# u' g
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN& j) A! ?3 i1 J$ B, l4 O
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT$ @! O! R6 V# C2 e1 e
    mcasp->regs->PFUNC      = 0;          // All MCASPs4 {8 i  V" a; l0 A7 C& t
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 n: l# ?/ H3 a7 ]- |- v$ I. G/ N' i& T5 P9 C& P) Z4 D
    mcasp->regs->DITCTL     = 0x00000000; // Not used
# N' Q. f1 g( p/ x/ _    mcasp->regs->DLBCTL     = 0x00000000; // Not used1 _; p2 D+ y- ^4 [
    mcasp->regs->AMUTE      = 0x00000000; // Not used
1 j8 v* k4 Z  J' T  R: a+ b! P  H7 J  R
/* Starting sections of the McASP*/
) Q2 T* w- J9 d# A1 t0 e; H4 E    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , {$ n2 O  E" @4 Y/ d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
+ y# X% x6 D" f  U0 M+ z2 E) C7 s    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; , Y1 T  ^  J5 I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ K9 a5 }! `: u( m
$ M" L( u3 D2 T( J9 ?& P7 ^    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# ?! s& y6 U1 N- @6 l3 H- |" @    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
# |8 L1 B) H# ~4 ]6 H    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( }  z, F2 [) ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
2 s, O6 e5 T* A! |& p6 J& O+ W) l; Y1 B9 D7 e! n+ H; v" X
    mcasp->regs->XSTAT = 0x0000ffff; 4 Y/ u0 O9 j, G' P: q* d1 C
    mcasp->regs->RSTAT = 0x0000ffff;
1 _& |& C4 F& L5 P. E
. M5 |5 g( O' J" x! o; Y% h    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;7 `& U' B# L# O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );2 P' q7 Z5 t) W0 A2 Y, L( }' Y1 Y
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& m4 D% D! N8 q/ B4 g0 x( r    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 h9 j2 v8 D4 n! @4 X. E9 |) i2 i' t2 y$ M  ?& Y+ x
    /* Write a 0, so that no underrun occurs after releasing the state machine */
! ^( t; x$ a' @! P4 `1 o: T) n3 ^$ t    mcasp->regs->XBUF5 = 0;5 w! L7 U7 b+ _' M
    mcasp->regs->RBUF0 = 0;
- i- Z& g6 ^) {( X+ ]( R& o
; e5 f) Q% }1 c" g( Y) [    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 M! m* Z3 k9 w& N: m/ T2 L    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );, k4 `/ Y8 Q; J2 O; |* ~
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : ?; e2 T8 }6 o% k7 W& U* E! V0 W
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 Y5 X$ e5 ]* N- g
* V+ @. J9 O3 g' c) Y, M    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 x& r- j: C& g  Z9 q# O7 R% P    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% Y) k4 V$ `( y" i
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
. A( w5 X- `) J  B1 E    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- J1 v/ z' F; L; F3 j; _. j

/ ^* u, J! r5 a7 p    CSR = 0x0000;/ o; e) r* p/ G+ [+ ~
    INTC_INTMUX1 = 0x3d;) i4 _/ u- Q, ], [
    ISTP = (unsigned int)vectors;
  _) u1 u1 P, `2 R* K& p8 O' Z    ICR = 0xFFF0;  + `, B% F! i; Q
    IER |= 0x12;  
+ ~0 |* F' |) y* v8 ]+ O, `    CSR |= 0x01;  " Q# c  h3 _- a8 }! U, P
  v( ~* s8 a- t0 w' W6 E

- c( x$ X% d* J8 j# r
) C) B9 e5 m& P; r) P: i* E8 s还有就是两个输入输出函数:
1 J! }( K8 U& X5 \/ {  ]void output_sample(Int32 out_data)% z& k  V: k6 {- ~4 d  l* a' K# i
{
& C( g: R; [& W" g. Z  AIC31_data.uint = out_data;  " l3 ?4 \; Z7 O4 l
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
, y" r9 U& j: N0 S# g- @: K}
, T. y# h+ c' U' _  s  E' H/ U9 M& R3 p7 O9 V
Int32 input_sample(void)  w6 {8 z( \3 a0 R  M; f
{  
( r. j9 w0 N( C9 S0 D  AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 e+ \# J5 P2 u# z# V  return (AIC31_data.uint);/ @# O- Q; ]1 X8 e8 k
}
) t" M# W  k# u3 n& k" B9 ?/ L  }1 R' S, S

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




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