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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- O, R/ ]. j* i2 p: _/ ?main文件:  s  A/ u& M  z' `' v$ D: G) i
interrupt void interrupt4(void)  " W& l$ C. F! ]3 Z5 ^/ ~/ v3 X
{
, n4 V8 ~9 g" P8 d, x+ {  Uint32 sample;& C0 D/ M- i& i! r6 @* }9 Q+ R

  {* c7 h# \5 r: Q2 e( M" C( v, N  sample = input_sample(); // read L + R samples from ADC
9 y3 `+ Q; M. z' u  output_sample(sample);   // write L + R samples to DAC
! X4 V2 m7 B0 z; E+ u( z0 T  return;) t& M, i# e) E* U
}% \3 u! c' m! d) Z4 l
' P4 b+ g" o# X3 [9 }) w; F7 A
int main( void )8 M! S! K1 W2 o1 a( s! |, {
{
4 K5 t3 Z, L& W; {* [: h6 v5 w+ d
, X3 z4 s% n6 [" c0 ]* i2 F& r    /* Initialize BSL */
- g9 I) {1 |1 o9 G& y7 ^    EVMC6747_init( );, n, D& e. W2 E# p: {! f
        /* Call evmc6747_intr function */
0 Q& D: L& k4 j, H8 R- w    aic3106_init( );
3 k& x7 J- ]# y/ g! v0 g# d/ M        while(1);
9 c; W( G4 Y) X}
5 @; P* O1 P7 C- i1 v- X$ c) [: G; }
/ i1 j8 B. ^. I, s& I1 U
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
% @0 C# i$ @+ Y! d2 X! r  p! S( b/* Initialize MCASP1 */
1 v) m: W! o1 @; b    mcasp = &MCASP_MODULE_1;
. w( \- d  i9 h$ t( g    mcasp->regs->GBLCTL  = 0;       // Reset
! @+ \3 r, A7 v# ?5 g# R2 t: T9 K4 i    mcasp->regs->RGBLCTL = 0;       // Reset RX
( E! z$ i. {5 H/ j, H2 E  A( B    mcasp->regs->XGBLCTL = 0;       // Reset TX
% a8 \) Y; w  I/ l6 W/ Y0 H    mcasp->regs->PWRDEMU = 1;       // Free-running  V' Y) l8 Z" p: s
   // configure McASP0 receive registers# i6 g- n+ ]! u& d- H
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
; P4 a7 _7 _7 a6 u; k3 U+ \    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
  h: |& j7 K, _2 J    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word7 P3 [" e, @8 ~, n
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)( F7 @9 j! N& J$ Z& ^
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)' A! K' y, w, ~+ D1 `7 ?
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 i/ U+ c1 E' l  {2 e1 U* s    mcasp->regs->RINTCTL    = 0x00000000; // Not used
( l/ V7 y9 A6 }( I7 O, b5 m" {    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. r+ F3 p5 R! `: d! J/ x* v

5 F2 r7 Y# Y  q& }9 A5 t2 i5 [    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
( ?- F" T( }/ A1 M( S    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' @# R, X" w, u/ e) E* e    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
  ~- p; P7 E- E    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: O3 G6 x3 d. a' K3 v, F: b. g    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK% [, U9 h8 t  N
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
/ J4 o4 p7 b$ o, i    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
: d# J) Z& H+ b, P+ H8 r- b    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* W5 ^7 M, q, t: R/ p, Q
) x, l6 ?7 N" D    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
1 O3 j- F$ ?8 B# y2 R" d    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT! J0 L$ K, I( k( m# Q
    mcasp->regs->PFUNC      = 0;          // All MCASPs& t" \9 G( y7 E% S
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% z! z" d  |, [" R0 K

# Q0 k$ K4 o8 B9 Z6 g- y    mcasp->regs->DITCTL     = 0x00000000; // Not used
" F) Q$ f0 v2 O/ Z8 y! C% l, ~/ a    mcasp->regs->DLBCTL     = 0x00000000; // Not used
5 x1 W2 D  E) ]2 ?' D    mcasp->regs->AMUTE      = 0x00000000; // Not used
( j0 v' G! c; L2 H! Q( ?1 x4 O! W2 Z+ D  O; g3 l
/* Starting sections of the McASP*/9 g  B1 Y! f' r
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( j/ D( o+ o; n6 Q; g/ ~1 z1 g    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  : u/ [3 Y3 ^7 z! c/ |; M0 c
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
0 y5 i! w1 e! |% y1 w9 o/ {) N    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 S) D: \5 v) L% }$ U/ b, t. M
+ x! d! @, H2 L0 o% v1 z# Y2 v    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
! L. g8 L; t; z7 j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );3 A  @9 Q/ b0 ?
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
. w1 c, k+ b, N    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );1 ^# I( S! y5 L4 F  e3 f$ Y) v

