嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 W  P  K6 L+ d+ Zmain文件:
5 v" B0 A; _- E' g2 n: uinterrupt void interrupt4(void)  ) b/ K# c& @* ]3 q1 T
{
; Z% E3 c$ s( F' o  Uint32 sample;& P- @3 J+ w# i' E
! F( M& E! }2 T& R
  sample = input_sample(); // read L + R samples from ADC
0 N, I$ s# X. w6 E, k& R0 g  output_sample(sample);   // write L + R samples to DAC
% b( a2 J, W9 t  return;
7 R+ _. n  a8 k5 a}
  q, P$ O/ \. b5 q1 M0 R: _4 z  d6 o* o) ]
int main( void )
& t( G! a! K6 P! l5 S; b* C3 z{9 m. l& k; y; K# a* H

) Y. c/ H5 h' I. s$ D% S    /* Initialize BSL */8 U9 B8 V- H* Y
    EVMC6747_init( );
# l3 u5 o) p* s) i- [# A5 Y        /* Call evmc6747_intr function */+ i3 y8 z; ~* O- z
    aic3106_init( );: F7 z8 Q' Q3 J. h- V* o
        while(1);8 K( \! u0 s* f+ i2 T
}6 J# Z" f$ \& r6 X4 e

" P; g2 b& }" P  t" N
) i! S  v. k4 Jaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题) i. u$ _( X# d. e+ j1 u: U; k
/* Initialize MCASP1 */
+ m4 L. j, K/ _6 L# k    mcasp = &MCASP_MODULE_1;! ]' R6 j0 S9 F6 q% q
    mcasp->regs->GBLCTL  = 0;       // Reset  u$ Q5 s: w8 a5 f1 j& Q0 V
    mcasp->regs->RGBLCTL = 0;       // Reset RX9 @) R' }2 L+ k( K
    mcasp->regs->XGBLCTL = 0;       // Reset TX/ A9 d# U* q  ~0 C9 l
    mcasp->regs->PWRDEMU = 1;       // Free-running- h8 T' N1 j6 |' r9 ~
   // configure McASP0 receive registers4 l* U: O/ `& \7 l
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used* y8 F$ X+ }( \9 `, c
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 T4 X4 B3 X+ B& o
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: n( V7 w$ u. Q! H" S    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)+ R9 p8 ]/ w4 O8 w+ [+ b- C* _
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
& J! E5 u9 D, O$ t) O: N    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1' X9 b! k% T2 M0 f$ b" `+ ?
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
" x" e8 c. P7 M& t1 B! r    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
  J" r+ O8 B0 Y- D0 z( y" D2 A. h' A. \" q& ^
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
( \% J8 N3 u7 Z4 @" Y    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* e1 v& X0 _/ h, ~2 \, X    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 F8 }9 V$ w3 A& k0 q0 H    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16( ~; Q2 j% v! q9 T8 Y/ t; E6 u
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
. |9 ~% |# x; m    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1$ Z2 r9 e. A7 J5 D' r" x' l8 C( Y
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit1 a$ n5 |! S7 @3 i' O# y' g
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# W& M3 {) p* m

( G. r% G4 S3 v- ~! U, D6 ~! q    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
% N+ T: k. m3 S) k    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
( q9 H0 M6 H# a7 ?$ K2 h    mcasp->regs->PFUNC      = 0;          // All MCASPs
4 V% U/ Y: D' s0 ~    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX12 h4 @4 z5 y. t% J; P" c! k  M

4 K4 d$ M$ g- M1 a6 s3 j) x% L    mcasp->regs->DITCTL     = 0x00000000; // Not used
, u# n0 _5 w( M5 J; x/ y+ u    mcasp->regs->DLBCTL     = 0x00000000; // Not used
; u' b+ s9 S5 b3 r5 O    mcasp->regs->AMUTE      = 0x00000000; // Not used$ S! t4 U2 Y8 b6 g+ Q

" L9 m4 q- Q1 `( \4 |/* Starting sections of the McASP*/( P5 p- g- }2 `& A$ p" T( q
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 l% z) s4 n. [) b! v; R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  6 |1 ~$ n6 ^7 U' V4 Z+ D
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- C$ r$ n1 d6 h; V3 E    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );( n" y: p' l0 r

" R9 F4 ]3 P' ?, u/ }, C    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 j2 h; k$ B3 g4 t1 T1 }    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! W0 \6 ]) P+ p& e7 M4 B    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 4 w9 U5 m6 l! L/ f( I8 w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& D" L. K. G. ~; s( H- x
! ]0 H: V( K" t3 k; U
    mcasp->regs->XSTAT = 0x0000ffff;
5 }! O  j; n- N  o( d; k: G+ ?    mcasp->regs->RSTAT = 0x0000ffff; / M, U5 \2 m! n

! U: Z8 |! n/ A) {( M0 n/ a" w    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 U# v. [4 _2 _% V- X. |* T1 `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 e& e& c  N: X4 k3 `
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 G2 y7 [% s( e/ `8 n; i5 z! u    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );2 }1 C& V( S" f8 @9 p  G

% @, ~& u" o% q5 A; C1 A5 k    /* Write a 0, so that no underrun occurs after releasing the state machine */
9 c6 B2 e) I* D& ~) x* H' U& o. A    mcasp->regs->XBUF5 = 0;
" Y0 `( ^2 F0 a1 _& M7 k- h% u' a    mcasp->regs->RBUF0 = 0;
5 l7 S6 L( v0 s
6 u: p# B, t9 }! b; K    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
. p$ ^  k( \5 [( R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! o6 t/ X* l9 d    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' R  A1 |; y9 ~& ~$ X  S. I4 j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );' t, T2 g, m0 v% e. c
- P2 Q) o# a- I9 K# ]# T% p7 ?
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ d5 H$ R$ p9 L+ `8 x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& q1 x5 S* G/ i0 B    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
3 i1 f# k- V3 V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );" b1 w6 M; M) Y5 z2 i
9 P1 S# {7 x' f
    CSR = 0x0000;
, d3 b( [5 C" o2 S1 N# d' |4 u/ ^( v) ^    INTC_INTMUX1 = 0x3d;
& E3 b5 _1 I- t    ISTP = (unsigned int)vectors;
+ G9 i, _* O; y' j5 g: ^$ H1 ~# z# d    ICR = 0xFFF0;  3 G1 R6 o3 T1 D6 R- g. x/ O1 d
    IER |= 0x12;  ! a* @, i7 \( C# L  W
    CSR |= 0x01;  4 d5 G- L% M- W3 F6 w. f8 M
1 q5 E; Y5 {% `

' t- @  y& o/ g) l+ s0 V# H! Y7 M" w
还有就是两个输入输出函数:) f0 v5 k, }' Q6 s( @+ d9 r  R, n
void output_sample(Int32 out_data)
" V2 R  T* z" J6 L7 z{
  P& U/ Q* Q$ b/ O( r$ S; S  AIC31_data.uint = out_data;  
8 _+ R/ \1 H, h  MCASP1_XBUF5_32BIT = AIC31_data.uint;
% t3 [/ S$ q- s}+ m& z& o1 I. N2 L3 q

: H7 B) ]. u# ]. O0 c) \" h8 lInt32 input_sample(void)
% p6 k7 Y- v2 H5 }6 r  D{  
* ?  f) Z2 V$ g! A: ]! l  AIC31_data.uint = MCASP1_RBUF0_32BIT;( G. i' x3 ~' S  ~
  return (AIC31_data.uint);
& L* u0 P: K' l2 N; h8 i! R& |}
/ R" v: j2 M: ~7 h  M& W4 {
5 X1 H" b0 H( G6 D8 U$ |
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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