嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" G0 F0 u, K  a. y7 S/ emain文件:
% `  U4 p" x6 s, Kinterrupt void interrupt4(void)  
& ?' ~9 S' u8 W" ]; [{
- g! l+ A1 J+ ], i+ w* G, {2 ]  Uint32 sample;
' `& u9 p3 Q  Z+ z( Q. m) a1 C$ q* T' m4 \9 f' U1 s. W8 O5 X$ E
  sample = input_sample(); // read L + R samples from ADC
0 j/ {: `- {1 I  output_sample(sample);   // write L + R samples to DAC
# Y7 h+ ]  ~# [7 T1 z5 R  return;
8 I9 }; {; P% T( U/ @0 j% G}
' A9 e) G: k9 d
4 F) L% S1 J. C! R; n' z6 Xint main( void ), \9 W9 p. c! U1 j2 }
{
; i. U6 T6 j2 v9 E  f0 P
6 N- @. p" q  C4 p1 m    /* Initialize BSL */% p; q( M3 `; _! o$ H
    EVMC6747_init( );; I( S: L( {8 |$ ^: Y& `3 n3 H, R
        /* Call evmc6747_intr function */4 s9 x4 p/ R) O
    aic3106_init( );2 _: U- C, O( v2 C6 t1 P% D
        while(1);
/ a; E& G. E1 U. |$ ^8 m+ l5 a+ L7 E}; Y8 o9 j0 q: `5 z% ]

; p8 O5 y$ S" v' [$ J
2 u: o9 p* S" a. N1 c' naic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 {) J+ ]* q( w9 Q/* Initialize MCASP1 */6 l* t2 c( R, s7 Y
    mcasp = &MCASP_MODULE_1;# z, D- p# q4 w  O; i* t
    mcasp->regs->GBLCTL  = 0;       // Reset
( i8 m3 d( L# T- W    mcasp->regs->RGBLCTL = 0;       // Reset RX. \6 _$ e2 x4 S
    mcasp->regs->XGBLCTL = 0;       // Reset TX
0 O% q+ g: f& U+ L    mcasp->regs->PWRDEMU = 1;       // Free-running
5 ^, @/ V% k0 ^& F( i/ ?7 S   // configure McASP0 receive registers
) [+ ^2 i% f4 t    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used; ]5 S9 o. U9 y0 m
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
  C2 U2 g2 B1 P% U  D5 \    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word0 x1 {* p1 f8 ]8 L, U+ R
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 m9 z4 r$ a5 x% O    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)" I' o6 L- Y$ `7 ^
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
( V' }6 _+ T2 |$ e9 H    mcasp->regs->RINTCTL    = 0x00000000; // Not used
; ?* q7 V+ \2 S. M) [% e+ I- _' m    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ e, F7 v2 R  V5 a, j4 C

$ Q' z- c0 _2 _0 G9 `$ y7 X    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
1 ?. ?; \& r$ V; e3 u9 ~+ M    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 ~) Y9 I. M! |/ X7 {    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ |2 P) q7 b/ i    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ K3 y# U' Z7 _6 n; Z$ ]. e    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
; t% W3 }4 X+ P  J+ U0 B4 A    mcasp->regs->XTDM       = 0x00000003; // Slots 0,13 s* M" t4 Z5 q7 `$ H
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
$ |3 a* t8 c3 A5 K; u- K* ~" X# b    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ i  W  t0 G( o6 [- x, K1 s0 j) W$ B* {6 M
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
& N6 L  `# i. y. E! I& w    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
1 C" n5 {# k* w$ U1 A    mcasp->regs->PFUNC      = 0;          // All MCASPs( K1 x+ Y6 L! I
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: T& q5 b) g, @
/ K& R0 O- W0 z0 o/ }5 u    mcasp->regs->DITCTL     = 0x00000000; // Not used/ V/ f) G% D0 [5 r1 K
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
2 V( E6 v$ m1 J' O7 b' U; ^    mcasp->regs->AMUTE      = 0x00000000; // Not used
' {! s& C9 j$ ^# \- u4 C0 g
  p/ B3 m# _* g( I! k1 b/ \7 m# j/* Starting sections of the McASP*/
' Y2 I, a/ o% N1 O4 t    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 E5 q2 Z9 k$ l/ s( s. a% ~    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  2 U& B6 c4 w2 E  H
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, {& U2 \7 D$ Y9 G& [' W: q9 N    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 L+ Y( I3 r- N7 \! W( y4 |# R" B1 K6 \
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % {( s) \4 E- w; \  i
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! w8 k' Q8 a$ n1 X    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 C; x5 u7 }1 H- Q/ s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );: ?- q8 v! N6 y) ?
6 G7 n; ~) k; G. b9 J- ?+ w- t9 q% Y# `
    mcasp->regs->XSTAT = 0x0000ffff;
) J% R0 U0 U0 z    mcasp->regs->RSTAT = 0x0000ffff;
' s/ a1 U/ U8 m
5 y: \5 r5 O; H+ ]& h6 ?" N, h2 H    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;, ~/ b) r/ c, }- {! J% P; q; ]
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );2 p  D% H5 s4 B
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 2 |/ i9 L# ]& o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% [4 F2 J: c+ C% j! ~  r: Y  i3 s3 m
) ], h- q( G5 d2 ?
    /* Write a 0, so that no underrun occurs after releasing the state machine */
1 a; z, d7 r9 A' y7 T    mcasp->regs->XBUF5 = 0;
9 y  E4 F3 L0 z, M1 z5 p: p! Z  M9 O    mcasp->regs->RBUF0 = 0;* b, ~- w, z: s) t5 X2 N

