嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, Y0 I1 @4 i8 x% J( D/ b2 u' qmain文件:
3 g  ~  I% i# m$ Y% D6 rinterrupt void interrupt4(void)  
' O6 Y3 v5 {& ]5 H' A{6 b. `: Z6 Z, w+ }/ J$ V7 B+ \
  Uint32 sample;# _+ J. [: ~) R3 D" Y, ~$ P1 `) t

( M, h8 X  P7 r2 k1 D& u  sample = input_sample(); // read L + R samples from ADC
3 `; r: \5 n9 Q: a5 g7 y0 _  output_sample(sample);   // write L + R samples to DAC ! [# o, y* H- Z8 {  s( ?5 {
  return;
: }' d& {) x) _6 t$ G}
( w) T. o. e" D, S: K7 J: f1 J# E- p$ N
int main( void )3 Y- a2 N5 v; S4 q
{0 \/ W2 e& W9 U* [1 u5 ^5 D, s/ f) Y

: r: C* L3 B8 Y5 `: S$ \6 I4 j: a    /* Initialize BSL */  T. G$ V) W+ V4 ]) t# C( a; t
    EVMC6747_init( );# s+ I8 S4 D9 `
        /* Call evmc6747_intr function */
8 V  ?6 h5 |) A! S4 ~  a& E& ^    aic3106_init( );
: [' a( t$ Z% x# f4 E( k  W, \        while(1);
5 ~, V! v5 K& q}
+ x+ r. p9 G7 R- `, B, ?1 E( _+ Q

; m: C. l5 j. C' {: Laic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 r* o6 m" h: r( K
/* Initialize MCASP1 */
! g2 U- R8 J( b5 V* i4 a/ r, v; |    mcasp = &MCASP_MODULE_1;$ Q, y' V1 G" x$ c' Q  l1 H
    mcasp->regs->GBLCTL  = 0;       // Reset# P& r& W& s/ B' |- _( n( O
    mcasp->regs->RGBLCTL = 0;       // Reset RX8 d# D  E9 P% r% t9 C$ Z% k; y- p
    mcasp->regs->XGBLCTL = 0;       // Reset TX7 c+ x$ o8 J3 ]( b, p
    mcasp->regs->PWRDEMU = 1;       // Free-running
' O' e2 A; ~; d+ y   // configure McASP0 receive registers2 V% U1 F% Z% ~3 x2 E
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used, j4 j( q4 H, L8 a  S
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ d& S2 o% m4 C$ }
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word" c+ `! I* Z; d( J; F
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 v& Y% ~+ `' k0 x$ C. R
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)  T$ [& B. W* u$ T: s8 A
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1+ Y0 f1 m# H3 D5 d
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
; J; \+ Q  E3 _$ M5 B3 U! A    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 [$ p0 O5 @1 w! o

: C* J9 l0 Y5 J% y9 L1 N( |    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used5 W1 F/ c/ d5 {( q
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 ?; b$ Z$ g, w# N' J: L4 g8 U    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& o, w; n' ]: O
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-160 q6 M' v- Z5 m9 E' F  a% D# B3 i
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK6 Y; X% c" r' n& Y, Z3 }7 ^. ?
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
3 X$ w# O0 W- j: b  p2 |; k    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit# l3 |% t$ q6 j/ ]4 k
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( K" w$ o0 D: ^* d3 u
. a5 L. G; {9 w! n8 c5 k1 w    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN4 p$ I7 A6 @2 }3 h* o3 [
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT! p& @3 l& t' N7 q) m# T, G
    mcasp->regs->PFUNC      = 0;          // All MCASPs& n( A% l: ~: Q1 r4 t( O! N! P
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ V. ^) ^/ y) t! t; w$ N
+ H3 [& Q/ L, {* l2 M, J+ }
    mcasp->regs->DITCTL     = 0x00000000; // Not used* p* R9 g) c* e: _
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
  F0 c  f" Q& K+ \7 `* d$ c) K* i/ V    mcasp->regs->AMUTE      = 0x00000000; // Not used
