嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:% G' ?+ I) {2 I7 I8 r
main文件:. ~4 N7 J2 X' _4 {) g; O5 D  ?% V
interrupt void interrupt4(void)  
+ ^2 S6 G8 g$ L% `3 @{
+ ~& N# S3 C7 G" r; q  Uint32 sample;
2 `, e0 r5 K( B2 |0 A) h2 y- M- u( Y" j- c6 x" o
  sample = input_sample(); // read L + R samples from ADC
; m9 `; \# v" n/ [+ h3 {2 X3 B% S  output_sample(sample);   // write L + R samples to DAC
6 o2 W" D  L* G$ D4 G  return;, _5 l5 `* w6 v4 n+ [6 P8 f/ Y
}( X/ r9 x9 e  s  L% o- g2 S

3 x/ J$ i  h) b% p* @int main( void ). j/ t5 |% Y% _1 O- L- x3 j' K
{
6 M# E7 F/ W, x+ d5 b3 O$ L3 J- X: z, U4 D
    /* Initialize BSL */6 Y: H% g" M' l( M1 x  F& b8 g  S. I* z
    EVMC6747_init( );
. y- |7 ]; `. l* v( o* p7 M        /* Call evmc6747_intr function */& N' S  K" ]2 L! g6 u
    aic3106_init( );) F: P/ n$ u' |9 z3 u
        while(1);5 b, |# B( }8 ^1 y5 I
}
+ J! Y3 N; v6 }  ?! }% A! s; z( F/ J& e

1 I, E5 J! T7 c% {+ r' haic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 c2 [8 f3 z5 v! g3 J9 K( m) C# e/* Initialize MCASP1 */
+ K  Z% o, S4 c4 O1 M    mcasp = &MCASP_MODULE_1;8 ^% I, @) F3 L" H# {
    mcasp->regs->GBLCTL  = 0;       // Reset
% K9 [2 z  P' O3 v* R7 E    mcasp->regs->RGBLCTL = 0;       // Reset RX
- ^! ~7 i  h( g3 Q$ p    mcasp->regs->XGBLCTL = 0;       // Reset TX; J# j6 ^5 d( B+ c1 K
    mcasp->regs->PWRDEMU = 1;       // Free-running: G# E* B9 U4 }  i
   // configure McASP0 receive registers
& Q% @$ @1 X4 c+ ]: d5 T    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
' P- K8 o2 R7 ?& P# y6 `9 _' U, C' d    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' X' e& V( b, f' D0 g    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 U1 C9 L& {* p2 R0 L* w& u    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 P9 @/ g$ {7 E8 l8 q+ ~
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
" E) _, E2 s9 c4 R    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 w! E+ o; B; ~8 O$ J
    mcasp->regs->RINTCTL    = 0x00000000; // Not used2 m9 _$ ]5 U* i9 G
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 _9 d. |5 _+ ~7 {# U. W+ X% ]- Q1 c4 ~" h# E# M
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
7 T  [# \3 G$ z0 O    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! p6 w6 [5 a* F7 n: g# n# W    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word) K) I9 r0 h& b7 p
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16' E; K  A2 X# s: @
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK4 N8 Z: j; k# J1 w: r( {4 b5 F9 X
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,14 c) v/ P7 V1 v9 Q" H4 J! l
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit$ s# k8 S( z6 ?: P# n- S& g! I% q
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( U: a1 V7 U# h

8 Q! T% I1 R, Y    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN  C) r9 _1 a. v1 G6 p! @/ V! h( W5 d
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
% X& \2 T7 K$ ?: ~& l    mcasp->regs->PFUNC      = 0;          // All MCASPs: Z1 W6 s6 ]$ F& K
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 R1 B/ d) _5 v6 i1 I* N
, [+ X2 t, K. q8 y- ?- X- n- q
    mcasp->regs->DITCTL     = 0x00000000; // Not used
0 r; Q# c6 D. M7 a    mcasp->regs->DLBCTL     = 0x00000000; // Not used+ s* y# [5 @- X' ~
    mcasp->regs->AMUTE      = 0x00000000; // Not used7 {/ l; U7 p: n
0 |0 [2 K9 M  E; _
/* Starting sections of the McASP*/
( g3 ?) J- l- Q' |) y    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
9 k7 |7 ?5 q* H& d/ ~$ Q4 p    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
: m. f( X! P" w    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 5 T" {& y* I; v2 ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 O2 H' P* a& x" ?: [( y

) d0 |6 [- U. m    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;   p# z! u: I* [
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 B! B5 ^& V4 E: Z
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( H3 p2 t# S% I# t; u    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );8 k  t4 ?- J) F

5 W5 J# ~# R2 Y  f( v    mcasp->regs->XSTAT = 0x0000ffff; 0 j$ ]9 w* U# q+ w
    mcasp->regs->RSTAT = 0x0000ffff; 5 f" I( H: |$ o/ f! E3 M
  t) R1 E+ [* l, a+ t8 f2 \$ R
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* H: P, G- k. b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. K* }6 }$ ^/ x5 k9 A& H, s, e    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& r8 t4 S' d; g+ [. Z- `+ d* A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );7 _- l- V8 U- W3 }

1 M& U& f2 [/ D! J1 p    /* Write a 0, so that no underrun occurs after releasing the state machine */
- f5 q. J, Y) K3 U' n    mcasp->regs->XBUF5 = 0;
$ R+ s( k8 M" I+ R- h0 u$ P    mcasp->regs->RBUF0 = 0;
7 s5 {6 C2 c* O: y/ L8 f
. c/ m8 v7 s' G: o# y; G    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' R- Z& y0 Q. n7 u% k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! S: [: r0 M; |  O1 K3 |
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ O1 @6 |- ~6 g- L6 j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );$ X2 n% b& E! ^; r) _& o5 E
- y0 _6 g+ _3 U0 J
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
. i4 A  t0 @0 I/ {  \" J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );; l2 Q' E4 S* L
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' b' I7 t0 s; y' D- k; ]5 L9 A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% |8 v  q  ]# W# |( N: z: d7 ]
: M2 |0 q5 X- x, n# \
    CSR = 0x0000;6 @+ u; ~+ j0 h; L7 U3 C
    INTC_INTMUX1 = 0x3d;5 x% ?$ |4 E- u! `3 _
    ISTP = (unsigned int)vectors;4 x/ N# f) Q( ?) o3 n1 T2 A4 J2 Z
    ICR = 0xFFF0;  # f7 b6 W- Q. ^! M5 |1 C
    IER |= 0x12;    t9 Y. H4 S) n3 K0 Z4 C+ V4 T8 w
    CSR |= 0x01;  
  _' R: v; D" p- k" J! |* Q; N$ Q

8 w. d7 Y( F* e8 U% ?) l3 l1 [' [* G4 t  j* j5 q0 e
还有就是两个输入输出函数:
; [, G+ k$ v. `7 s0 H& t: Vvoid output_sample(Int32 out_data)
6 b2 O$ l3 l4 Z{/ Q' ?1 t! [; |# l4 z: i5 C
  AIC31_data.uint = out_data;    C6 u* t2 }4 V
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 W; K( h/ d$ s7 l& j* K2 ^) B}  N, ?& L' E/ P" K. j; r8 i- R

, {6 z* Y: j/ s$ e( b! f' c* PInt32 input_sample(void)" u2 y) N% ?' d/ e
{  7 O5 [' m, Z2 i+ M6 ?
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 \0 l! l* j  Q5 e/ \: y  return (AIC31_data.uint);
' C5 ~- z/ ^  X5 U1 ^9 W8 u}6 u) D) \1 H& C5 m5 P
4 s  Q  V: J( e' a6 Y, P

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




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