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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, U# L- c7 X1 }main文件:" b. V- l  p' p$ D
interrupt void interrupt4(void)  
) a7 n: w) i5 K" X{6 p) b# J7 K: W  x
  Uint32 sample;
+ f. |2 b6 R9 ?' x# g$ s! f5 P# U: m: n5 m: x2 g7 i
  sample = input_sample(); // read L + R samples from ADC
: \+ ^) b3 u0 ~- R/ |2 s  output_sample(sample);   // write L + R samples to DAC 6 x3 w; ~- ^- M) c* _( q; ]
  return;! G, O, X2 T) F5 E* G4 _
}! }4 T: ?2 b$ W7 K

) D7 a) |% u" s3 aint main( void )
0 v, l3 ~0 E# M" o( J2 f& o0 H" M{
+ e, M, Z9 }, p3 V  n+ @% O$ \; O8 V9 h0 K7 S2 d8 Q+ Z/ D' p
    /* Initialize BSL */
0 L; n+ \; }6 y    EVMC6747_init( );
  ?! A: {- `  U3 [        /* Call evmc6747_intr function */' Q8 A/ ^! |+ n/ C8 v
    aic3106_init( );
, _: _. V5 z6 ?$ Q+ A: k2 J$ y        while(1);
7 }8 d! s$ A- u# x, C6 u' \}
$ \! `4 s. s) S' `* d6 o9 ^
- B0 y) G8 ?9 p+ G# F6 ~9 h/ d
1 _  F% y; f$ \$ Daic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 L; H  |( g5 ~% h# O0 C! d/* Initialize MCASP1 */" {( b4 @6 |" ~' {, i  T
    mcasp = &MCASP_MODULE_1;: X4 N5 @3 u/ b$ m5 U* {. L. U; d
    mcasp->regs->GBLCTL  = 0;       // Reset! M3 g6 i2 h9 r% @, U# `
    mcasp->regs->RGBLCTL = 0;       // Reset RX
" S6 v9 X' I* c) u! g    mcasp->regs->XGBLCTL = 0;       // Reset TX
6 z+ _3 H9 R5 l    mcasp->regs->PWRDEMU = 1;       // Free-running
. }, z3 x1 T' x. Z  k8 o   // configure McASP0 receive registers, p  M1 \, k" k) f4 @( N" e
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
8 y  A0 h2 ^' z) L5 Y. D- \9 h/ g    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' N4 ?* D; s7 ]/ Q, W+ }% r    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 ~) ?* ^, c9 Z, g# x    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)3 |6 O: R1 U- ~4 [' ]# H
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side): J. O, b* W; f& B0 p* a$ l
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,16 Z, H& Z! _( v" ]
    mcasp->regs->RINTCTL    = 0x00000000; // Not used, L$ x( W& H4 Q- k
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 e7 C2 C1 A9 n% }! Y4 o' F4 h8 g4 }( `) n- w- o% q
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
+ Y: @  V0 s3 o2 k; u% I1 g! ]    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 e8 P5 A1 u0 @6 V+ l& }3 ]    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word5 r! T' ]/ [# @! L$ ?* h) {; Q9 J
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-160 P. N2 q/ B. a3 h/ L( t$ p" r
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK) P# f9 f0 k3 t& }0 j( }
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
9 w2 g9 S! Q( a9 S/ u8 y    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
  C7 t, _! A8 j7 s; L# W- P    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 {- g( ]2 |8 g1 e: ]
" d! q' M/ s5 a+ H) _) ]    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
5 E& ?- [& u0 m% @+ q% O$ I    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
0 d; I; m7 ^% k& [2 @! V: E    mcasp->regs->PFUNC      = 0;          // All MCASPs
0 d1 A3 {& }5 r7 e# l0 x    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1  w7 c" o" a5 n+ B  l& j4 ]
/ J4 _8 ~' h5 z+ X+ u  X
    mcasp->regs->DITCTL     = 0x00000000; // Not used
, o2 _  @) s* Q: q' u    mcasp->regs->DLBCTL     = 0x00000000; // Not used
: {% u# R5 ?! ^# b4 p# P4 l! Y    mcasp->regs->AMUTE      = 0x00000000; // Not used
% A) Z8 b. y9 r' \- m0 R' r2 i  ^, N3 l) [9 m7 {7 a
/* Starting sections of the McASP*/
4 f/ k) R& e# F" V( D    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 D$ R8 e' Z$ K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  7 U: n& v5 ]' n
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 0 i: W) X: \( Z$ T4 A1 |
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 o) q4 [8 K* ^( g, N
8 c- V9 U. x% m
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % N# d- z$ t, D: G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ X' j. ^& ]9 X6 U' s; e    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; " N  L9 U6 Z7 {! M; o- Q2 S3 \" O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
  }- ~0 Q/ b3 f, U9 }3 b0 c: t  c; |8 Y# e
    mcasp->regs->XSTAT = 0x0000ffff;
: n' E+ I) V; E# x$ |5 @6 ~$ Y* Z    mcasp->regs->RSTAT = 0x0000ffff; ) Q0 Y; a, L$ A% N
# E+ K& C) d  L  ~% m
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 ?: z' q* i: u; ]3 ]+ T
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" R: C6 Z5 I: r, u7 a    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* q! m8 s" U. ]: g; r0 j* m$ M$ [    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );8 w: p( T. v, l

1 M) d+ s: l4 I$ m    /* Write a 0, so that no underrun occurs after releasing the state machine */  }8 @( N: v- O& a6 _& u( o
    mcasp->regs->XBUF5 = 0;
. p6 c; e% [1 \: m  W7 ^) D    mcasp->regs->RBUF0 = 0;+ m! G& ^4 ?* M, `7 u: A, M/ m
& [3 v, b9 W6 P* J" v, W
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 k8 ^5 }6 H! u8 h1 c/ \+ B& v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 I6 Y; b9 N; s4 r' e    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & F- A9 P, V+ O4 r0 u! H+ Q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 I2 b! S, E- J- w% c6 q; H) W
' M# e( h" V( |6 q. w$ u6 w+ J
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 P) i. A+ k! U$ C, ?* j
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% V3 V7 v  G2 [0 o' _1 Y
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; $ k3 h" l8 M: i3 R" D
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) Y  t8 G# J, D1 V- |
' i3 i3 G: C& |) k9 |  M: r3 E6 Z
    CSR = 0x0000;+ [" b* s$ I( Z! l
    INTC_INTMUX1 = 0x3d;
; x" ?: R1 h; L& Z    ISTP = (unsigned int)vectors;
) [1 p, `1 ?: }' \1 h    ICR = 0xFFF0;  & Q, f4 }0 i* n7 E3 |+ d0 [
    IER |= 0x12;  
) x$ U' R# U0 R4 D% w    CSR |= 0x01;  5 L- I, _: d2 n
* G0 M/ t$ d1 b' N8 x4 p
6 X, u9 c; J) G% U1 x& Q

9 V' Y( e5 ]1 t0 T还有就是两个输入输出函数:
5 l4 Y- `' o/ ~- ?void output_sample(Int32 out_data)
- I  A9 b3 f3 x. s/ ^; Z: D, s{
" ]+ X+ }( @9 V  AIC31_data.uint = out_data;  
4 _4 m! E' K& G  MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 ?- V" ?( f! o; {9 r4 s8 J- m5 Z}7 Z; N+ T) d# e9 Y; E: T2 _
, H. E% J1 k2 T, o2 B$ N$ X& H/ ~
Int32 input_sample(void)
0 f  |" j$ {* j% e. C# R: A{  
) g5 l# D/ {& u, {: j+ f4 @' _  AIC31_data.uint = MCASP1_RBUF0_32BIT;
8 O# B/ q# C0 D( f: Q) ~' C  return (AIC31_data.uint);
* o/ A' `0 ?$ F; W}
/ T  r% h9 a2 O8 |$ w
! J1 [( c! N/ d
分享到:  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 17:26 , Processed in 0.038408 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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