0 N, j& `9 v" e) G3 Y! F3 A4 m  ^& N$ w; W
/* Starting sections of the McASP*/
5 C/ w4 J' x  x0 K    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: n% x' X7 W4 R6 @( X/ X    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
: V5 g) O7 z( O3 D+ e4 [7 Y    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; , w  {3 t% x& j- n
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 Y# S1 C; I* I
: P1 M$ t+ n* y, V    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 F$ j: Y) K4 D8 R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; e& f( L( ~* q9 f+ W. e6 ^    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: m  m1 m& j# A) i$ P: K* ^    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );- `9 g6 H( Q& J; f1 a
# ~" |1 Q; h0 G+ C9 v1 p" H- }
    mcasp->regs->XSTAT = 0x0000ffff;
2 n( D$ E0 t1 i; i    mcasp->regs->RSTAT = 0x0000ffff; ' T  {, a& {4 V3 H% A
; c2 [; H% u( f2 b
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;# t9 N. Z8 L) I2 \1 e9 n8 u
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );6 V  L9 p: ^$ O# B# W! ^8 I6 J
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ m8 }" v) \( I7 N. m    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ F/ k5 ]  Z* E
1 @& B1 D+ O9 ~5 Y* U$ \( w
    /* Write a 0, so that no underrun occurs after releasing the state machine */
. i4 [9 Y( k2 ]3 f, L! V  R7 w    mcasp->regs->XBUF5 = 0;' v1 B8 M% r" P4 j  h8 I, [5 c/ Z
    mcasp->regs->RBUF0 = 0;
& c& j8 Z$ ?$ z% w
! \! T- |' h+ @  K& w    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 ~. D# k* j3 b3 ?5 U    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% ]. V( |4 }; R$ H! `
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 {" S6 Z( w- y7 V6 w" x1 e% p' y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 r" S& A8 j" g1 i7 ?9 m. _: [# b" m+ V
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 2 E+ y" D& Q& C+ U; x2 O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# e' b) C# p# d5 M7 \  s    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 v! a& C1 s% |7 R
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 {  s. a: s# v# T8 x" {+ \2 \% I9 U- r; A
    CSR = 0x0000;
, }5 Y: T% q  C! G4 u9 A    INTC_INTMUX1 = 0x3d;# y" r5 U( `# c0 l+ T: b7 @- }1 B# E; l
    ISTP = (unsigned int)vectors;
' d& J. i8 H, y7 r& o    ICR = 0xFFF0;  
8 F: V: d$ o* D- d0 B, `    IER |= 0x12;  # X5 Z/ e. o; u  {8 b
    CSR |= 0x01;  
, w  y; m, W* n6 t* h0 R9 e; w7 r8 X( o2 }6 Q, @

" [/ `2 Y+ v$ N! r) w. |' i  W6 U  r# @% t$ a  F/ x1 h
还有就是两个输入输出函数:! c5 }3 J5 J. n% G1 m4 l0 J, o
void output_sample(Int32 out_data)1 u  z" c; J- u9 L% O9 u7 a
{7 L) J+ Z7 Q! |8 o6 ~) F1 b
  AIC31_data.uint = out_data;  
4 R8 K  U% p! ~: t  MCASP1_XBUF5_32BIT = AIC31_data.uint;7 \. j8 R. W0 h- `0 _5 L) d, p7 c8 }
}  C  o, f1 H* @- ~8 R8 T8 l5 N% {  [
$ O9 H2 }! _7 B7 Z7 B' a% `" m
Int32 input_sample(void)
% ~6 S, ]7 Q% w( H- T, U{  
5 m5 Z$ G. `4 k1 m4 c" u* ^+ x7 E" E  AIC31_data.uint = MCASP1_RBUF0_32BIT;
- B3 U, b. J% i* d. d0 V' F& i  return (AIC31_data.uint);8 F" ^7 ]+ M8 m" n
}" `- [/ L+ A; y5 `0 ]

- ~" K  h# V" L$ {. g" c* H
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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