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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:5 K3 i8 V1 n/ F9 p! O8 p: t
main文件:( b' n% I* T6 M, S0 D& s9 Z& _9 ?
interrupt void interrupt4(void)  
4 C" q8 r" v- d; I9 P% [0 @/ C{* [& y/ f7 Q& L7 A$ |/ L
  Uint32 sample;& S" }$ C8 d$ h+ \

' p$ A8 b4 j7 k5 r9 V6 W  sample = input_sample(); // read L + R samples from ADC0 U2 e* c  X. Y0 K! I/ c  M, X6 B+ [( ]
  output_sample(sample);   // write L + R samples to DAC 5 P8 s( S/ t. `$ V' t' O
  return;  a9 d' t2 f( s' B
}
7 H% L* ^: w$ e! F2 N
5 M1 e) v; ]6 I1 L- w, n* Q- a4 oint main( void )/ p  y3 ]+ {9 j; M1 F$ u$ j/ _
{
4 ]8 p: b% F& u2 Q* b; W* n" H9 J  q8 |  M/ Y' H' T6 \
    /* Initialize BSL */
8 [3 `" i; y7 @    EVMC6747_init( );( t3 L8 }. r4 R. B/ _& ~9 `
        /* Call evmc6747_intr function */
. e/ {- \5 W8 [! M4 o# f    aic3106_init( );
# |9 @0 M+ x3 N: \  j9 V( l: i        while(1);
) E9 D7 Q# e& A7 `4 O( |6 p- \2 c}
1 x8 M: e6 o3 n7 b6 k2 i; G6 I+ i( x( ]- T6 V# ~( _$ @9 K0 w+ z  ]' e

% v! s4 o+ H/ ?aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
, x0 m) T+ N* b$ l/* Initialize MCASP1 */
; Z2 c+ K! ?" P; L9 Y8 _    mcasp = &MCASP_MODULE_1;" l' u1 ?; @9 t" A: N7 B
    mcasp->regs->GBLCTL  = 0;       // Reset
4 a6 g, j3 X/ T) W$ `    mcasp->regs->RGBLCTL = 0;       // Reset RX8 a! ]( u0 {" z' B. a2 c
    mcasp->regs->XGBLCTL = 0;       // Reset TX
$ Y) v- b5 L, @. ^8 T& U    mcasp->regs->PWRDEMU = 1;       // Free-running- H. O% E/ f% U  p7 D, @5 c
   // configure McASP0 receive registers
" j+ S0 L+ L4 C! ?    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
5 [1 c: k* T; i  y- ]  }! I0 ]    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. d3 N0 x; E* Y" l/ i" F
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 Z) b  |4 d+ G8 a( e, \  q
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' I" c6 `- _( s0 {. T    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
/ R1 L% d+ j9 L0 H' |  U: o    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
8 V4 Q7 @+ p. K# p. i    mcasp->regs->RINTCTL    = 0x00000000; // Not used: I, m6 I4 O" p0 s0 ]: v& M
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; l2 b7 t! e3 H' K2 S. i; A
3 w) J4 G* b8 b! y    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used4 D$ q$ t7 G) `) F- ~5 d& a/ J
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) v' H$ \0 V5 ^0 [# X; J
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word. M8 e3 R  e0 N$ q% z6 }
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16' W' l! Z3 U/ z* l6 f% r
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
, U: ^5 K; F5 F    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1$ w7 r! A( M" g4 U  ?( L+ o$ a; j
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
; ^  p' k1 T/ G4 k- |    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! [- I8 ~& |- w( D7 R  e; p& n3 E
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
- g$ h% u% a/ K8 Q    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
8 @$ l" q# G$ `$ }    mcasp->regs->PFUNC      = 0;          // All MCASPs
* ]* I$ h% ]3 x3 Y, v) I    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 t0 v( Y  ]% f% a8 h6 D9 _: \

