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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:& v1 n+ a4 c, @% F- }
main文件:
9 |; N' |3 I9 L6 U7 w! d' n6 Qinterrupt void interrupt4(void)  , U4 M* ?/ b+ A. ~: Q. d6 i
{( S) B, k5 I6 D9 l( r
  Uint32 sample;% y8 G+ ?% `3 `. W: ~
9 i) q! ]: u1 R( z/ ^9 [
  sample = input_sample(); // read L + R samples from ADC
7 ^, E8 P0 s- G( E  output_sample(sample);   // write L + R samples to DAC
, ^8 \% l. i- `8 Z) I# D! D  return;
: O- e* |& v5 c; G$ K% X  M}1 ]. O1 y& u5 H) @, {* Z: V

* D5 F; M) {0 T% B( `int main( void )
/ q  I9 J+ J+ r! v8 Z1 Y0 @5 M2 y{' B, S$ Q- \6 `' {  \8 C. Q
  r. S" i4 D" R* B9 ?; `
    /* Initialize BSL */: s( X0 i1 H0 R% e: L, z3 x. ^
    EVMC6747_init( );* ~( S, \+ G( W! X
        /* Call evmc6747_intr function */
4 f2 ]( J0 V" m% H    aic3106_init( );
- j' r6 D* |2 G) ]) ?: Q6 D        while(1);! v# e5 Y: n, ?4 y
}( a1 `4 d0 f+ ?% V' l" v

" D- |" D2 N0 D* B8 \; k/ t% m! n- a+ Q9 @
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题: Z+ T& O7 u. @) J* w; q; H# ?: X% f
/* Initialize MCASP1 */% K/ G3 Y  V; c# @2 X3 M
    mcasp = &MCASP_MODULE_1;
! w8 d" P  f' t. Q3 B3 v3 }# j    mcasp->regs->GBLCTL  = 0;       // Reset
0 T2 l* a! W6 [1 Y5 M3 L3 X    mcasp->regs->RGBLCTL = 0;       // Reset RX
1 O+ b0 w9 j& s0 N: U3 |    mcasp->regs->XGBLCTL = 0;       // Reset TX/ |) g7 \4 o5 J5 j9 }7 s; P
    mcasp->regs->PWRDEMU = 1;       // Free-running4 [! y) s2 L- z  @
   // configure McASP0 receive registers
! G1 L5 D( w/ }$ F- ?& n1 F    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used! J" t* t1 g% J4 ^; A% {
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: B- ]6 p4 L9 Y/ L- |4 y    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 L; P: `* Q3 }7 O    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)% ~; g0 N0 b/ }
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
1 R$ F6 e3 _4 C( I3 r    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
/ [0 d7 b# ^$ H, o8 q9 |& ^" P    mcasp->regs->RINTCTL    = 0x00000000; // Not used. h' i! F: R  m' F* h% f% J  x6 w+ u
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. ^7 A1 I/ G- _( ~
) ?5 R, f4 r+ E4 M    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
. W' j7 X* J( f& M4 E9 f7 f    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 Q- \& B7 F( V& a1 p1 A7 d
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word( W0 D0 }7 a$ B3 Y$ O
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-161 Z$ o1 X+ y5 r7 [7 Q9 y9 c! O
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK* B3 I" `+ R" E% ^: h: ^. u& g
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1) i# `3 [+ }0 B5 t: B6 }
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit+ P0 y) ^. y3 h+ d& o$ }- F
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, w- ^: b6 Z2 X; }7 U

