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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& s  n2 E0 U8 t  n5 T/ \main文件:- W. S/ ]: ~  v, v5 L' g+ j
interrupt void interrupt4(void)  ( g$ Q' C/ ?, [6 C( [3 Y. d
{  ^9 C7 y& [7 F
  Uint32 sample;
% w! T6 J, T/ ^" \% d" J+ J: A2 ~
7 y% v- [. U) @% r7 F. b0 j* y' \  sample = input_sample(); // read L + R samples from ADC
$ e3 i& Z" b3 Y% j- ?- c  output_sample(sample);   // write L + R samples to DAC % p' R3 E3 }5 {4 v% x7 {0 g
  return;
0 q1 c' H1 [8 P5 Q' w}
- K! e" W) r  \7 t2 F1 p7 x5 c% u9 `/ s. z; z! [/ u- @" J7 M
int main( void )" q, d* _# i6 B8 M6 q
{' c5 Z* x' o: ?! s

! a' R8 n% L8 w1 F, ^    /* Initialize BSL */
* S- U8 x( |! e& H) y; x. ~# B    EVMC6747_init( );
1 p' j4 W4 f; ]. J- [/ u7 n        /* Call evmc6747_intr function */
9 i8 B  i7 u1 m" ~    aic3106_init( );
( m$ G, L8 u. |2 M) V        while(1);0 u% \* X) m5 ~5 J% j$ N" w
}9 X  ~$ i$ U* W0 D) {

$ d) v% e5 z7 G- B  }- H! r+ C; t  z) s4 G% E( d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& Y8 c+ r" o& X0 m: m' `$ ~" b/* Initialize MCASP1 */
, E/ X2 O7 O- @! M    mcasp = &MCASP_MODULE_1;3 D0 B% a% t! D7 T8 R5 K3 g/ S* |
    mcasp->regs->GBLCTL  = 0;       // Reset
# [5 c1 m# ?; k5 c    mcasp->regs->RGBLCTL = 0;       // Reset RX
. P* f3 A5 K2 H    mcasp->regs->XGBLCTL = 0;       // Reset TX3 \7 \* {: g% l: X9 r% j& h
    mcasp->regs->PWRDEMU = 1;       // Free-running
7 a/ @2 u) y1 R0 ?( n   // configure McASP0 receive registers
/ p5 e" k- {: Q& ~- c" H" g, D; s    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used7 k9 q* j7 z6 m" N8 M4 }
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, Q9 b2 n  {9 }% Y% y- `$ L) y
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# h8 `- m5 A+ ]    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& P* N* L. g# g( S) W' Y) H    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
/ f) g% ]0 |4 h2 z  U( P% v    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1, Y( J/ x9 }6 G5 y$ ]- O: v8 u
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
( Q/ |0 x8 O5 F    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' t+ @7 s, x2 {% _* r7 l
% C3 @2 k# ^. f  w    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used# G/ Q& V- i3 Q$ Y) |
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 Q0 l9 B5 s( x6 R$ u1 E8 @
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* u/ I$ P! z/ Y, q" V( J( t, t- c
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16$ m2 {6 P5 |% A: C1 \
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK' M* e, l' K/ ^- r1 I9 u
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,16 l/ O/ z8 ~' R4 u
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
" v* n  c% O/ ^6 e    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ F8 H$ s7 v' i: Y" q, ?  m

* P/ ~+ a- _9 I: o' T* ^) a$ C    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN7 Q: Z4 k* l: c3 V% a5 B% }
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
* H& t* w4 W6 T    mcasp->regs->PFUNC      = 0;          // All MCASPs
1 x( ^5 b$ b' C1 P' Y  c% q    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 w$ C/ `8 c) r/ G+ Q' c( b5 G7 }4 _! K2 h6 [/ m
    mcasp->regs->DITCTL     = 0x00000000; // Not used; [1 q+ Y8 _( X! h
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
! w- `6 }5 {3 |7 h4 _3 p7 }5 f    mcasp->regs->AMUTE      = 0x00000000; // Not used
( @: A, O) K% \% Q
1 Z6 Y- r" d4 Z; [( z! O/* Starting sections of the McASP*/( v$ a# k* x, R: J/ ~8 y+ y
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 w" b8 y; G3 Q0 Q) F3 r
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );    L( e6 N& f( q, }. G# F# F& h; c. w
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) l3 W) T3 s% [# M2 [* {! M
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );! p  a: d$ K7 \' ?, C

. o. p' w- S1 \6 x% J    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 z% l& }; `; ^+ j
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- E3 b/ V; ^! b- R# O( Z    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" x# P. _6 ?& w6 Q/ U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 d3 s/ j$ W' g/ ]6 d6 ?3 ?/ G9 m* v/ k+ V) u( R* c# h. E" P( R2 ~( b2 f
    mcasp->regs->XSTAT = 0x0000ffff; - h% C! p; _) g* Z- r8 l# v
    mcasp->regs->RSTAT = 0x0000ffff; / h% ?$ X2 a4 R8 w' |. m' Q, T- g

