嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 h3 L* I  `- Z5 C7 c; e: Fmain文件:
& s7 `3 A9 a# E; [interrupt void interrupt4(void)  / W- l1 v- `2 Q3 P
{% V& v, b1 c5 T- Q
  Uint32 sample;( [5 A5 a4 e4 G  i4 _

# O2 y- ]( ~: A  sample = input_sample(); // read L + R samples from ADC! l: ~9 n8 A. ?3 V" R
  output_sample(sample);   // write L + R samples to DAC
' T  M' e2 E5 x) g" g; w  return;
/ B5 f" |9 G+ @: S}7 y8 E, c/ V+ y' C( l: V
# ^7 }# ?& Z* @) H& J
int main( void )
6 g0 E$ u* O3 F$ b9 ?8 _* l$ b{* n, l0 S# O. J: Z' d

4 L( f: |+ {8 \8 I+ P: U    /* Initialize BSL */) ^. I3 D  J1 c- |2 ]: x) S
    EVMC6747_init( );
5 I6 |7 i3 d& x" J9 B8 ^        /* Call evmc6747_intr function */4 G# x, m7 [& y2 f! I! E. P& B
    aic3106_init( );3 w  Q6 s* h4 d- P: s
        while(1);
1 X& Q9 _  i. L6 R% N% ?6 l}. g8 G2 x! ^' n3 l. t% I; r
! s; y# [& X) R
% p0 K2 z' K% t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题' X8 a: Q( J# g6 ^3 g+ S. d
/* Initialize MCASP1 */7 h( f. O) v9 n" U
    mcasp = &MCASP_MODULE_1;
* w. p5 y( s/ P- }. \. Y    mcasp->regs->GBLCTL  = 0;       // Reset
# @' A8 m7 }9 O/ I/ \: u    mcasp->regs->RGBLCTL = 0;       // Reset RX$ R1 g' P/ e5 f
    mcasp->regs->XGBLCTL = 0;       // Reset TX  q% D3 D, i1 m& q+ I
    mcasp->regs->PWRDEMU = 1;       // Free-running% J/ W+ `$ \  [( O$ K# s; Y% u1 t
   // configure McASP0 receive registers- V/ {/ s, O$ J
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
6 H: [$ o- p% g    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* D# f: d* ?) \( D  E    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ H$ p' V9 G/ f" i7 }! d, t    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)! X1 U& Q( f  `; U' M" |, k0 Z
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)5 x' G* T1 r; Y3 ^* M, V
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
# q0 d) i+ l1 k- F6 n; r    mcasp->regs->RINTCTL    = 0x00000000; // Not used! I( x/ i% G# Y$ b! X
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 Z! l- j& B& A3 r0 [; E8 p
' n: r$ B; ]$ Z: W    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used9 Y) F% y( V- V: g9 J
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 I; N$ V- t# ~) }    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ K) ~; g/ L% b6 ~
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16- s; [  {# l4 S" V9 w. u" W3 F8 \
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK! g, X& Q* h  l1 S5 N, M7 Z
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
# u- t$ ~) {" z8 O8 P    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
. c; p) h/ b# U) ^    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 F; d; {& |* R' r
5 P5 J4 Z2 M" R    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
8 s+ S, m, f3 D+ E1 F    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT0 \  j0 B4 G1 W* w
    mcasp->regs->PFUNC      = 0;          // All MCASPs
3 n/ H0 G$ x: J2 b# u( o    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: ], T- k' G: F" E$ k5 N" v
# P1 Z# D* {% J& X: P    mcasp->regs->DITCTL     = 0x00000000; // Not used
+ @( ]) B; y" a    mcasp->regs->DLBCTL     = 0x00000000; // Not used
- ~- R6 T* Y2 U) S! C    mcasp->regs->AMUTE      = 0x00000000; // Not used) {1 q3 y" l7 z1 u0 s

( A' Z' g. E1 z7 C1 C' a* G8 K/* Starting sections of the McASP*/" R  p/ F$ j7 |. y  `+ Q
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 _/ g& W  `* D' ?7 l" b9 \    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  : t9 p, F1 N  Y2 Q! m
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 |' O0 X  h9 D* J: g" v. ?: N
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 X. I/ x" }7 y" n; O( @" {: d1 u( H, I; T) Z2 h& H( E- ^
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 q! ~# n8 {7 b+ j; J  x- W7 p    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );% h. u: g) @9 M8 P, p& f
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 u' P2 M. J8 t- G    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# h. O; f3 M; K) g: f2 n  u; b9 z; l
3 u; T* j- d* T$ c. K" A
    mcasp->regs->XSTAT = 0x0000ffff;
; l, O. F/ t$ v    mcasp->regs->RSTAT = 0x0000ffff; ( {1 y5 h, z! B: J+ s" c4 D# H$ Z
  x- C. \, H9 I& `  D& B1 }0 s
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' O9 I3 M3 B! y% T    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );6 H, g/ J+ J0 i1 j
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. w9 j, _2 ^: }" t8 w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 A3 @  Z2 y/ m% n

- S6 y7 I0 Y7 |+ p/ `; `    /* Write a 0, so that no underrun occurs after releasing the state machine */) y! }# W5 ^0 Q( \
    mcasp->regs->XBUF5 = 0;4 _% W# n, h; n# {& u4 ^: q3 O. o
    mcasp->regs->RBUF0 = 0;2 B# {2 |& U+ s6 K4 v2 @5 G

