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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:3 i1 W: e( F0 B# |3 j4 f
main文件:
; d, I* ~% k% y% U5 ?interrupt void interrupt4(void)  
8 `& m* {7 E1 X, S{
/ r) O4 |; d, Z$ i! m' H4 T  Uint32 sample;# I# @, Y7 [+ @4 X9 O7 E* L
7 M( B& i0 S# J0 E
  sample = input_sample(); // read L + R samples from ADC
* H+ ?# D& s  D0 ^" J  output_sample(sample);   // write L + R samples to DAC $ W1 S, Y6 O; D* ?% `" j
  return;* q+ @+ h/ Y) v) G
}
5 b- e" P" G4 y6 Z! O/ ]" y- ^! U* x
# C+ S( {; h! m& a4 t" n& W# Rint main( void )& J' }8 H& ^- I3 G. W
{
2 Y6 ?4 ~" s( w0 \* o9 X5 D) I' b3 p: L( R1 y! E" m
    /* Initialize BSL */+ D  m; U% J. Z& r
    EVMC6747_init( );% m2 E/ y, _; i5 Z$ ]
        /* Call evmc6747_intr function */* y* }" p( ^5 f6 r" y2 l$ y
    aic3106_init( );
# |3 f3 N2 N9 p8 l( V" h) _0 X% \; y, v        while(1);* v2 B: M5 `8 B  q- B( a, s5 E' R
}! l9 a( A9 J1 T* m1 b7 m; E( w6 f

$ p7 V* b, i) E2 U, A
" f, @2 n/ j' `aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- j8 ~( S! I; R3 T7 s. K2 w
/* Initialize MCASP1 */8 h7 m! ~$ l9 N; f) [
    mcasp = &MCASP_MODULE_1;8 t( z( o2 e8 ?, }5 i0 Z
    mcasp->regs->GBLCTL  = 0;       // Reset$ s0 O+ U7 p- P  s- w; C2 x
    mcasp->regs->RGBLCTL = 0;       // Reset RX
5 y  i9 @0 h8 _0 F: u4 x    mcasp->regs->XGBLCTL = 0;       // Reset TX
! _+ W- ^* E) N" y) h; T& J* e    mcasp->regs->PWRDEMU = 1;       // Free-running( O  `6 p" v: v2 z) {
   // configure McASP0 receive registers
8 e$ h0 O" {$ z6 `: y1 u    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used& q' G& y$ ^1 k9 M9 `$ c8 o
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus  X8 m; L- g# h7 \) v
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
. {  {* \3 A. @2 w+ n+ e( A8 e    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ Y  h9 H! f' j0 w  I$ z& Z    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)" s: L2 i- U% Q$ U7 a4 z
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
. ^6 N/ b: t* h' z: s' f    mcasp->regs->RINTCTL    = 0x00000000; // Not used
4 H' }# i) q! O    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& J! E( R8 C, U8 Z2 k& \# N6 H+ q1 i* Y( B0 b3 a* {9 g( r4 c2 F. W
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used3 Z& r+ |( j# |' e8 y: k0 L( u
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 E' K1 T/ p+ }    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ K4 l) Q+ }! S: y. x
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-165 Q- k% D, E& p$ }% v/ E5 f
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK! r5 t# I+ D# @* h4 g" ]0 G' G* Z- r
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,16 g% i6 s- _2 ?
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit8 W( v. X0 I1 q: b5 h5 H
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. G0 N1 H. Q+ O: e9 B
' v% Z! l7 f+ r# g: C
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
6 z( U$ ?7 r3 X  A, V    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT! w: `- |5 q0 }8 M: m! o0 D+ K1 r8 p3 z
    mcasp->regs->PFUNC      = 0;          // All MCASPs- |) j9 w, T% O4 q) w7 G
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX16 \1 u9 ], z3 b* i$ b
  R! F* E6 M8 K2 Z; ^
    mcasp->regs->DITCTL     = 0x00000000; // Not used
* k9 o# a: u/ h) Y: ]; G- S3 U" Q    mcasp->regs->DLBCTL     = 0x00000000; // Not used; `% L! V4 G7 |" V
    mcasp->regs->AMUTE      = 0x00000000; // Not used. s; S* I+ _2 |: c$ x* _: b$ X

! r1 u: ~0 F2 q5 r/* Starting sections of the McASP*/5 [  O6 s8 b7 e
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 Y, r1 C7 @) z- N. m! o! z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
$ P* ^5 x+ q( a    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) d; c4 A  y7 \" j! s' ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
  }9 C5 h$ J: ^1 R* g9 V8 w, I% k% H  e- k
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; $ s. N5 |/ a' f/ V) {7 @
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% i6 Z' _9 W) S4 `& j# X    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % y( y' ^) F" I, N/ d4 z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );' ?3 L1 V! o3 E, ]* z
" X. X' W6 e. Y% k2 o
    mcasp->regs->XSTAT = 0x0000ffff;
' l+ N& J' K! i8 q( Z( Z    mcasp->regs->RSTAT = 0x0000ffff; " D; d) l- }/ H3 l" O

/ d3 R8 l: M6 o' g    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" n' L* e$ S7 ]; p& g    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );+ D- r- o; Z& e  }, C8 B2 _
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
  O. j* [8 W, ^  y; b+ _) |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
" g( i4 e, ^! K0 `9 a& t$ f" m( o$ N) t
    /* Write a 0, so that no underrun occurs after releasing the state machine */
# u0 Q3 U% {7 w* ~% M/ {    mcasp->regs->XBUF5 = 0;  @5 A1 f6 a. C5 S
    mcasp->regs->RBUF0 = 0;' R$ T0 ]' V  T# E

- e1 M# f& O+ x2 f9 Z) J! i    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 X0 u2 V4 f1 P5 h* X! r! S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );- }- ?2 ]' {6 L! I0 h
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & n# @2 j1 l: h# o3 m9 O' E3 y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ N# I3 z  v9 L- N; L4 I+ c, c) X7 R4 o
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 w9 T0 k0 F2 T8 ~0 h- F
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, \6 z5 z: }. ]/ N
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! W8 O$ L& B! B& g8 W/ N7 K& I& h4 A
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 Y! c% U. {0 ]7 F/ z4 T) a  Y6 s2 J: S! @& |3 H
    CSR = 0x0000;; B0 l; r% i+ W; h' D4 u: ~4 S+ }6 V
    INTC_INTMUX1 = 0x3d;