2 z  _  F! V. W    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# W; J! r* L( v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, R5 A: k& x7 ]+ l, K+ W    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ! \8 v" p! H3 J. I; A
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ d4 N3 V9 `1 d7 C% A

6 O3 N9 H1 E7 O/ _    /* Write a 0, so that no underrun occurs after releasing the state machine */0 W! E# e9 F$ x* |( t3 S& ]
    mcasp->regs->XBUF5 = 0;/ K$ _" Y% Q/ [- R, B
    mcasp->regs->RBUF0 = 0;& Z6 l. j4 p2 A& x1 J5 p, j. l. D  t

9 j% Q/ a4 c, ?6 v( H! t% b% C) l! n    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) G. c  h; r! ?+ P# O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% n& q$ S2 n5 ]9 k0 ?* l( Y    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ j7 e$ c, |. m3 X$ _
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( f- J4 {( n0 z7 }- Q( m3 G; |

: k1 I( _/ ^3 [% A5 @  R# u5 r    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& ^4 L8 |  u) N6 a    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );$ |! ~0 O. T1 Y7 u
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! z5 ?% O$ t- L# e/ |+ `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" e6 I0 w2 v) o; P& O5 f1 R* b7 _6 y8 U! L
    CSR = 0x0000;
" j" Y2 K4 Q7 h: s    INTC_INTMUX1 = 0x3d;) U/ K$ K. m& X* |9 d$ H* `
    ISTP = (unsigned int)vectors;* D  g; Q1 F! K/ J  L( A
    ICR = 0xFFF0;  : z$ S0 [+ p0 n/ y
    IER |= 0x12;  # b; d* y- M- R
    CSR |= 0x01;  
1 }+ k# E  l" C; T- ~3 W9 @& ^" U% Z% b* r, z
8 n! D3 S6 Y2 K9 w6 U4 E
4 S. B- w. Y( W9 I
还有就是两个输入输出函数:
1 T/ s: `3 J4 h  Ivoid output_sample(Int32 out_data)' M* \( w6 e, C4 ]3 f5 i
{
9 M4 ~9 v$ j8 y  AIC31_data.uint = out_data;  ' T. G1 s2 m0 t  T$ t" h$ f
  MCASP1_XBUF5_32BIT = AIC31_data.uint;( m, I+ i" Z5 |6 w+ I/ w7 d
}) f7 y0 s& t$ b

; T/ b7 \+ K. q- I# |Int32 input_sample(void)
8 W6 H) @- ~7 A/ h+ `3 x, X{  0 b# X! h! O0 y. o+ y/ M  U
  AIC31_data.uint = MCASP1_RBUF0_32BIT;& H3 _+ N7 J) }3 Z' U( K: G# r; G; A
  return (AIC31_data.uint);9 e: b; t6 T' {$ R7 X& t
}
# I( l9 b0 S' N$ P# K, }* P7 O2 a* u# v! f0 X8 C
分享到:  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-27 12:49 , Processed in 0.039675 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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