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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ r7 M: R1 \" k: r- `  @main文件:
% N8 E+ x4 n$ minterrupt void interrupt4(void)  
+ L6 v0 \8 D0 p+ f! X- C8 u2 f{2 J) S4 P) D; Y7 y0 A
  Uint32 sample;
  R) N% C$ d9 W4 Q0 P6 M; y: E5 D+ ^, |
  sample = input_sample(); // read L + R samples from ADC
; D! @3 t) x" V# r5 |  output_sample(sample);   // write L + R samples to DAC 9 v# H- t; k, ?
  return;1 b" ~6 Q3 s7 M# n' D
}7 G5 i# h5 T$ ]
5 P7 U9 b6 J) F8 W
int main( void )2 H/ v* w. B% k- g/ v+ A* j
{! p' z6 _2 m4 T& v0 {# l" h& b

" K) t( s" O. W0 C/ F    /* Initialize BSL */2 b1 W! Z2 @3 _/ }- g
    EVMC6747_init( );
$ c1 D  m4 R$ i+ A% s        /* Call evmc6747_intr function */, q2 L( h1 F, F9 U) x2 V6 R
    aic3106_init( );1 R/ l  p' z& \
        while(1);$ e2 z  f; k; a* c
}0 h  `  j( W/ v) Z5 e6 Q
# _* Q2 Z  R, \& f0 Z2 d
4 |  N- Q3 D8 {6 K- j
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) G7 v6 |5 D% O3 B; ~' ]' T9 W/* Initialize MCASP1 */; B6 M2 Q9 h; {% I" P
    mcasp = &MCASP_MODULE_1;0 {# k7 U" i4 o* o. b7 _1 y* e, G
    mcasp->regs->GBLCTL  = 0;       // Reset% ]# a" E3 ~. Z. ?
    mcasp->regs->RGBLCTL = 0;       // Reset RX) w6 a/ T; R/ L2 G% ^! }( ~
    mcasp->regs->XGBLCTL = 0;       // Reset TX
% h3 Q4 f& x# j) ~, ]7 t' Y    mcasp->regs->PWRDEMU = 1;       // Free-running' ^1 X3 X" z$ c, f
   // configure McASP0 receive registers- Q$ `- |9 k0 P/ E6 W- ^
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used# a) u) J9 M; B; \
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 @& K6 M3 P6 o: b6 e- U    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word0 M! a+ N9 |3 i1 N. N) s
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
3 X, D6 }# V  Z8 j7 Z    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
: u7 P5 R: B! \: Y# }    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1- T7 o+ v4 f  B0 [. f4 h8 d; t" m+ Y
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
; `2 p8 I% `* q    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" n% g% y: s9 e& n

- ^. ^: s/ u0 W& l    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used3 M5 a  V- Z# N. h
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- f+ I6 k' i% g6 c# r" T6 R$ f    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word, k# Y6 D9 i! V! j( m
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 P3 U* H  }2 k& m
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK3 K$ P0 c+ u% w
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1' v" R# O1 ?" \6 U7 \+ I# W
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
  ^+ _  t1 B" H% h    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 t! D* i$ K! V& W
