C6747利用McASP发送中断方式完成音频输入信号的直接输出 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 w2 [% D; l/ Z3 W' zmain文件:: R; X9 p. E. v  S) |% w8 S; Z. A
interrupt void interrupt4(void)  
6 b5 t$ X" z. K1 l/ b. o5 a{* I  C- W. [8 r3 L8 k
  Uint32 sample;. h, B+ u/ V* S) q* ~
/ M0 R4 [# K# h9 y) u, ?1 O5 g
  sample = input_sample(); // read L + R samples from ADC* n2 N0 _. c) t3 x3 K( P% Y5 i
  output_sample(sample);   // write L + R samples to DAC
' W8 P2 d0 g3 q3 G) Y9 v  return;
9 I/ o0 Z- e" S; A1 C}
5 z6 E$ v. T. Q9 C" [$ [5 V+ M$ U6 f" Y$ q
int main( void )
- f7 H6 [' w( j) n) o{; o9 K- [/ k) j- S4 L: s

/ a1 t( n, T& u    /* Initialize BSL */7 T1 x' ?2 q" ?# H( t
    EVMC6747_init( );
+ p8 `) C: ?0 s' c* ~        /* Call evmc6747_intr function */
. t5 ~- t( z) k$ a2 \2 R4 N2 f    aic3106_init( );
- J6 q+ o9 D' A8 r; m) g        while(1);
' ^- f- \6 {7 g( P. g: F8 k}) i6 X( G( `; a
7 w/ L$ ^, J8 v: N+ P  k; |

5 M5 n- U; `: I( ?aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
4 B% [. y6 L- T8 i/* Initialize MCASP1 */7 D- ^5 f# O) F* D9 g- x
    mcasp = &MCASP_MODULE_1;6 L( S; \: x  g% Z& R( h. J
    mcasp->regs->GBLCTL  = 0;       // Reset
: L9 L2 w5 ^( r    mcasp->regs->RGBLCTL = 0;       // Reset RX
7 b3 s! [- Q. e; f! b  ?+ w    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ O6 g/ E* I4 V+ m' E* b$ U* t    mcasp->regs->PWRDEMU = 1;       // Free-running# ~7 g" k1 d& i# p
   // configure McASP0 receive registers
1 w+ O0 @: N7 {% L  h    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used! r" Q  H- k9 Z
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 e/ A7 ~3 ?. W
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( S. a  }) s9 \$ }* T7 |4 |& o; j    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ Q5 R, A' m2 Y5 R0 b/ ~6 C
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)% w$ v( O/ U; U
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
% t5 R7 ?% E7 u8 Y0 O  h0 e    mcasp->regs->RINTCTL    = 0x00000000; // Not used
( C* p6 C1 C$ n! h+ }3 z& a    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 P' o1 M0 c6 }6 C6 m- `
7 @% b1 t" J9 B5 D
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used5 O9 J6 _7 S* i& y8 b$ a- h- H
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% q0 G9 y! J3 d. s" p" h    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word: h7 O( N2 M1 `% L% c
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16. K0 S4 x8 Q9 a+ e) @9 U; G
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK4 ?1 ]5 y) y/ \$ X; X5 l# \
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
- N6 W: k3 r. O" d- i    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
8 a& Z. P! K; D) V6 p2 T    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) ~  j* t  {% p8 o+ P
# Z8 P* `4 T# M- ^, W8 I# N
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
/ Y& s) P) v! p8 I    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT% I" F' g) S7 x3 _
    mcasp->regs->PFUNC      = 0;          // All MCASPs9 U8 D1 J' l7 @9 ?, V" e
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1- F$ L8 O4 i2 m, }; U

6 F! q0 P+ t, ~5 @    mcasp->regs->DITCTL     = 0x00000000; // Not used: P( y/ [; C5 `" k" ]3 c5 V! a
    mcasp->regs->DLBCTL     = 0x00000000; // Not used/ Q. q4 u3 v- l$ J8 x
    mcasp->regs->AMUTE      = 0x00000000; // Not used0 G8 }5 i4 [3 J0 d

$ D+ s3 T2 a( I* j; E+ m8 _/* Starting sections of the McASP*/
* B3 m* q% ~5 F- D    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# V9 N" S1 N! a4 I0 C    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
9 b9 s8 p9 d9 O/ h0 m! i6 Q, L% R    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
0 ~: s2 x. Z7 q4 \    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" I3 z) C) @. O0 V
6 V) c- g+ [$ R# g    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; " R& Z" ^  \4 m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* H2 ^7 P% W  f2 O4 ]3 X6 h    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- x# _- F5 g- h* [" E7 I2 }- }( r    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
. n' t% @& B9 _* Y: Q! Q
9 ^+ k3 V# ]' b8 l; `; Z    mcasp->regs->XSTAT = 0x0000ffff; 6 O% t+ W# ]/ q  @  c2 P1 k  x1 {" l
    mcasp->regs->RSTAT = 0x0000ffff; 6 C+ }( P: x) f6 ~% Y

* {4 g' y# L* B% i0 v    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;% ]! `/ a: \% D8 X4 g2 Q0 f5 Y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );6 o% i8 z3 }9 C8 Y( _* h4 P
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 N' g! ^* x2 l- ]# M8 Q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 H! M! {6 n6 f4 e
4 o) S1 I6 |' l& x    /* Write a 0, so that no underrun occurs after releasing the state machine */: [/ @3 d  K& x# D/ W/ @0 }
    mcasp->regs->XBUF5 = 0;
8 [7 G* D, k: w* _; w6 L/ t) C    mcasp->regs->RBUF0 = 0;, m2 g$ a) v0 q" T& V+ ]4 L
  ]- M1 m  G  J: w! ^; x
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
/ d/ V+ ^2 K) y! e9 Y) K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( k: l  Y: {- {$ t* W, S    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) x9 `7 |  p& u9 g    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 ^1 c) k' }6 v0 Z4 L9 [# }

0 F# |7 G* H4 {8 f1 u5 R    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 S0 e7 ^$ L$ H6 r& P* {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 r! E6 \4 n/ T7 ^7 @9 U2 S    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; - L9 h; a8 p7 G3 x2 f0 N( L0 q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( p$ ^! }" g/ ]; Q2 ^5 J7 h* V4 W( z! ]' M; M" m3 o
    CSR = 0x0000;; D  ^, N+ M8 ]2 O2 v+ F8 M
    INTC_INTMUX1 = 0x3d;( ], i% u& @! n
    ISTP = (unsigned int)vectors;  C2 N) [$ D$ V0 Q6 ^  O. f. a/ [
    ICR = 0xFFF0;  1 r0 k/ z# M9 f
    IER |= 0x12;  ! ^& m, `) H+ q' k2 {0 G
    CSR |= 0x01;  
. s& k, c) q0 L+ L8 o: }+ k+ \+ Z9 v8 t# p  t' q# M9 m, A# o6 G
- m0 D' B* l, c% S- X
- c. b1 X9 @3 W) h- M
还有就是两个输入输出函数:
# b7 a5 V; j1 w1 pvoid output_sample(Int32 out_data)
; y* T$ A1 G8 F/ o{
/ k) _/ f% c' u+ i  AIC31_data.uint = out_data;  
' R: Z6 m/ g3 g  K3 o* P  MCASP1_XBUF5_32BIT = AIC31_data.uint;, @" d- I: G# h- t# ]3 j  L! ^
}& G' P8 o# D% E5 s, t7 V2 M
: x! m& p) ]' g9 X# C
Int32 input_sample(void)
: e* ?+ y# l+ I8 w{  2 [! ~+ O! Q2 X% u+ X) T
  AIC31_data.uint = MCASP1_RBUF0_32BIT;3 r" _; N& S# p0 w. _$ _- d
  return (AIC31_data.uint);4 h( N: F0 j; ~5 {6 ]
}; d3 H" a1 o7 P; E  R  a, l. Q- t' m
; ^& `) ]6 \! D' x& Z: R! C
分享到:  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, 2026-3-3 16:51 , Processed in 0.043751 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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