嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% |) N$ _) W8 `* E( E8 M8 Jmain文件:
# a$ g7 B. p* iinterrupt void interrupt4(void)  # D- s! ?. J, C" L# L# ^! d
{# V6 S) v  P: e. R3 D
  Uint32 sample;3 |+ p& x& R5 [. ?
# h0 @/ }# k1 {2 z: W: G1 b% m
  sample = input_sample(); // read L + R samples from ADC
3 U. f' j) f! ?4 _; }. F  output_sample(sample);   // write L + R samples to DAC
% {* \7 X3 w* C( v3 `; q  return;
, {/ G+ _- _5 J% V8 F}3 B8 @2 Q+ X7 P/ s5 h
6 _  X( a2 Z% V# r/ b
int main( void )4 P& |7 b/ t# i7 ~, |
{
# X, O1 h9 F9 y  Y2 }7 X2 F+ M0 G; \6 w3 a" o5 i
    /* Initialize BSL */$ B) P$ \! r' f& z
    EVMC6747_init( );
$ n, \' c6 @+ _+ E( J        /* Call evmc6747_intr function */
# P6 i3 X; J# v2 T2 h9 B1 x" Q    aic3106_init( );6 M3 E% z: X. l" B. B
        while(1);5 a8 H9 y" t% Z% b
}: C( J9 O6 }& `
$ c$ j2 Y$ e1 q
, @; E# X; {* ~8 V' _) G
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- m+ \" `, t8 V
/* Initialize MCASP1 */
3 n) r/ p( ?8 t- s7 q6 ]    mcasp = &MCASP_MODULE_1;
6 \( ~- `5 f' o: Z$ u5 N6 Q* H    mcasp->regs->GBLCTL  = 0;       // Reset
  j6 d. Q1 h8 H( F9 f9 M4 i  M    mcasp->regs->RGBLCTL = 0;       // Reset RX6 i2 ~& X# W( p  \5 M2 p) v* t
    mcasp->regs->XGBLCTL = 0;       // Reset TX. C$ W: F. j  u# G
    mcasp->regs->PWRDEMU = 1;       // Free-running
; ^1 S2 G( J, ^3 s! \0 z   // configure McASP0 receive registers
( k  u9 l( b& @% U. ]: M  H; \    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used! v- r6 z, A  w" V* ?: P- K
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# t+ J! n& R) M: C4 \3 A8 b, d, ?, X
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
- T- d1 [# j4 H    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 g. f; Z9 r/ F
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)% B; O1 U6 s' w3 Z( R  Z9 A
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1+ B& L: z+ L) U, C9 q
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
1 \) A# P& J8 B# W- p* m, ^+ `2 Y    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 P5 J: I" }4 K! c9 M6 U, T

: q5 ~$ ~5 l" K/ O$ ]: l, o' M* R8 o    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used6 g7 _/ j# x! Y0 I: f
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 |6 l/ Q9 W% \, Z/ C4 P
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& n+ t8 [! L: ]& j1 M& d
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' {  @& @9 F' J1 {4 r9 w    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
. {! z6 B. ~" T5 Q    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
3 ^  w: A6 x! ?    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit, \) M* C, G* q/ u
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, j7 s' u3 l3 e! l# t( V% \6 V

' A( `+ n# n7 }/ r- ^    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
8 u5 U) X$ h. x    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT7 J2 {6 G8 O3 A6 C6 g0 K! M
    mcasp->regs->PFUNC      = 0;          // All MCASPs. m" [. N( e- R3 y8 \/ S# y  q
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 `8 ?; ?8 E  m8 R6 h% h6 A3 U2 n* }# ^9 V" W& Y
    mcasp->regs->DITCTL     = 0x00000000; // Not used
% |1 F0 [/ u: q! D6 m/ P8 U    mcasp->regs->DLBCTL     = 0x00000000; // Not used+ l* {6 b- h- @3 w, _5 J
    mcasp->regs->AMUTE      = 0x00000000; // Not used- x. g7 ?" \) r+ [, j

5 d2 ?8 g9 ]* }) t/* Starting sections of the McASP*/
" x, {$ _% b: j9 N    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , Y, r$ I' d) @) E5 ~* h& A  ~
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
7 w1 w) W% V3 ~7 O( {    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* _" L3 T1 q# G, u  M5 G! r  W& b    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& y7 _, I. u. P  E8 O: t& y( n" o& ]
# }5 P5 W1 Q4 e+ Q! J    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ b* L+ O8 V- I. d! x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 n3 i, P" ^' W; ^7 c% V; y8 Q
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" \2 o( _) w' Y' y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 a( N5 y1 O/ o/ o1 j# ^: E: g1 W. W2 d+ |8 _
    mcasp->regs->XSTAT = 0x0000ffff; 9 H2 R* t' U! l
    mcasp->regs->RSTAT = 0x0000ffff; / L  f6 h9 S1 |' O2 Z# a- `
2 r8 \* p' p9 z* N7 N0 l' `
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;' v5 u! a; H) q/ W* p5 I7 r$ x; Z5 d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );! b* y4 K+ A: z. ^- [/ }/ D+ T" ]6 l
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & q+ i) }2 S# I- {, k  w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ P9 K, z) U" Q* D0 W

4 {" {2 n' P' j    /* Write a 0, so that no underrun occurs after releasing the state machine */$ l' f& R: r' ^  F9 Z7 d; j$ ?. ^
    mcasp->regs->XBUF5 = 0;
" o& {- X! Z, f8 Y    mcasp->regs->RBUF0 = 0;
  I* @5 z7 |" M$ }2 X. w) E6 _$ s; U; w( `- T  Q! I
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 E, O6 A8 |) g! @7 {
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );4 g2 |- b% O8 d, B. ?2 O. e# ]) J
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
& Q" `7 _8 l: ^8 q; X( `- H    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );8 }, n3 S3 O( J+ r! O2 c+ m1 T

; B) z% M  f. n+ C+ L4 w4 v5 H/ i    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 R* ?, q1 \' \+ j& h" x* b. Z7 u- J- X7 g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- A' q' U8 A3 F8 d, a    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 3 P+ J# D( ]) o3 p! x! t8 Z+ J
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 C+ u' @% c3 x  D/ i3 Q4 a- E2 d+ R! t
    CSR = 0x0000;! b: j! d1 a; ?: s0 r) m$ y9 ~4 H) o
    INTC_INTMUX1 = 0x3d;