7 |5 m8 l4 [6 A! ?$ B    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
# E1 P  ?: V9 J    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
8 D  a! F; t0 D$ k    mcasp->regs->PFUNC      = 0;          // All MCASPs
+ o( M4 m$ [, c: n( n: d7 p    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 F* {  E& Y1 a+ W1 l- K" Q

: u9 {; d6 H) Y) n1 N    mcasp->regs->DITCTL     = 0x00000000; // Not used8 q, A2 R( ~/ C% x$ b* e' }
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
  [! x8 Q2 P7 [+ S' N    mcasp->regs->AMUTE      = 0x00000000; // Not used
' c9 P. l' w8 z. p9 i
6 Z! \+ z* S7 N6 g+ w# u' E/* Starting sections of the McASP*/
) k* h, {* y2 h0 B+ W( J9 K4 P- f    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; - E! Q- K" K2 B& i
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  $ S# i5 V  T6 o2 q. Q  c
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " T. R* G3 F" ~: i0 c% c, T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );* i- M: ]# ]% c% b8 p5 s
: j" W: v4 t0 \1 b8 |
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ x7 d! ^) }' e5 A& K# w' P  t    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ }! z" E7 L7 Q; i+ e" v
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 1 h. o  D+ Y5 z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ M  u9 z3 [: E, T- `  ^. t
( j8 ^3 s  j0 B! a  i$ N6 `    mcasp->regs->XSTAT = 0x0000ffff; " [' ^5 m' k7 D
    mcasp->regs->RSTAT = 0x0000ffff; # Z8 v9 e, f) ]2 p

4 n, v6 h+ E( f6 b- c/ V    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 s6 ]( o' O7 ~: {* t    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );& A3 F) z+ T* I3 Z2 ?
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; $ ^; w6 `# ~" M$ S/ F2 ?
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );- q2 u2 B. q# r# F6 X" K

% Y1 I# E' m2 {+ h* d    /* Write a 0, so that no underrun occurs after releasing the state machine */
7 o; A2 b* {7 m9 f! P2 q% b    mcasp->regs->XBUF5 = 0;
" r5 [3 k' A' q3 ~! v+ M    mcasp->regs->RBUF0 = 0;
9 D+ [9 [' D. R8 p
9 T) c7 _! j: |; |6 g* d- v% r    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; # W" Q: }1 T7 v" f  q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" m8 f! H$ f6 X! N! G2 W
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # ?5 `5 t' O( \, b2 L9 `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# ?; F5 j. c, T4 w$ o7 y! d
: M' G; J0 P) S0 c# x( H% G    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 Y% g$ I! f: q' M    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% w8 b, U- a% `5 j7 G
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 5 F. t9 a$ A: t/ D+ H$ F3 |
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );" [  U3 p6 ~" X8 W
) i5 \/ `. E# f9 M1 Q; F2 L$ D" L
    CSR = 0x0000;
8 G% c( A3 o7 \/ Y    INTC_INTMUX1 = 0x3d;( X: c4 C' K4 v0 [% C& w
    ISTP = (unsigned int)vectors;& I5 g! p5 _* u8 {
    ICR = 0xFFF0;  
/ U2 Y/ X: h/ W+ ]3 `+ t    IER |= 0x12;  2 b6 {8 Z8 ]. `* _/ [1 T& R5 Y7 b5 Y
    CSR |= 0x01;  
8 B6 h: p5 X6 q! D/ J9 z  w( t2 x$ j- h6 q2 G9 F& b$ l5 N* C5 g
8 r# \, u8 D+ u) M) ^* ?
9 y6 g5 d( S0 m* T3 Q. d6 P8 m9 b
还有就是两个输入输出函数:
/ X" i4 `; T" o" s7 l. _/ S6 Avoid output_sample(Int32 out_data)
' J5 d: a  o3 Y6 Y, u5 C  u{
% y8 K. }( f# X4 y8 z" ~) a  AIC31_data.uint = out_data;  ' g1 m! P" i4 T) ~! T  h! T) O
  MCASP1_XBUF5_32BIT = AIC31_data.uint;; |6 d$ d' V6 L. i
}
, Y, Q! R1 G: F4 [* I8 x) ?
) A, j' c* I, L" o+ [Int32 input_sample(void)
, V: D3 Z8 X, Y9 K* I. q4 \+ G) T+ G{  
2 |& @3 d% y9 F" M" f7 `6 f  AIC31_data.uint = MCASP1_RBUF0_32BIT;% v" M' r  `% k( u+ ^; t6 F
  return (AIC31_data.uint);$ p. b8 F) T1 c$ {9 v8 k) ?- d
}
& J5 }# ]! W1 V3 ?
' J; w& h4 |3 B* A
分享到:  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-11 05:38 , Processed in 0.041795 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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