C6747利用McASP发送中断方式完成音频输入信号的直接输出 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5527|回复: 1
打印 上一主题 下一主题

C6747利用McASP发送中断方式完成音频输入信号的直接输出

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 V* u3 o) h! w4 ^: k- `  {main文件:
* Y7 h8 x% a7 |+ h) J! _interrupt void interrupt4(void)  & f) T; b/ B  m( z9 h
{; K  F& ~0 H) [, G& i
  Uint32 sample;, b; d5 l- i$ G) J  D- Q: Z3 ?
  a. _* N" D5 o6 x' v- I
  sample = input_sample(); // read L + R samples from ADC. `2 r1 l$ l  y& m: c
  output_sample(sample);   // write L + R samples to DAC 7 a; Y$ l) Q/ @" v; D
  return;
* k" s9 l9 F* c+ a9 {" \}9 b  @$ X. p1 @7 N0 _; L
# E' m6 V- ^) O+ z; B- M# p% v2 ]
int main( void )' F, ~7 @" Q/ m7 v) e  i7 ?9 k6 E
{! x& R" [' p: [2 n9 J) g) y

5 Y* f0 }6 r$ _  n- c( d4 L: A" ?9 x    /* Initialize BSL */
0 U9 T% [2 J  |    EVMC6747_init( );! p+ j4 E- F( Y- p8 K' I
        /* Call evmc6747_intr function */
. ~  m  P- t! D( F2 V    aic3106_init( );
9 L& I4 U+ Z: z# F7 A% h        while(1);
7 U& _( D8 u0 y}
/ S% F0 G8 s  T6 R: T- a% {# k/ s5 W
  w$ ~  y% w) j4 x: a( a* i8 g2 g/ }/ a* Y' X) v9 {$ W) J
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 h$ I7 l1 x: b4 F% d6 t/* Initialize MCASP1 */+ S  R' L9 `, R
    mcasp = &MCASP_MODULE_1;6 w7 D6 a6 P0 M2 f  H
    mcasp->regs->GBLCTL  = 0;       // Reset; h# P  a( a, d; n" G8 @! u
    mcasp->regs->RGBLCTL = 0;       // Reset RX
' K7 ]& Z+ z- w    mcasp->regs->XGBLCTL = 0;       // Reset TX! x) z4 W6 c  C! j
    mcasp->regs->PWRDEMU = 1;       // Free-running1 q# R- H6 V. B1 g  m
   // configure McASP0 receive registers8 P# Q9 p3 e, k! v, j$ \0 W
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used3 j6 U0 k+ _2 ~3 ?' H  P
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" m. O1 [0 D  Y: l8 P5 p2 L    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word% I9 f2 c- y# c* E; S" S/ r* a3 a% g' @
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
" f1 L) x* U3 V4 o) J/ P3 M    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
5 |% L5 t* W* ~' Y& w6 W    mcasp->regs->RTDM       = 0x00000003; // Slots 0,13 x* F: j! B& y1 y+ P5 I
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
. O  }) _. |7 G$ H8 M9 o6 h$ u    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ c$ @  f  n* W( ]1 N/ s0 p* d, a" F+ K, _% i5 v8 `
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used; e# ^/ D1 q" ]* ]+ H
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 ]! h/ v* X) x, _0 H
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word7 Y7 y7 v9 E2 z- ]
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# M5 B) v3 g- D% P    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK. ]( {! [4 K& R+ z: f6 z* e
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,16 V( v3 r- f9 s) x" E
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit. ^8 U( g6 {5 x3 F
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 t9 Y& D7 d4 G# ?* ?' X6 g; F4 K( _1 k. J$ i3 n; E
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
  R  K* J( x. W( x3 y' z$ t3 F: s    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
$ l1 T$ j& t+ }* @. d& g5 B    mcasp->regs->PFUNC      = 0;          // All MCASPs
) \6 H+ k+ T2 q2 H: m( P9 h6 E5 M& B    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 `) `: T9 d' J5 w( v. u6 F

* X* X: T9 j1 e$ v8 ?. V8 r  h    mcasp->regs->DITCTL     = 0x00000000; // Not used
9 }* i* m3 a9 f. P    mcasp->regs->DLBCTL     = 0x00000000; // Not used" |5 q3 w- J$ h- ?$ L
    mcasp->regs->AMUTE      = 0x00000000; // Not used. H; k. N+ ?% u3 e) O0 p
. k  `6 k7 \6 s9 |
/* Starting sections of the McASP*/
2 [* o. S; K/ @# T    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; & T$ T1 R$ A6 f$ q0 |. z: H
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  , A/ `$ i5 a# E4 G' m) C
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ }- Y: ]* E/ v& Q# Q3 [- e    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );" ~5 _2 x" |% Z