' q' U# |+ y' \" R  O    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ! N& a  u# f7 D% C/ {! }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );) ~/ @% D( [" j% r! J$ \7 i0 S0 Q
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: [# H" m( e" m: U! X    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 D, T3 F; J  V8 S! f4 Z+ D5 {8 {/ w3 V  `
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 3 y! r- J- \: O) H# i
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );! U" I0 _% \) A) H
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 b# j3 f* z+ a2 n
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );( B, G! j  a9 ~" b( C8 d
; f; M' V8 x. f( Q- r
    CSR = 0x0000;
* G9 ^0 I2 r6 ]5 a! T$ N1 f    INTC_INTMUX1 = 0x3d;! d# W. e# H4 ?! Z- ~  S
    ISTP = (unsigned int)vectors;% ]* t, p6 K* }6 a' l6 S
    ICR = 0xFFF0;  
2 ^1 f7 e- O) G, ~3 w4 r! }' B    IER |= 0x12;  4 k9 ?9 w+ `" ?) O  Y5 e, Z# a
    CSR |= 0x01;  : \, E6 x: j" D7 E

$ j7 r$ c$ {, a4 N/ @$ G6 w# ^' r' u# }& ]9 x! A" f) M9 V; R9 B

" q, K& d, o% U  }# U3 x* B还有就是两个输入输出函数:
$ f8 e# ^- y3 R1 y+ ~void output_sample(Int32 out_data)
& T3 o( O+ u7 h* k# m{
; B, N6 _2 j$ p, `& m, Y0 A/ K  AIC31_data.uint = out_data;  
( P7 t/ U9 z) {( D) L6 e  MCASP1_XBUF5_32BIT = AIC31_data.uint;
# d2 G. j5 q- [1 @4 ~' r' z8 R}
' y1 Y3 ?) j: y8 D
& T# R$ G9 U- L% @( {/ LInt32 input_sample(void)
& T8 N( i" y4 m+ H, L: x* m5 l{  ) I! T  i3 j% p/ K3 l3 b& C
  AIC31_data.uint = MCASP1_RBUF0_32BIT;! J  G4 N0 K% n* `9 T
  return (AIC31_data.uint);
7 K3 |: r0 a; f( P6 e}
6 y& @& k% N# B% [3 ~  D- u( q% P0 f6 S0 R& C

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




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