嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 \3 k' O* Y0 @7 V: F
main文件:
% k$ Q; p7 ^$ z. X: o: @6 p3 S5 Dinterrupt void interrupt4(void)  
$ O+ k# j4 J$ _  x# ~3 ~9 {{
+ v4 B& L& _$ m3 W2 G; K( ?6 L  Uint32 sample;
0 Q/ X7 q: d! e! s( @: A/ r. y3 w/ y' j  U( x5 i9 X
  sample = input_sample(); // read L + R samples from ADC
$ W$ z& a* t) Q. K  output_sample(sample);   // write L + R samples to DAC - r5 }4 b" ]2 O/ t
  return;5 \- |$ V+ {6 {7 h5 \' y
}
- g* Z4 z! d1 D/ ?" I. {/ V0 y$ d+ [5 a6 i; S: G
int main( void )# {7 ^! l0 o" k3 \' a0 r0 H
{# ?( n( t$ V5 E# O3 {+ @* j

- X6 ^7 M1 o5 U* U, J    /* Initialize BSL */- x$ `: v! ?2 U  ^6 R. K
    EVMC6747_init( );
- \. o4 T) [' V& w        /* Call evmc6747_intr function */
$ Q5 s! y* c0 _1 n# d# @    aic3106_init( );( D, ]$ U/ t" m) p
        while(1);
9 y6 [0 u( v( N8 x' _# j- x}; M3 O" U. c: b8 H! X' u! y9 z
' v7 y. u% a6 j

# i9 O8 _: ]/ q; w! h3 f& waic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 F7 [: o5 s3 C& U: _8 @% Y
/* Initialize MCASP1 */
4 R' N& n( M  Q, j9 J    mcasp = &MCASP_MODULE_1;
9 a. S: P" i0 ?: O. |" {6 T    mcasp->regs->GBLCTL  = 0;       // Reset2 P) Z6 I! n# W/ u3 U8 M
    mcasp->regs->RGBLCTL = 0;       // Reset RX  {% e5 w5 y  \" v0 w7 C  n& s
    mcasp->regs->XGBLCTL = 0;       // Reset TX) f' d3 Z0 x3 k) a
    mcasp->regs->PWRDEMU = 1;       // Free-running4 ^5 v! v/ I( s9 a8 {$ @
   // configure McASP0 receive registers
2 q4 _# k7 z7 n$ f    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used- r! b5 J0 [; k+ U) y, Q' i3 F7 ^
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ O/ o2 k  R2 O3 |: L& a* E$ n9 f
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# u) b! @2 Y# c& o1 X* V- ~    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. _' Z, W/ S6 g6 ?! ^    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
- w8 E5 V" F: |6 U6 c" V: Q+ P2 ^8 c    mcasp->regs->RTDM       = 0x00000003; // Slots 0,14 }$ k8 s, H0 k
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
" r4 i8 T/ X( N! y3 ?    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 W2 t3 g5 [2 f" L8 v5 a7 v; m3 R8 }- v6 U* `; a5 x* w. U! U
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
) f* T7 z8 n6 I" t; J6 d    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! Z6 Z' I1 x. c) J0 u& z3 N
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- q$ @( d' q- Z1 Q1 }    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16$ B( [5 r& n8 Z% n
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
: j. \! A, e2 A* Q+ m0 J  \    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1" U( w  x2 l# _
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit2 G- ~5 ^' }" l$ H; \
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 ]$ @2 N' w% M4 y+ Z, ^7 C) D* A0 R8 ?8 F* u! j4 K
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
" Z7 d$ T" l6 X    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT9 {9 a. J4 ~( \( C0 k  P
    mcasp->regs->PFUNC      = 0;          // All MCASPs
8 t6 [+ q2 {1 U5 o  H    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
% k( u. l( z' i( |) K2 R7 K0 K
$ A4 ^# D( r1 g/ ^    mcasp->regs->DITCTL     = 0x00000000; // Not used
& m  w- C! e* T9 T& L4 G    mcasp->regs->DLBCTL     = 0x00000000; // Not used! y' y% K  g& p; j' T
    mcasp->regs->AMUTE      = 0x00000000; // Not used+ I/ Z( O+ L- _4 K8 q( C2 n  p
" i+ j; n9 j. ^' h% |
/* Starting sections of the McASP*/
, v* X9 Z3 ?4 q, J; S, l! }    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 n4 y* G# W6 L  A# P% N    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  7 i5 [1 P$ ^# K0 O" D- L
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
  P5 L4 \7 K; l* p; `    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) B* }; v0 P4 d- Y+ G. S' B% ^, Y8 Y! E
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
" I  `: L5 h  W" A9 S# u$ e3 i    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- Z! q, W9 ~$ M1 }    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, m8 A! `5 k  h1 {    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: R, y- e% S* I" y2 U$ Z" N
5 \) n* k- S  D6 |    mcasp->regs->XSTAT = 0x0000ffff; 8 p+ R) f1 R5 F- ?
    mcasp->regs->RSTAT = 0x0000ffff;
1 q2 d6 A" F! |! {2 V- ~3 W7 I) {- `0 n
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 J$ z5 f$ R$ j# c, f    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 S* o6 |' c: l4 v
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# A$ @! ^# O( _' Y1 v    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; h1 G: M+ U. d( C. ~: a
$ j& d/ S4 f- a    /* Write a 0, so that no underrun occurs after releasing the state machine */' D) A1 @7 @  d9 u' ]. T, H* x
    mcasp->regs->XBUF5 = 0;1 j& b7 H5 Y% R5 B1 G% G% r
    mcasp->regs->RBUF0 = 0;
' \& o. P" ~; \% i  }* x  C' V, p' U2 \! p9 _! r' o$ F
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 P. Y7 z. U1 C# x. I4 y: [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 D, U+ ?) ^% I+ d' ^! [9 Q# F    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; - F& L+ y" H4 ^+ k1 K) ^
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( t4 c: L0 |, m7 o- J; o1 x# [; Y2 C8 D, V0 P% x& M
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( z! J! ?. q& b6 d5 [& n9 K8 ?
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 b7 j& F; ~; Z+ r    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * I# V) h% c  E  q/ n% `2 m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );2 x2 q$ {7 b! P& ]$ g: i, M" Y
" U) B0 p& }& V2 ~$ ]
    CSR = 0x0000;$ S, |$ h  U: Z
    INTC_INTMUX1 = 0x3d;
: `. A( u" r0 ]. N0 D5 @/ f( l    ISTP = (unsigned int)vectors;5 H6 t9 u/ ~$ n0 W
    ICR = 0xFFF0;  ) _# v  }& i6 o! e/ j0 v
    IER |= 0x12;  1 P, Y! p& G- \1 `- R  r3 \) Q: v
    CSR |= 0x01;  : C# q, R  `: r9 ]

" D0 z0 J$ l/ a% n7 m& Z6 q2 F& O0 k% H, e* h, O
3 U+ O$ _+ E2 V1 D* [# u* B
还有就是两个输入输出函数:; x- e7 E, s" t6 j
void output_sample(Int32 out_data)) |/ G( s9 y  _% _. P
{9 }' R' V9 Z$ p* }
  AIC31_data.uint = out_data;  
$ T3 E9 Z# @' m& r! e" f  MCASP1_XBUF5_32BIT = AIC31_data.uint;
+ A; ~$ T0 Q8 O: }" N! J}
& R2 }% c! ?, Q% `
' w; g$ V8 q9 O% F1 v4 KInt32 input_sample(void)
; {/ l, K) M5 N4 b0 `, h& F( m{  & `+ v: ~, o- ]# r& m* `1 Y
  AIC31_data.uint = MCASP1_RBUF0_32BIT;- _7 |# t0 k8 I$ V
  return (AIC31_data.uint);
: v1 }% h3 K& D* @( X. ]3 G}
  I5 L4 J' ^7 ]+ {6 T7 f# Q
/ j" m7 V8 n/ c9 {
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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