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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 l# Y- L" P3 E# Amain文件:
5 A# }" E8 Z" P9 `! \interrupt void interrupt4(void)  ) y& O9 [0 E6 W, j; T* z3 U
{9 S5 m+ D( J# d+ Q; l" {4 {3 k0 y
  Uint32 sample;
5 g: p' ?8 M/ z% [2 F- A! Z( ]3 W, @9 Q
  sample = input_sample(); // read L + R samples from ADC
! _; p& E* L! c4 ^' i' d" Z, T  output_sample(sample);   // write L + R samples to DAC
* y5 R* b& J) J  return;
+ r4 l/ p' ?4 t- e( ~+ K4 l. Z2 E5 z}
0 D, r" m, l# g; S: D* ?  K/ R' R% B) _! V2 L4 G' K
int main( void )
6 D% Y) W# H7 x: S{: s$ F) e1 g5 t4 u

) _' r6 g* r0 D+ A# g    /* Initialize BSL */
$ d) Q, B7 c6 z5 @( |/ ?5 e1 Q    EVMC6747_init( );4 v) f9 p/ _! k  o7 C4 @
        /* Call evmc6747_intr function */
3 v, z! f% k2 F  A5 W    aic3106_init( );
( d/ R6 w& X; z' }" W& S& g        while(1);: V6 T6 |  Z7 i8 y' y
}
5 u6 T: s  ]- X- u% p$ {
: Q6 P8 d/ O$ d: Y! E8 S7 M$ j" H2 N
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 o: f5 o/ P" z7 d) g4 _+ p
/* Initialize MCASP1 */
- J4 [' Q4 Y- o) K; }/ Y5 g* K" w6 A    mcasp = &MCASP_MODULE_1;; c3 z. [0 y7 H$ h
    mcasp->regs->GBLCTL  = 0;       // Reset0 H$ V" n6 s. p/ l1 Q9 C2 X
    mcasp->regs->RGBLCTL = 0;       // Reset RX
+ c' Z& |( k& s  i    mcasp->regs->XGBLCTL = 0;       // Reset TX
; C% s3 `/ F- J  i    mcasp->regs->PWRDEMU = 1;       // Free-running' c: f/ A! [# M- k1 z* W+ U; T
   // configure McASP0 receive registers7 Y/ T5 ~$ x: w* k1 ?( r. o
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
. \% W/ U* Z- N. N' ?    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 b- R# ^5 }9 F0 Q0 A    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word: ]7 P' a5 {! D9 F' L
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 X( I* |# V, @. [; M5 k5 b7 k5 |- `    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
# p% f9 Q8 r8 N- D! @8 D# V    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
) m  \* X5 s, K/ u    mcasp->regs->RINTCTL    = 0x00000000; // Not used
- ~3 M+ e% i: K" @4 c( M$ O3 S7 L    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 r5 E9 ^7 s, a: }7 C2 d3 x. ?) h6 ]/ E
# R, I1 ]3 w8 ]0 J- t2 L) q
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
6 G- o& E! }3 A$ F5 E' T1 A, R    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' e3 s6 x* V" G* b$ J5 K) o9 q+ J! [
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
0 \$ w$ m8 ^- i1 b/ P0 y  M    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
  n: t: J6 X/ K) n2 d    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