+ U9 }# |, {+ W: \2 G+ [$ L) z    mcasp->regs->XSTAT = 0x0000ffff;
: P& {; |  i, a( |: u    mcasp->regs->RSTAT = 0x0000ffff;
: t0 |( P0 N+ ?5 {- Q
# p# G5 e7 v. g; t    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 N' `1 [3 i' |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 Q; E' d- B/ x8 P) K. ~; p$ |
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% r" B) m; ?9 L3 L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 o( G6 W& @$ j  L8 Y8 c

/ x  M2 S- F7 a; [" @( C8 u6 C* x4 {    /* Write a 0, so that no underrun occurs after releasing the state machine */
, R1 b( f. [: o7 e    mcasp->regs->XBUF5 = 0;9 {+ ^3 |! s( _, a2 U6 \
    mcasp->regs->RBUF0 = 0;
" ~9 |; t; Q! b: H, Z$ M) O0 j, ?& A6 D. j  _& b" b/ S0 z
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - B- b$ X/ e3 h( \) k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& v: {) ?  F: W$ V8 }! A    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; / e1 `) A: O) h: I: ~: J
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- p# Z6 ]0 [# @0 y: X: g2 H
- p9 k0 H+ L8 J8 P& o, w* s+ a2 u    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 4 {( ]6 j7 G  U% j
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );9 l" P+ [2 E0 a; s" n; m8 o
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ ~/ x/ W" V, S7 J    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );/ D6 y8 K% [+ i" F
, O1 g: l9 |7 k& E, @& U: d
    CSR = 0x0000;! C+ ^. r2 `7 c& t! Q: _6 S
    INTC_INTMUX1 = 0x3d;4 _- O; A& w8 D- p# [& P3 z+ S0 }5 w
    ISTP = (unsigned int)vectors;
+ i, z. e7 a' J( R6 H: K0 _    ICR = 0xFFF0;  
1 u8 Q2 [( k. u1 E1 `% b    IER |= 0x12;  7 D; D  l& }9 X% r3 h( S
    CSR |= 0x01;  
4 q' u. \8 `+ I8 |/ T( W7 r( h* Z4 t

% ~2 ~/ `- \4 A5 n4 f4 V# \- s. e
/ v6 b; W) p( n, `+ }* M2 L; a" Q还有就是两个输入输出函数:
/ G, d4 N/ A5 w# ovoid output_sample(Int32 out_data)
) B( Z% Z2 p( Z& [; G  S{1 C8 C5 y/ s. Z7 G
  AIC31_data.uint = out_data;  
4 i% L$ S- @, a- d: u  MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 _, h& X0 {; r/ F9 v; B- }. n}
% s* E; `# \0 k( t0 j3 o/ k  c* n) X* z; }* B4 b1 K
Int32 input_sample(void)
; k. t7 r$ D- J{  * c+ p) I) z! X9 e$ F: f" \
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
% d% P" {9 q1 j9 l8 I4 w  return (AIC31_data.uint);( V& a, t. l' L% u& t9 j0 }5 @
}
& M- n6 ]6 T( l3 }7 D
) V) y, X4 D, G5 ~
分享到:  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-4-4 16:28 , Processed in 0.047874 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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