; w' F2 n4 o. F0 g, {0 n    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ; v+ B9 e( c2 s$ P2 |$ y2 t
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. w- q0 h- {2 `1 m    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 K; e7 k; O: a& ~% [& G9 ~    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
6 j/ v* e- Q1 s1 \% A! K/ u/ G- W8 @% r; g
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;   w7 w$ c' R7 E  e  ]% \0 x5 c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- g' L2 l7 K3 x1 i    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; / R- Y/ y/ m& g6 y8 U! S
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 a& C. y& N$ b: i, x! v; w/ {# E. b9 e: H- }+ b
    CSR = 0x0000;
; h5 M" x9 ~6 ?8 V' ^    INTC_INTMUX1 = 0x3d;
0 s- G" n: Q# K. L$ I    ISTP = (unsigned int)vectors;" z: l; K# J" r* n, v; [/ i
    ICR = 0xFFF0;  2 y4 P, D; h# [
    IER |= 0x12;  
- ?& I  H6 [. g7 x* }/ f0 ?6 D8 S    CSR |= 0x01;  % @0 m% ]- h7 k. a" b

4 e3 g$ ]$ W% L4 C, L1 Q3 K, S* L/ N2 Q2 w! q- N+ @! ?) t
" G8 U2 \# i+ c7 d/ h0 z9 s
还有就是两个输入输出函数:
) ?1 I) W9 R1 ]( y$ Y& Pvoid output_sample(Int32 out_data)' [& }  w; y( {# c0 i5 D
{# I8 k/ k4 m* T& {9 y
  AIC31_data.uint = out_data;  
8 i7 ^2 _' l/ M* p$ f( P, y* P- Z  MCASP1_XBUF5_32BIT = AIC31_data.uint;
* K) l, v) Q# J7 f}
8 R) s% T9 F) m, p$ x6 p4 m$ u# J  W8 }8 ]* V- c7 W/ ~: I* `: ]1 d- D
Int32 input_sample(void)- ]5 h7 `5 C3 c' c$ F
{  
3 A) G& X: Q3 V9 \! k$ c/ T  AIC31_data.uint = MCASP1_RBUF0_32BIT;
: x1 b5 F3 j- q! k; A" h  return (AIC31_data.uint);
, L$ I+ v7 e. y+ w. V, \1 I" T7 g}
5 y# v0 M. s, c2 C4 r/ k
. u! I8 M  n% k7 s7 H
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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