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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 i. {4 \' w/ r* Z: d* imain文件:
% ?; r; `% U) ~$ |$ S. @interrupt void interrupt4(void)  
4 {( n7 C( t6 K8 F2 H{
9 c( b) y+ X  ^  Uint32 sample;- P4 w0 w2 @# h  D. D  }
" p/ Y- h7 X; q% F- B
  sample = input_sample(); // read L + R samples from ADC
! k( B( a0 G+ M6 D+ N+ t  N  output_sample(sample);   // write L + R samples to DAC
! y0 W2 D0 D0 d5 X2 Y) B" ~8 G7 J1 ^  return;9 Z# |$ a3 k, V' x
}, w8 m2 D1 F6 C4 Q2 G
) e& h5 Q$ u+ M# B% k8 z
int main( void ); F; `) z0 Q  R6 X8 F! p
{! t/ S0 ]* d' r" ^+ \+ o, T
9 r+ F  [6 C% f$ `: {
    /* Initialize BSL */, e( y( J/ X. O. W) R7 x" [' v
    EVMC6747_init( );
( j6 U4 [! c' X+ ?# |8 U7 C8 y        /* Call evmc6747_intr function */
5 y! b( K# ?4 l4 l3 U. a    aic3106_init( );
6 s3 S2 |: C) ?        while(1);  H5 G# {% Q; v. D
}" G$ [6 }. j7 d8 T$ W
8 v" u6 c' L& T6 B3 W

5 `+ P4 }+ t1 ]aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 _, e4 m/ ]; |( x' j5 \$ f/* Initialize MCASP1 */$ X2 ]* T2 z8 Y
    mcasp = &MCASP_MODULE_1;  j' U! m! f5 `* A/ `1 `( W
    mcasp->regs->GBLCTL  = 0;       // Reset% c, b0 R1 S$ {6 _% c; X0 K
    mcasp->regs->RGBLCTL = 0;       // Reset RX
% O/ H7 r3 _" y6 ?4 M    mcasp->regs->XGBLCTL = 0;       // Reset TX
0 f  S! z1 y0 z' N8 R, ~. G    mcasp->regs->PWRDEMU = 1;       // Free-running
7 u9 g6 @* x8 U: p+ S   // configure McASP0 receive registers  `& F' i; q3 P$ P: r: D0 {
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used3 \5 ?( D# N& c: ]
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' }7 F0 _: c0 V8 S$ M    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
. R- D) ?) A  K6 ]# o! e+ u" e; H    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ `: W" x) m( L    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)) ^- D8 {$ y' k! \
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1+ e% w7 B& z' N+ I5 \
    mcasp->regs->RINTCTL    = 0x00000000; // Not used8 U! m" t# ]( u1 Q5 e& T
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 c1 L- }: T! `" w
9 l: e& P. l( q- k6 D    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used7 F8 I7 K4 {* w; w9 k* a, N
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% v* M. ~2 k6 T1 w
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word, p2 v* J: W* P4 D2 `
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 h* p' B" E- l# N5 p    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK) x' b" p% u) d; j
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
1 O' f3 y2 R3 ?( N0 p" Y    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit8 e  v8 @+ e) n8 x& }% w. L# |  @1 u
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 X# o3 j+ m# b' {
% s' j; {/ n! I/ \
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN# o3 v1 i8 y6 g1 C& B( C
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT  N- ^3 d5 j- i7 g' r9 ?. z
    mcasp->regs->PFUNC      = 0;          // All MCASPs2 A; F3 _$ J( {! o8 s+ ^
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 ?. L5 c2 y# o
. ~6 Y' L7 ?- j0 n8 T  _# q    mcasp->regs->DITCTL     = 0x00000000; // Not used' x: u4 a7 e' b6 h+ @
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
7 G" P; }& S  h) k  e. }    mcasp->regs->AMUTE      = 0x00000000; // Not used
1 |5 J9 G) a2 {" h1 V  s+ _3 J5 o; _
( X: ^" g! Q" N4 T  \( v/* Starting sections of the McASP*/
" d) p1 d0 D( k( h# t: {2 j3 ~+ K  p1 q" R    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; / Z; \$ }& ?! M% s( v# _8 J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  $ x* c) d/ ~, _- }/ k5 _- u
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ ^+ G  x) y- F! h    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 x5 @- ^- f) b4 x* j& @* [8 ^* u! \% H% L% k* Z1 E
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' r# r! w  Q  m$ E    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );3 X' E1 J7 W# `# o) \
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 9 ]+ U/ y/ i9 b: R0 i/ d
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );6 k2 r) Y+ U; _& x% L5 H! ]