7 `0 z6 T- ~% ^0 J/ N    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1* R) s9 d2 ?! o" s" B
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit" Z6 ~4 o' ?' R' }
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 B( {4 Q- V# S$ x2 t, S
( s3 o! T6 r5 f) k( ^6 U, r# t
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN* R% j" ?( K5 L& O+ A8 d
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
  o0 [9 ?- O# f0 O+ z    mcasp->regs->PFUNC      = 0;          // All MCASPs; a2 A+ G. J, o4 t0 H6 t
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX10 r$ b% \0 V3 V+ w. W0 ?! M

# P7 g" R# ~0 m$ Z    mcasp->regs->DITCTL     = 0x00000000; // Not used
; b/ E2 e' P' t) F+ q$ d    mcasp->regs->DLBCTL     = 0x00000000; // Not used
" d" u( R9 ]  E/ _4 t9 w) g    mcasp->regs->AMUTE      = 0x00000000; // Not used3 W, A6 J$ B  S( [. W) [2 ^# ]
6 i  v8 P0 m% @% A2 }( Z9 g
/* Starting sections of the McASP*/
/ [- d4 M$ z; J5 j" W& q& ?- t, i    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 p3 g8 t: t0 I) O! \( }    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  ' X; N% d. M6 q) G6 _  a7 ~
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 1 A+ j9 j6 J0 }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );: ~/ r( O7 }& `4 T# Z
, Y0 Z$ W% p. Y. `1 t- [  ~
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
- i+ X, }; [8 I$ ~: ]1 }    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 z. Q4 ?3 K3 u
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- g- R! ^4 W/ ^0 U$ f    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) E4 |* i  l9 W# e+ I
  O) ?1 ?- D7 Z    mcasp->regs->XSTAT = 0x0000ffff;
7 b3 D0 B' y* y& ^* p  s    mcasp->regs->RSTAT = 0x0000ffff; 6 X+ O3 g" Z( U6 R6 P# f
8 \# H- d$ |8 i2 u- J6 Q% C
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" m9 l3 L, l! J+ W7 v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );, O) L9 `2 x. s8 N
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
8 X# \& E# ^, p2 t    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );! U0 u# ?, u& N' A8 W7 p
: p% U+ }  A3 k  g
    /* Write a 0, so that no underrun occurs after releasing the state machine */1 v9 f6 M4 {8 _4 o; [; }9 c/ j
    mcasp->regs->XBUF5 = 0;
6 }3 [' l: a1 }# f! K( j; g8 j) b    mcasp->regs->RBUF0 = 0;
  @- `8 I% t, Z5 q% W  ]% w) |0 Q" f2 U7 J$ m8 D* u& `: b3 I
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! I" ~2 Z2 }( v* m    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );* \  X, o* {. ]  X* h$ Y
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 g0 \# y& @7 ~7 |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );$ h# N; X1 M4 z$ r! P( @" R3 {/ M! d. G

) a/ ]+ c) E  R% v2 s2 r' X    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 7 f9 T5 E, P7 u% o6 D
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' v& u1 [! A; y    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 z' x: K9 \$ |# @* @    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# b4 _5 `! k3 D: [6 `% V, x1 L8 s$ L8 `" N9 u
    CSR = 0x0000;/ s8 T  n) _5 }$ V) f& V
    INTC_INTMUX1 = 0x3d;2 c4 W" ~, B2 h4 B! e6 ]
    ISTP = (unsigned int)vectors;, m  Q: [$ ]4 E( l' T/ y1 x  G' q
    ICR = 0xFFF0;  
) @' r( ], X. G    IER |= 0x12;  
/ X6 Z+ l* n. H% u7 a    CSR |= 0x01;    A$ v1 x4 d9 x$ [/ W6 {# k$ b

% B. F  j' H8 y) ]# S/ z
& O$ V8 f: t% M' O# b7 @: A1 B9 K9 F' L
还有就是两个输入输出函数:
) k6 i; K+ }- o+ w6 t, I2 i9 g+ [8 ]void output_sample(Int32 out_data)
. Q) ]& q% o5 g: m  q. j6 ^1 i{
& ~5 y4 a  I! w3 l$ T- d  AIC31_data.uint = out_data;  1 I4 u. Y  @) z( z0 r. v: L# s
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 c+ }, c2 |0 o: h; ^}+ J2 ~' F+ }, s- K

; A  I8 F" ]6 D7 K) n8 B& u) mInt32 input_sample(void)2 ^) q6 l( P# T/ Y9 R  l
{  
9 w/ f7 o. R! A8 |9 z  AIC31_data.uint = MCASP1_RBUF0_32BIT;" D* D3 D2 D- ^) I! m, o! y8 \
  return (AIC31_data.uint);
  d8 i; _4 H9 |5 a: C}  T; ~1 z( h  D  p" A' F

% c  }. j; I5 h: Y* X1 I" \4 D; v; B0 B+ {
分享到:  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-12-3 10:31 , Processed in 0.039826 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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