2 V6 D' W2 }3 P% P7 u3 ?0 j    ISTP = (unsigned int)vectors;1 t6 z9 M3 p; c% N! u3 Q
    ICR = 0xFFF0;  
9 g, e7 E8 E. }6 C% x# s/ W0 @  ]0 u. a    IER |= 0x12;  : `' e4 D) T; J7 ~
    CSR |= 0x01;  
/ ^. @. T2 b( }3 e" V. Q2 u0 _
& L. R  l: O! P9 U; V3 L( |- B$ K1 D: {6 v8 U

! p# w+ Z; I& b3 g+ @1 H; I% s& F0 o还有就是两个输入输出函数:' P4 M9 n# O+ Q
void output_sample(Int32 out_data)! V' {' G' z7 @! b6 l! l( W& x3 |, Z
{
9 |& L5 z1 H( M5 ~6 m  AIC31_data.uint = out_data;  
3 P! t. h* U8 o, B3 k& Q) c- D  MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 Q  G- Q: P$ w) \}; k! @3 y* ~. |. H0 A9 O9 I

+ `3 f% k& E5 _$ ?Int32 input_sample(void)3 a* q0 }1 U: x' R- u
{  
  y# i" n# K1 ]' ~  AIC31_data.uint = MCASP1_RBUF0_32BIT;( U3 d8 ?; |. v! O0 B
  return (AIC31_data.uint);
% n0 q" P4 h/ w  x}
+ e+ `: k* U# N% b
& J; N  H. @$ ~4 d9 y" M
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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