& @3 E* a% G; x- A    mcasp->regs->XSTAT = 0x0000ffff; 6 w) X9 s8 F4 C. {# {: {: }
    mcasp->regs->RSTAT = 0x0000ffff; - {# U& _) L& o9 f1 |, ]) L/ c% V
$ \6 n/ a8 g' {# U" }& E+ Y
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 B. X) d( g  z! B
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );+ _! O/ i& p5 V& `$ q
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 ?1 w: w- t7 b3 `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ r/ y4 Z  q/ A. d

3 D4 }4 I: ?* ?5 H5 u& |    /* Write a 0, so that no underrun occurs after releasing the state machine */0 p- j$ m$ S" Y) Y4 d
    mcasp->regs->XBUF5 = 0;1 c! c/ P6 {( }4 R; O% Y
    mcasp->regs->RBUF0 = 0;' ^6 h( ?4 k7 Y

- v) N+ E% u2 ?+ M2 Z0 L9 S    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! f( V/ {0 S) `* o7 ]    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );; `& U% M8 X% ^3 D1 J% I2 c( x4 m( R( z2 {
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 2 ]+ f+ V+ Q; v$ Z% H' r2 ]# |9 D8 h
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ b) o0 c' T6 P; B! R3 q+ D# ~' N- P5 E9 I* r, a
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; + Y/ b5 r2 }# |4 l* m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
$ }5 E% l% Q1 ~( R8 X$ d    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 s6 s# ]5 h& L4 v    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );* M/ k- I; `% o) \6 `6 L. @
( Y( E7 W4 n" N/ ?
    CSR = 0x0000;+ P- Q7 q2 W6 P/ s
    INTC_INTMUX1 = 0x3d;' I5 ?9 a6 q* v3 d; M, l* }$ p% S
    ISTP = (unsigned int)vectors;
7 X5 Y, B8 {9 s/ I6 b. D    ICR = 0xFFF0;  
" d1 @! L1 K" k, R' J; k# ?, Y    IER |= 0x12;  
, W0 q5 h: P! V    CSR |= 0x01;  
" ?# _9 F, s% t& [" l% F: w, W0 ~1 b4 J- S& i" w. w1 Z3 M6 w( |
% A. P+ z. p, T' M% Q5 H' n
2 n6 I6 z. G9 C* \
还有就是两个输入输出函数:) D; P+ h) ^3 F, l4 p5 ~- U
void output_sample(Int32 out_data)
! J9 ^+ L7 z: b1 ?' m{( R# k3 e5 q2 l) i
  AIC31_data.uint = out_data;  ' R2 [  c6 z/ T4 i7 K9 S
  MCASP1_XBUF5_32BIT = AIC31_data.uint;: g- L  q- U. c6 s+ o  ~5 {
}* p9 b! n; C- U
0 N' y% I* {+ Z, @3 w
Int32 input_sample(void)) L" ^( X9 Z( i
{  , b: s- e1 T8 T' ?  l) C* i( D
  AIC31_data.uint = MCASP1_RBUF0_32BIT;3 h% B' h1 _5 Y2 z1 w
  return (AIC31_data.uint);
6 q* [+ f1 C# U5 }% R  X- [# \) P}+ ?3 p7 K; I( ]
" p3 R. f( ~6 a  W! A. K5 T
分享到:  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-24 03:39 , Processed in 0.046630 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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