6 d# C* |) {9 f/ o7 r    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
7 {" v: a$ J  e! @6 I    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
  ^& M9 k" L4 g! ~9 s6 Z& `4 n    mcasp->regs->PFUNC      = 0;          // All MCASPs( w8 H- U( G$ I* W/ ]- P9 q
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 A4 {* z# v8 ?$ h/ p! J, i  x
- ~) b3 d( _3 s( N    mcasp->regs->DITCTL     = 0x00000000; // Not used5 u( u+ U- X/ _0 y. i1 a# W/ `' F
    mcasp->regs->DLBCTL     = 0x00000000; // Not used9 ]5 ?/ {0 x/ g  A) A- b8 l
    mcasp->regs->AMUTE      = 0x00000000; // Not used3 Q- U) J- s/ n+ \7 q+ d
$ W/ y8 S6 d* b$ j1 D, t/ C$ e
/* Starting sections of the McASP*/+ T7 q% `* a- {/ o
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& V+ x5 k7 r2 j' N2 Q2 W% K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
' l1 p9 }; N8 e* z    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; . L' `: y0 @9 W( `! g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 O6 B1 b8 e& L3 m. E- ~7 r  O$ t' X) C' }8 U
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 \& j: }5 Y8 A
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 M: P" e: A  q. E
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;   g( \6 J3 b; n/ u5 [: j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );: a- E7 M/ J3 `2 V% C1 R" T( [

1 F& E4 t$ A1 p2 ?. _! a: q6 R    mcasp->regs->XSTAT = 0x0000ffff; 3 Q% m2 b. v8 ~- c9 o, V* b
    mcasp->regs->RSTAT = 0x0000ffff;
- h9 G$ x* _: J& R7 g; ], H% |" G/ S* ?
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ N; n$ L- o& w- |6 {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );6 _; ^$ Z, `: W4 z& ^3 f0 f
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% W7 M' G8 [9 v" X$ ]8 G    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 ^# a/ m: ^+ l( ~" U
+ }9 y* D' a: L1 v0 M    /* Write a 0, so that no underrun occurs after releasing the state machine */
/ l. S. F( ?- a' l  k    mcasp->regs->XBUF5 = 0;
4 {* _8 }2 I& l0 C' F5 A1 i  U# p/ q, g    mcasp->regs->RBUF0 = 0;
; I3 r8 I4 l$ ^* D7 d% k
% j3 Q# M2 }# d6 @    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 ?  M3 ~5 l0 o% t- V9 W1 t  P* f& ?    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 I5 ^; K/ d/ y% T$ a. N& I    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; . g/ L3 [+ x8 v* h9 A* Z0 j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 \# h7 x& Y4 D, f2 M

' E) \5 I3 k0 H) ?; {+ L1 D) l+ P    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; J; J& V+ ]: x0 l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ v# y' V6 B3 Q! i9 j    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; & O; \$ V6 m3 F2 X1 x
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 n  J: Y  ?4 ?4 }8 C4 G! ~  C% b
" C" _' }) V3 t  s5 I8 x) ?* Z    CSR = 0x0000;4 r8 x9 h: `8 z. @2 ~
    INTC_INTMUX1 = 0x3d;
9 W7 E! P% Q# z: O    ISTP = (unsigned int)vectors;
0 {' p6 `: j# Y% z7 q    ICR = 0xFFF0;  
3 _! d) A% x6 w    IER |= 0x12;  5 G4 l4 g7 E* B' Z2 F8 F# `
    CSR |= 0x01;  
0 d: p2 H7 @+ f+ E& `  d7 ?- }* _
& j5 a. A# O0 h- N* J  K0 Y
/ u5 c. ?& D6 e; ?6 O" k
还有就是两个输入输出函数:
6 @1 @# L1 n7 R  i  q) `; hvoid output_sample(Int32 out_data)
2 E& ~& M% L% C$ V8 H4 v0 c) ?{
% j& a9 i! ]3 ~, r) E( L& a" d( ~  AIC31_data.uint = out_data;  , E( R( E6 U& C- e
  MCASP1_XBUF5_32BIT = AIC31_data.uint;) g* Y/ T  O4 F
}" H. Z' n! u7 t7 I. y( E. H

2 [4 o5 f) {' d% fInt32 input_sample(void)
/ X3 P7 E$ u2 d0 U8 Z. z- d3 q' v{  
" ?& h3 l' v+ D1 d: Y  t  AIC31_data.uint = MCASP1_RBUF0_32BIT;4 T4 O: ]" p, G
  return (AIC31_data.uint);/ S1 V* t0 d; K, V7 J% N
}; y9 a; T/ w9 v& \
# {. H+ z- h; {/ Z$ n9 P9 _
分享到:  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-2-20 15:19 , Processed in 0.041519 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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