" _; G7 F, g5 y( P' I    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ a* }6 B+ V7 b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );" ~5 q6 [5 L( [# G& y  H! e3 p4 l
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 p, z  E& Z% y. @
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 g: r" G. V+ a4 e' u9 j6 \! w8 m! Q
    mcasp->regs->XSTAT = 0x0000ffff; # e9 t/ E2 f; H7 p& ~% i
    mcasp->regs->RSTAT = 0x0000ffff; " U7 q7 u, d; B7 P* n7 R5 i+ n
" E' J7 I6 a/ s8 X4 L0 T
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ c- W, s. q3 ]! e    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& X( L8 L1 M8 H6 u    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & I$ E1 r. k' n9 G( U( z9 u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 k3 T6 j( ]4 K1 Z" X" o: D4 U" N" @! j$ h; P! Z8 C! ]
    /* Write a 0, so that no underrun occurs after releasing the state machine */9 ?) B8 o9 r- D0 L
    mcasp->regs->XBUF5 = 0;* s8 G, a/ R4 l! m2 X0 b
    mcasp->regs->RBUF0 = 0;
! D$ ~: Y* `. t" ^; U+ L; ~
; q3 Y; t; l% ~5 c1 [9 p$ P' g& E    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- X- X: l; G: M5 o5 k    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );, i2 a' n! j: K; D/ b5 w# r0 S
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 ~+ d0 ?  T/ H- O9 F
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );6 R) A, N0 \! U  ]

  b  W% a  ]$ {2 s! v    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' n8 o' g4 ^: Y! x+ O1 g4 B2 c$ M4 M, G    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );5 C8 B4 g: @1 `: w8 K; U
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( ~! B0 j, C2 g- [* s3 _    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* @1 \) M: p/ G, I0 U9 m6 C9 t* D, e  k$ V0 W
    CSR = 0x0000;
2 c7 g6 ^' p0 ]) r    INTC_INTMUX1 = 0x3d;
7 }0 f* P% J" Y' v% Y    ISTP = (unsigned int)vectors;! q0 D$ t. \8 ^) P. j% [* y
    ICR = 0xFFF0;  
. @; Q3 m4 I' p4 i# S5 w& x    IER |= 0x12;  ( }; @* a$ J3 L, Q1 R. m( m
    CSR |= 0x01;  
, g2 D1 Y8 {/ j  H/ O4 b9 O; a1 d  z1 p
) r& I* j8 t1 u8 \# Q

; I* `+ m  C" z3 p3 S还有就是两个输入输出函数:. r. x" B# q, Y/ |( w3 |
void output_sample(Int32 out_data)
8 K! c* b# V3 |% n{: B+ N9 y4 z3 g; I* o; s
  AIC31_data.uint = out_data;  
7 F. _" Z. p: e) ~  MCASP1_XBUF5_32BIT = AIC31_data.uint;6 V* e  j; e- j. ^: N6 c% d
}
6 {) X+ a+ S4 H, l
  f# e7 W0 C6 {# L& n# m$ r4 BInt32 input_sample(void): [) ^5 f$ O  |+ ]2 Q' g
{  ; }2 F  ^% \# E5 g4 R4 t
  AIC31_data.uint = MCASP1_RBUF0_32BIT;8 Q9 s" M* f) }7 p3 R" `
  return (AIC31_data.uint);& I4 e) L) ]$ }% H6 v3 m$ }* r& @
}: }% R8 m8 B; P3 ~. c+ R
6 E7 S( Z/ p( x  W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2016-3-16 11:55:59 | 只看该作者
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-11-21 09:37 , Processed in 0.038535 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表