嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:  X2 r: U- \  t" q
main文件:
$ j9 H/ E6 k( O# Tinterrupt void interrupt4(void)  
3 q5 d) G, E5 C, t1 B* g) s- N{7 f2 V( Y$ K( a4 m0 _1 z
  Uint32 sample;8 h* t: v8 Z, V! R# v' \
1 x( y9 u! b/ P. W, J  _/ E1 X
  sample = input_sample(); // read L + R samples from ADC% j5 v: Q) h  }1 o# f9 K
  output_sample(sample);   // write L + R samples to DAC ! H4 n5 [, F6 d9 I! \/ Z' e, \
  return;
8 H. d& `9 C9 {( `* S, r}2 d2 a$ p+ \) y" I8 c1 b, z
) y( s) j' z2 @$ h% w
int main( void )2 H! V8 q! u' {; j/ e/ Z+ u
{+ L/ e8 e- l4 _# |  D. a! j+ m

5 ]" b6 _- u0 v) ^5 {+ ~    /* Initialize BSL */% D6 f: w$ b# b2 {
    EVMC6747_init( );
" J* U$ b( J* A" d  V        /* Call evmc6747_intr function *// j6 |. G4 t: g$ c& ^8 Y0 R
    aic3106_init( );, P* x* o) i/ M( b
        while(1);
9 K" @3 x" n# S- L}- D2 {6 {: c# d$ B/ {3 j5 j
2 K6 X1 \( a+ l: E; ?

# {1 ?' V+ F) G' m) \aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
3 O4 p0 C7 r, W* N/ c  n* @/* Initialize MCASP1 */
2 A8 C, u: ~( u9 c/ \    mcasp = &MCASP_MODULE_1;
* t! `- J) A7 z/ k/ ]6 {! Q/ Z    mcasp->regs->GBLCTL  = 0;       // Reset/ V( v. e4 l' k8 R8 s4 K0 _" @
    mcasp->regs->RGBLCTL = 0;       // Reset RX
  ?. ?  s4 ^2 p( @# B0 q    mcasp->regs->XGBLCTL = 0;       // Reset TX  z# }4 O6 b  u
    mcasp->regs->PWRDEMU = 1;       // Free-running
# N( `, z& S- X4 C2 \( g. S2 Q9 n   // configure McASP0 receive registers
0 C, v  e* k$ `9 V! k5 E. h    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used* U& F" F; C/ _& v9 i2 K' N
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ H: ]5 i& R  ^7 O    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ W1 `3 W' ]5 q. V. _
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ M: W* _, X. M    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)& D6 H1 I* R/ \. o/ b
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
' T, @- v$ w: c% |    mcasp->regs->RINTCTL    = 0x00000000; // Not used/ h# T' ~' Z9 t9 I  a
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 U" R0 F8 z; u+ X3 Q
+ T1 ~$ w% z# H5 p% L; F- H# a    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
$ Z8 v' X4 x9 @7 M$ L; ~6 V$ H  q$ m( x    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 S% Y' a# ?, b6 M& z    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* q& {7 I8 k4 H* E. b4 p
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
. p" |4 Y0 ?; N% X    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK- x) Z8 Y( P' J/ `
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
8 p' f% V  q" Q$ Q* E; {    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
2 _1 Q& l: Q+ W2 c    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
  I5 z+ L/ T6 v, B
* o7 M4 r4 f8 G  c4 k    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN. Y1 p9 U2 x% K* M6 n4 ~3 i+ O
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT/ [3 `; Z6 E1 H1 y5 K
    mcasp->regs->PFUNC      = 0;          // All MCASPs* Y/ f2 b2 R+ Z% X! P: |* [: p
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 w# E( }2 j9 K" \% P0 ?( z" s* A1 ~; i9 Z
    mcasp->regs->DITCTL     = 0x00000000; // Not used4 p) T) F9 V5 V
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
! u; P2 n# h2 r    mcasp->regs->AMUTE      = 0x00000000; // Not used' m" y0 u5 Z( `

& X6 L/ t- J- ~/* Starting sections of the McASP*/5 d' {, _; Q+ E. b
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 1 o# ?/ f8 b6 R3 m% {; j( N1 `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
+ C# P8 p$ u! R& q( D9 I" u    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; % j9 Z9 C  s$ H, F$ b
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 N+ j9 j; y9 b5 a4 K0 P
0 T0 U/ p1 d! W, o+ @# A+ ~    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 r' B$ M. V2 P$ `/ C    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );  ~( w) U" ^/ I7 `) Z! G
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, G6 `( n  b% M5 y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ h( K% @+ T/ d
- }' [( d$ M2 E    mcasp->regs->XSTAT = 0x0000ffff;
; ]( i$ s4 v/ f! h2 P" o    mcasp->regs->RSTAT = 0x0000ffff;
, U3 c% d. a9 U* H( }) V
1 @1 I/ X) L/ O. M, w% L, c    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 u& M6 `* V' I2 [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );' K4 w8 R# S) G1 i" {
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" o+ ]9 F- Z: P' W0 w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* `+ n' H- C* b' x- T( ^* Z1 P
8 r# m$ f5 x3 o    /* Write a 0, so that no underrun occurs after releasing the state machine */. r0 O1 Q4 Z. X0 ^4 H3 y
    mcasp->regs->XBUF5 = 0;* L2 }' A7 V. h& d* p8 T: s: [5 p7 N. J6 Z
    mcasp->regs->RBUF0 = 0;) z, L; T, W5 G( A; ~1 h2 p

( s5 G; l) ?8 {# M    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" u2 j* @9 r) d0 `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 n% b$ ]. Q" H5 I" c4 x: U. }5 \7 P
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 d- j1 ?9 p  ~+ j  U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 }: y+ Y" |1 G5 H3 D
* q: Y3 m% a7 _    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
9 b+ f9 t  P2 E# l; D( {8 q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 l  f6 p- p- _' q
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
% U  s+ o( v% \9 L" i6 A- T4 v    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ O1 p& O, p! \7 h2 Z; ~
6 l( P5 j; p7 a; d    CSR = 0x0000;
: h& H, @) |; H2 L. u    INTC_INTMUX1 = 0x3d;
4 D( W. S# C3 }4 k- D/ {# `% C    ISTP = (unsigned int)vectors;
2 _* ]# y- |* X9 s    ICR = 0xFFF0;  
5 X* _" u5 G8 Z. v! g2 N  H    IER |= 0x12;  
( x) W. V) [/ c$ f. l    CSR |= 0x01;  # e: q- p2 z" |& U- r" o& c, O) B

2 q2 l! B+ Z- I1 R  S6 P5 d: ~) n) M! _

- V7 U4 {% q$ W# i5 B( N还有就是两个输入输出函数:1 h  R% M9 B& H9 p3 f; k% E
void output_sample(Int32 out_data)
2 Y5 u8 _  c$ I% K% n! v" a! m. b! s{
1 ~0 a1 f+ Z/ N& z5 g' S  AIC31_data.uint = out_data;  / S  P  p& ?) t. q, N; M$ |- E; z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;) r# v; t% c6 T  p) B# u- t$ v
}' N8 |, l+ G, `5 C
% t4 e, g+ a$ a9 d
Int32 input_sample(void)
9 L+ @# H  e$ T" S5 G$ O{  
, w! m4 ]- r' V3 ]3 T( ?  AIC31_data.uint = MCASP1_RBUF0_32BIT;6 S2 a. W9 E7 J9 {0 }. G; S! B
  return (AIC31_data.uint);! T! o2 E+ }' u: w; `- Z' `
}
. X. t# v1 f/ j+ e! }6 u- I2 Q! i: _& q# W/ `) T6 K4 [

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




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