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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ d2 {! g* `/ E) }. jmain文件:* q, J- W1 e1 X* U# b$ y
interrupt void interrupt4(void)  # U. [5 W$ I* ^/ I' k
{6 I, _4 x2 W+ s/ k1 _  o0 w
  Uint32 sample;" i6 n8 i1 I( g2 P7 Q  f+ C* u

* C! }# v" z; q+ L- [& H+ s8 t  sample = input_sample(); // read L + R samples from ADC& A7 e- H- s5 O' E$ f) t" y
  output_sample(sample);   // write L + R samples to DAC
# j9 q  f1 s' }, l% J& s; w  return;# @& D- E+ L* G7 X5 F4 i9 a9 i3 [
}
* M& s3 h# {+ B! U* P: [3 T0 h0 |3 K7 P% m8 n" C2 y( G
int main( void )) W: ?8 y  b1 y+ Z3 k1 K: l
{
$ w$ V. e6 L! S8 |
6 G7 [3 }4 ]! @7 N( y    /* Initialize BSL */
5 u8 e1 ]# w5 x    EVMC6747_init( );
; |( }' B/ H6 ]9 I: d( h        /* Call evmc6747_intr function */
! k; ~; |8 [8 u: f    aic3106_init( );
+ g5 v. }  t  d' Z: a        while(1);2 b/ ?: v9 L/ O5 x, ^! L0 N
}
( Q4 I  z" e' e2 k
6 b; L- [! F) V$ n0 y+ E
& `, g( M6 t- \; T6 caic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- |9 H/ I8 A) y* f: x, F6 [/ p
/* Initialize MCASP1 */
2 J8 t5 T$ o; \$ W' @3 z* l' G    mcasp = &MCASP_MODULE_1;+ X% F4 D: W7 y6 d  h5 c! \
    mcasp->regs->GBLCTL  = 0;       // Reset
/ |$ x0 M& D" F. B6 W0 m3 [    mcasp->regs->RGBLCTL = 0;       // Reset RX7 s, i/ K2 G8 P- y. C
    mcasp->regs->XGBLCTL = 0;       // Reset TX: Y% l1 B5 u0 x6 _. f. ?0 w
    mcasp->regs->PWRDEMU = 1;       // Free-running. O( `! f, W) x0 C; d
   // configure McASP0 receive registers
! P+ d6 h3 i/ h2 D2 N" s$ e    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
7 |5 p8 p% [' p    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 u* L9 S' i- |
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ a. f$ a! _  l. f) \( _2 L, ]9 q    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ @. A: V# R8 s, C6 f  R    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
- N7 B% n0 Y4 h- X2 i/ b( ?    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 `# X0 f* H6 T    mcasp->regs->RINTCTL    = 0x00000000; // Not used
" }& Z8 p+ z! M* q* G    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: V( y3 g: d8 t0 r  @( x9 X" Q
. d. [) u$ C* O. {& k& |: J) T) G6 n    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
/ W( U$ A" p) `: P$ v% H4 F2 h    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 g2 ^/ ]2 R* W4 T/ i: p
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word' W0 k  n+ p1 |* g( `
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& u5 Y3 O7 Y# Y$ j    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
+ H3 d6 E) p6 @2 w1 w  H    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
% N, L% }! x9 k4 P$ v9 Y3 d  N# p8 r- q    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit9 f2 `4 K( m1 c4 ~, d: b  V+ E( f
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) n3 X0 v8 f5 X7 r0 i. }
. j) n7 Y, N2 w5 @2 f- W. z3 F    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
; `2 X. _7 n: X& e: k" a    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT4 a% C- o' l4 E5 k8 t
    mcasp->regs->PFUNC      = 0;          // All MCASPs6 X  n, @. e2 j5 L1 U( @
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ ]4 P1 ]6 s6 ?2 f7 z

9 S/ X2 \) Z1 h! W    mcasp->regs->DITCTL     = 0x00000000; // Not used3 W$ s5 m' |0 r2 J5 r! V( p
    mcasp->regs->DLBCTL     = 0x00000000; // Not used( R8 Q8 B$ X9 w% G
    mcasp->regs->AMUTE      = 0x00000000; // Not used/ H  O/ K8 h3 Z

# _4 @! K9 d/ b2 m& {0 v/* Starting sections of the McASP*/
$ J' u! O7 K) y5 j    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' j/ k0 B1 ~5 f( _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  ; k: T2 k' f2 C
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# _) G: y: j7 I9 `0 i    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );" V( ?1 A* L2 d( g8 p/ R
. p3 E2 Y/ h) E5 h
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 p/ S3 ~% i. X    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );. M- F8 O* @3 Z; d
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, @2 ^/ N$ x4 L. [    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 p+ y3 ~; j+ \* Z- W$ l6 ]3 I2 X5 p
& a6 s7 r  Q  k    mcasp->regs->XSTAT = 0x0000ffff;
: R, u3 \3 `  k" `8 E: Q    mcasp->regs->RSTAT = 0x0000ffff; / B$ c5 u0 K, O) r+ s  Z

