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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& w7 S  u# X; ~% xmain文件:
4 `& M, \. n. v2 ~interrupt void interrupt4(void)  5 v) N: q# {% g( M. ^* r% t3 k6 z
{! B0 `9 X1 ]5 K; r1 m
  Uint32 sample;
; \8 d2 [' Q) P: ]1 L1 F: `) X- [& R9 @9 Q  S. D: k
  sample = input_sample(); // read L + R samples from ADC) v, u) K3 l# }' j
  output_sample(sample);   // write L + R samples to DAC
9 }; |# p, @- p) d  return;/ ^6 y2 T3 z; I" q) t, E) V; l/ f
}8 F; W0 h# O# ?6 \, J! |
$ a5 r/ T7 o9 i4 j
int main( void )
% N6 m  f& D2 ^! M5 }0 c! @{, v: \8 y6 O6 f; Z

- K0 y. S+ ?* L. e+ X    /* Initialize BSL */4 G+ v& y! P; y1 \, g: m  A2 z
    EVMC6747_init( );: f2 U/ m' V; h7 q2 a/ j
        /* Call evmc6747_intr function */
( S2 k; R. x" U0 M9 P* k    aic3106_init( );
. m! I1 z7 D5 F; N! U( D1 G' S        while(1);$ \! S9 @3 I/ [: ?! V2 h
}6 `; a" H- ?. S, W

  f2 ?% w6 e; h5 q" _' ]' S' S! T# E2 j
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
  C6 {% W" b4 j: N- A, E. `- F/* Initialize MCASP1 */
" k+ i& I' S: X1 ~9 G    mcasp = &MCASP_MODULE_1;
7 d- [3 M& O$ a+ i+ b) c    mcasp->regs->GBLCTL  = 0;       // Reset
, m" X5 [% N7 f, Q7 ^+ [8 P    mcasp->regs->RGBLCTL = 0;       // Reset RX
7 X3 ^6 ~; D7 R: ?8 b    mcasp->regs->XGBLCTL = 0;       // Reset TX
9 I4 A2 ]0 v; X! N9 m8 E, ]    mcasp->regs->PWRDEMU = 1;       // Free-running& |: n! t8 V1 @/ Y, j6 B! m) g4 m
   // configure McASP0 receive registers