& p6 @: J' d1 r    ISTP = (unsigned int)vectors;
( V$ V1 [6 @' {" u, v    ICR = 0xFFF0;  1 j+ _7 X, C& M" K  }# x7 ^2 V( n( c7 u/ a
    IER |= 0x12;  
+ o7 a( r$ N2 _    CSR |= 0x01;    ~( |* L$ S2 E5 A7 n4 D: w

9 p! Y& P  [- p' o2 v  V4 C
! U/ v: D3 r" ~$ j/ Q, k4 O) {+ p: B: w' V+ L2 H- J
还有就是两个输入输出函数:+ y# v. U" X, X) l
void output_sample(Int32 out_data)
8 l4 R* G% i9 x{3 f0 B8 }5 h) i3 F$ Y
  AIC31_data.uint = out_data;  
* p, h& E! X* K) d* S* a# s  I1 g  MCASP1_XBUF5_32BIT = AIC31_data.uint;* Q8 C5 \/ N; L" W3 `. p
}
0 z) ^# D! l" H" @/ b7 i, V8 y& b6 q5 G
Int32 input_sample(void)
" l6 E2 Q; O- I( G{  
7 Y0 K0 V9 D; @( ^+ v8 ~& \. [  AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ i! P2 \' R; L3 K  return (AIC31_data.uint);* |3 O& L" Y; b, r5 R% W" \
}
/ P- ], o6 b! V3 Y8 ]! l  Y
+ v4 [! H0 b, Q7 }$ [
分享到:  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-1-20 03:31 , Processed in 0.043482 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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