# }2 N$ U8 L  T8 l    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 ]& I8 y/ `1 Z# A# [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );. e1 S+ Z; s/ |9 |
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; f7 q' p: P; _' J; }8 \    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );7 v: Y1 K: \4 Y  o: a

  @, U7 J* U8 F9 H2 F" ]$ _: Q    /* Write a 0, so that no underrun occurs after releasing the state machine */
5 H, m0 G, N; P- C- L/ B    mcasp->regs->XBUF5 = 0;4 w" i/ U" {) c& e4 b0 O+ e5 e, r# u
    mcasp->regs->RBUF0 = 0;6 W3 v/ G' b0 e% W' i7 x( r

" p1 h4 a8 d! ]2 T    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- ^3 O  }6 F7 `- a% P    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );9 z8 F8 X) E0 U  @1 I) h( M
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 p  \5 b% {3 M3 I, M4 g6 p    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- a) D5 M7 q/ z" Z# X& u- ]
; D+ ~/ y2 C" d6 R" V+ ]    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; & u0 v2 Y" V. k7 @4 \' @4 T
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& ~: K, M9 f1 [# F0 h2 V% z) G    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; , o+ E& k8 l' Y% g7 n! ?8 ]4 l$ _# p
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
0 \" i' ^* b+ K* @0 a, a1 |9 K" O1 H
    CSR = 0x0000;
. y: c/ b5 V2 e9 V3 a    INTC_INTMUX1 = 0x3d;6 O4 H1 F4 K1 o" @
    ISTP = (unsigned int)vectors;
, w1 Z5 Y# o9 x5 ^  {# N- B" ^& R    ICR = 0xFFF0;  1 P1 r  T( P: O0 z+ r4 \
    IER |= 0x12;  " ^! V: b7 C6 b1 d9 s
    CSR |= 0x01;  
2 p0 S! R0 R7 `  s. y. O. n2 [- s8 g. {) v# n
9 w- i# D. v6 r" A/ J
/ T; H$ b7 `% r# ]  v. ~. Y5 a
还有就是两个输入输出函数:( K3 F; U. v7 x
void output_sample(Int32 out_data)
6 b2 p4 P  K4 O{
4 @+ @) J( d! `% O% ^/ v  AIC31_data.uint = out_data;  
0 e0 D3 d8 o! t0 u/ {+ Z  MCASP1_XBUF5_32BIT = AIC31_data.uint;( f! C! F4 y, {$ X+ r' j% I
}. h6 D" }, V$ p. P4 g2 Z. V/ F, L' o1 F

: l/ x! C+ i% A9 l7 kInt32 input_sample(void)
) a. [0 f/ O* L# [& |5 X! j{  : d3 C" B6 J) [5 @- O9 R) _
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
' {+ q5 l8 q5 U, e' B5 i( U  return (AIC31_data.uint);
0 }1 O% S9 l' q5 S/ x+ Z# r0 x}
5 }2 l8 C1 ~5 `) \  h+ x
% A2 e' K3 }$ V3 r& v
分享到:  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-5 07:33 , Processed in 0.038178 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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