& D  u9 t4 X; r8 ?3 i    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used& {! y' J$ u& j8 `. E1 Q+ G
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! N6 V9 o3 L- ]7 ~/ g' ?    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word3 H9 x1 N/ e& ~" o; k' [4 ]8 ?
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)9 O- T0 O/ C0 Y6 p" ^4 C
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)0 y, [, `+ d2 C' U
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 S- n0 O( B1 k! o- y, q6 G    mcasp->regs->RINTCTL    = 0x00000000; // Not used' {. ]1 ]; {1 s9 o# H7 ]
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 G+ t, M8 w3 t& w: H) j9 K5 {2 t! h6 X
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used; b8 B# v( q0 Y! W, i
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 \8 {* x: S% z( k. L' q% @: N: u    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word1 j5 {  I  |: s* ~$ {+ i  M
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! t1 A5 E  t3 \' B. q
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
0 C! e; `: q- g5 q& j    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1. \& L3 g6 z; @
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit# r  D: v% Y5 e: @  g( Z" d4 ^
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% w* Y5 ~0 K4 O2 M( V! d8 u1 |5 l4 i! a' [; X0 ]& a% Y; z. Y
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN. K" ~$ v9 K! o1 ?  f' L
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
+ @4 R% x  ~& `1 N$ |8 p3 \1 a3 E    mcasp->regs->PFUNC      = 0;          // All MCASPs
. V& b8 f2 f) N. r3 y    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ z  p9 f) M4 y. S

: L$ s& H3 \3 F+ n& r( y4 z    mcasp->regs->DITCTL     = 0x00000000; // Not used& B9 k. s4 L2 _
    mcasp->regs->DLBCTL     = 0x00000000; // Not used' V+ g! g) U" C+ f6 J- y& F
    mcasp->regs->AMUTE      = 0x00000000; // Not used
) u. q9 ^: a3 [/ P6 o+ u1 o: d
( s9 i8 C/ f$ |/* Starting sections of the McASP*/
, X1 |8 Z5 C- G; F' y    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' p- O2 Q( T" {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  1 i4 x8 m, \; t
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 o; D, }) y& z8 h' w) k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ A) d* M% K" D: @2 ?2 a% i& ^' [  ~; e0 k% v4 g( a& o% ~# Y* C
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, V4 D. \$ X/ U    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
9 u# h% b4 @% P8 E. U1 H5 e    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
. C" |+ A4 c) Q# C+ X! ?0 ?  c    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& q4 k/ m3 y! ?
5 L  n6 }7 H2 u. o    mcasp->regs->XSTAT = 0x0000ffff;
6 @8 h6 o7 z- f    mcasp->regs->RSTAT = 0x0000ffff; - u* y$ M" [) p# h2 p, p* o5 m0 ^

1 O! w$ q* g3 v/ x6 D5 Z: @0 s    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;8 }7 f* x( N& W( X" z% _
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );5 C( [/ b% w4 C$ ]3 ^3 `# K
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
7 `# G$ W3 I$ h9 n/ S& n  \/ G    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 K+ L% T5 Q' x0 p2 X1 c
/ P5 z! V# [; F1 n/ p/ `; B7 ~    /* Write a 0, so that no underrun occurs after releasing the state machine */6 [- N7 t4 g/ e) H1 ?
    mcasp->regs->XBUF5 = 0;
5 z( z2 Q; W$ D, _$ F* q    mcasp->regs->RBUF0 = 0;
* i' {/ T& g) x
7 S6 y( U' J2 z3 X5 A  a0 A  v; ?    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: A1 K: {8 e# U$ L, `6 [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' Z: b1 ?5 g, l$ C/ l, ?$ D    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 4 G$ c+ X& u6 S; i& C% O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 g/ d  d# Q6 J8 U; B; @! x- b2 F; M0 ?6 y) F# f/ N. r
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 v4 @& J  O! |( L8 {
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" f$ D4 E6 o! c6 O9 k3 D    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) D  n; c7 U0 ?9 N+ D( n
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );$ x6 {2 m$ T9 v9 Q* p' y6 `& i

) e& K, U) x, s- o2 q& A    CSR = 0x0000;
. m, l# ?7 s* v! v$ H7 ~. s! F& w    INTC_INTMUX1 = 0x3d;. I$ q. f* u7 p9 C5 F2 |
    ISTP = (unsigned int)vectors;
& l, c: F' @& M/ _    ICR = 0xFFF0;  4 E! ]/ h5 x- X' O, J& S) {' v* ]
    IER |= 0x12;  
3 H5 x/ P  {) c( y    CSR |= 0x01;  " ], g7 w6 ]/ ]6 ^

% L6 t, T* W1 I9 u9 @
+ ?( \9 {9 o2 e# z+ K! [2 ]: Q3 q6 l- z7 C) G9 _, j5 G
还有就是两个输入输出函数:
( l9 N( p( w: n+ K" w5 hvoid output_sample(Int32 out_data)
1 G$ g3 {; E1 G& V! @) z' u{% D) O. \  V* B- s8 M
  AIC31_data.uint = out_data;  1 g0 I6 s) q& Z! N. t$ U8 e
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 T7 I! M$ ?, C2 }}/ r( V5 p9 s( g% |+ h7 ?& E

% H+ w0 o9 {* E1 D( pInt32 input_sample(void)7 Y$ f& y  E7 o
{  
, a2 `+ A; e1 x- X! H  B- \& o$ S  AIC31_data.uint = MCASP1_RBUF0_32BIT;% m: x- a) K( l. n' [# y
  return (AIC31_data.uint);
" o2 E2 g* _: b' @0 o+ @! _  i: v- x}
+ G& ]4 ?3 @5 J5 G( q& |: Y
: y, u& W8 V' G& a
分享到:  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-6 07:04 , Processed in 0.040306 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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