% S3 W4 ~! T2 `1 R) {" _' u9 |0 D    mcasp->regs->DITCTL     = 0x00000000; // Not used) o$ j* n5 s* b& f  G  V
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
% D, K. D- k/ i/ |    mcasp->regs->AMUTE      = 0x00000000; // Not used4 ~6 F0 I5 o0 j
0 I' L4 O4 e- D! J! Q
/* Starting sections of the McASP*/6 S3 x6 u4 W: s* _7 m6 V6 z5 Z0 K
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; * U4 p! k7 P4 L$ B1 d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
& s! S8 P( @* W    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 9 s( X+ ]: L/ z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );3 e* s# y/ h: W( z% C' H

+ t9 t2 I0 }' n! q. t0 c    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; $ k# L! O0 G/ F+ R% ]# t" F
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );  D- G8 q' A) ~& e- m( q; i
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 S" t- q9 B. P9 a
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 O0 y! K! s8 m) n: y" z! w9 j% U9 S- Z$ T) a+ R: {
    mcasp->regs->XSTAT = 0x0000ffff;
; A3 l1 ]: F( z" k( Q1 N    mcasp->regs->RSTAT = 0x0000ffff;
; a/ C9 U8 e- R6 D' X
' M4 B' w* l' r+ R6 m9 ^# J    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& P3 R( b. k* h3 {6 r9 n
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );" g. t: ~: N( [& D/ r6 d
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* h0 s  q& t% f" u    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 k; v1 G+ G$ r% {2 g
% `2 g/ {6 b( Y3 C    /* Write a 0, so that no underrun occurs after releasing the state machine */
% z+ V- F# D  w# q2 q: |    mcasp->regs->XBUF5 = 0;  f0 ]4 i0 Z- w7 n: w
    mcasp->regs->RBUF0 = 0;
% E. s% p  g* ]1 T- K) r: _+ W. i
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) ~4 `* f1 q& W: q: {  A6 g2 o0 E8 y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( r' K, q. w- J6 E7 g/ t
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
* t$ X- v7 o3 Z! D$ R' m$ e    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
" ~2 ?, k: M* n1 f" O4 M( G% f0 d, [* ~0 U' ?
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
6 K; j" Y: @* h" f    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
: r  U& B& D9 [7 A' c- r1 i# i    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
7 D* j3 |" V# _0 x    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 D, f" P$ P/ O9 c/ a& h
- M. h" m( J* ]) d1 O3 w9 |    CSR = 0x0000;" L- L3 _: X+ ^1 s0 B. R
    INTC_INTMUX1 = 0x3d;8 I$ G: l( H& ^9 }1 y2 r' X
    ISTP = (unsigned int)vectors;
! _) y+ v/ J5 M& d9 C0 S% K$ N    ICR = 0xFFF0;  % N8 b$ @+ h. A5 P( ^
    IER |= 0x12;  " ]. M2 p3 v- x% J" L
    CSR |= 0x01;  4 J0 f9 v0 b6 g( ?8 i3 L; m7 p2 U
% F% j/ L  t; a  G3 q
0 }4 j# I& d5 t7 l- G; b/ y, D1 f6 Z

# V' _6 x, }& k; g* t" L还有就是两个输入输出函数:
* {* v" A& i% P; f0 J3 ]5 I5 avoid output_sample(Int32 out_data)( y3 A1 }( v7 h+ B# }7 D* K
{
3 g( H! s/ t6 H3 g, v; u7 b' w2 d+ M  AIC31_data.uint = out_data;  ! l2 q$ _& j' k+ I$ R" l  ~2 L$ o9 |
  MCASP1_XBUF5_32BIT = AIC31_data.uint;7 e2 \7 n8 t5 g+ d
}
0 \; L$ v  y( ~% j6 w0 L  y: h, w; ]) j" F2 `0 T$ r/ q9 b! W) |( b
Int32 input_sample(void)1 Z' r- ^; r0 _( J' s
{  ! v: E( I+ F7 u
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
4 J' `) g  [, C$ Z  m6 S: T  return (AIC31_data.uint);) d$ [- o  h- J7 x2 k% S
}- ~& W1 w9 [) T3 T" R& C# q

+ X4 Z/ W  ~$ ]4 t# w
分享到:  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-20 04:54 , Processed in 0.039707 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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