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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:8 l4 I) w, v* A& j7 ?
main文件:
; D/ m2 Z* h4 k$ ^interrupt void interrupt4(void)  9 e8 @" w/ r' x/ U
{7 ~* ?, p0 U. k) D
  Uint32 sample;) |7 [- t3 u% o

, y7 e0 @. Q# a/ s. \  sample = input_sample(); // read L + R samples from ADC
% o3 N( v6 B9 l: N6 z9 q  output_sample(sample);   // write L + R samples to DAC
3 f# b" e( f6 Y9 r! [3 V  return;, r( Q: a2 |+ J. i7 Y0 P/ B3 s" Y# J( D
}9 ^2 n; s7 o2 e2 T* R( X; L

- i/ ?  n: p% N$ }int main( void )
8 y8 c" ?8 m6 }5 F: A{- u  r! B% f; L
9 M' `$ K2 h! C0 y; b8 J# b! C
    /* Initialize BSL */
% D6 R9 |# W. q5 m- G    EVMC6747_init( );, I2 e' W% D6 ~: k$ D9 j
        /* Call evmc6747_intr function */9 F2 `1 K* v' M
    aic3106_init( );, C& m( [, K' h4 D  ^2 d7 n
        while(1);3 a0 F% q$ L8 g0 Q. p, m
}  M1 _9 n+ g1 W/ S- l/ F
  B/ k& H8 k  V4 g
$ v/ X  t  D* s* A% A# @
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 O  ~4 G+ f  U8 b) k/* Initialize MCASP1 */
/ r, Q* Z+ W: X( W* C9 Y9 x    mcasp = &MCASP_MODULE_1;
& ~( [5 A  B) R5 H& u: T2 ~    mcasp->regs->GBLCTL  = 0;       // Reset9 x& e/ ^  F4 e# K* `$ y. T
    mcasp->regs->RGBLCTL = 0;       // Reset RX0 j0 r7 y; v0 z( ~1 Y( S' I; a9 v
    mcasp->regs->XGBLCTL = 0;       // Reset TX, q1 D# `* L4 O% X) m( q
    mcasp->regs->PWRDEMU = 1;       // Free-running0 r9 h/ l1 U( [9 ^- S
   // configure McASP0 receive registers
7 H; G; w( T8 g% [    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used/ ?" k$ k) q( d/ N
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- @5 c' C. E" [# q) _    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word- y# w, o- A8 W; M! I
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
3 @0 m! P; L  Z; P; f/ y    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)3 C3 g3 }0 p* f& j" t6 ^
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1* x- F- Y. j! ?) N
    mcasp->regs->RINTCTL    = 0x00000000; // Not used* v; O$ }' j# O  |9 ^: [8 a
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* f# N! x: ~  ~( b1 s4 M
% w* B% W0 x4 \5 @& c+ ~: F/ X    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used5 _' ?2 P/ M" x& n5 b9 n& V
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 X5 {7 `7 m" \) N$ c" T, P    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word( }9 `4 H0 W. i# d, X$ `
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
  }: b1 k% j; L+ [# O    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK3 F2 P! q6 B3 T3 A/ h
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
$ ~% N) s$ K9 F# p! ~7 _    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 h/ ?2 k, V( ~# U1 C% P' w! P    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* t. t, T0 b5 N9 h$ X- a
' k5 P+ A5 R! d) X( y    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN0 I  V+ e* T) K8 f3 B1 _8 k$ R5 P+ y
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
" N: v' p2 D; ?) T* k8 n6 t    mcasp->regs->PFUNC      = 0;          // All MCASPs8 D8 Q  U0 H& s" G* U  b
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 |: c0 y/ @2 M* P
  D+ v5 h- W, X6 m8 x    mcasp->regs->DITCTL     = 0x00000000; // Not used* G$ G( j, Q+ Z1 V$ y" h9 V" z( w
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
  K$ N6 e8 [1 c7 a    mcasp->regs->AMUTE      = 0x00000000; // Not used. Z: j& J5 s. W' n& k) S6 e; c

/ }  ~; c; ~% B+ Y2 C  A% n/* Starting sections of the McASP*/
8 J3 `; H0 w7 W, w5 n, x( R    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 9 `. d: t7 E+ q+ d) G
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
* P8 l# n+ r7 A, E    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( h% o. r5 S2 Q1 V3 }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# L0 F! A( U6 e6 Q- u, n: f1 y1 D3 ]- t. S7 h
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # [$ g& I: S3 X& V/ |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" q/ }3 i/ Y; X" N; G$ e    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# h6 Z( N0 P! \8 b9 ~    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 D. y' N$ W% @! w3 i) ~! V, r- W  x5 n: U5 e
    mcasp->regs->XSTAT = 0x0000ffff; , B; {8 j5 J# y2 C: f/ H& o) O
    mcasp->regs->RSTAT = 0x0000ffff;
9 b8 x7 y4 G& x' s0 `4 A: E* w- Y! u# \# y2 X: R6 p
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;: G- Z9 b- _1 G& |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );! F# a' |$ Y" j- u& c9 Z, M: d5 ~
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. Y+ j; l- z! q. }$ Q9 s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 a& |2 M# N) W5 F$ v
( ?4 @# d, D) `- O5 T8 X  W
    /* Write a 0, so that no underrun occurs after releasing the state machine */3 v* D7 Y+ j- Y( T1 Q
    mcasp->regs->XBUF5 = 0;( y0 F) E* X" r
    mcasp->regs->RBUF0 = 0;$ a1 X  F; h6 J" s$ L! D) A" R8 U
8 v) a' W! N+ L( K- ?% \+ b
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 B" I4 G" j1 |6 `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 M8 K, K" ?6 }* Z* e4 ~. L7 s1 r4 L    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, u7 z1 ~- n5 |, x/ j$ Q/ T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ L+ x5 _9 D/ w. g0 r
5 z  G& M  k  X% r! z* i    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; : ^4 F$ G( e8 L8 l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 h! c8 V3 b+ M$ e* N" v7 L    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 0 A, O, m9 D8 q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 U7 Y5 m& \6 a1 o8 [' D" p' ^$ O- _, i$ w1 p
    CSR = 0x0000;5 y9 S0 i: l' J) L# p8 \
    INTC_INTMUX1 = 0x3d;
& O5 [% R8 W# t) S  h3 c6 K    ISTP = (unsigned int)vectors;" P9 c3 h) P. C- t* O
    ICR = 0xFFF0;  
, u( g- Z! l; H3 @+ z% a$ G- y; V    IER |= 0x12;  ; k4 d; l  l$ `  M# u) L$ p6 z* G+ g
    CSR |= 0x01;  
5 s+ d+ C  o( V! s) b; e
1 Y& H$ X+ v% L0 j7 t( ^% g2 k
/ s# S9 y' [9 H4 Y! h0 B! A3 G6 S- f. Q- g: w1 j
还有就是两个输入输出函数:( [' S: {* c5 t+ e; t+ }
void output_sample(Int32 out_data)# ?" h- i& a+ {+ M7 g7 @1 J
{& q% b1 t- P7 s5 H4 |
  AIC31_data.uint = out_data;  7 n5 l2 M0 v5 j: f" A; W
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
4 j+ a7 ]: @6 W}
9 @: L7 }: y. J. v5 }' E
% [+ M" H/ ?$ ^5 y! C) x) sInt32 input_sample(void)
5 j4 r8 I, N1 g9 F* Z' F{  2 Z+ ]& P  p  E
  AIC31_data.uint = MCASP1_RBUF0_32BIT;# r, r  n5 r2 G) r
  return (AIC31_data.uint);- r8 p+ X3 o# C: O: Z2 f3 B: m
}
% Z* B% @8 [* b' s6 U  v( M7 M% N1 ~5 v' v0 v" m. B" z  q
分享到:  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-28 14:42 , Processed in 0.038690 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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