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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. K% |, X) c. W4 @* {, f, r& Z' |" [main文件:$ X" D3 y7 b% o5 r$ P+ ^
interrupt void interrupt4(void)  
$ H7 L0 {) u1 X{7 \" M2 T0 _+ w. d2 @7 {% L: |
  Uint32 sample;
! O/ x2 Y) ]4 W9 W6 |4 G( M- J; O7 c; C
  sample = input_sample(); // read L + R samples from ADC
4 Y1 z* E% }0 n8 L: O6 Y0 p6 h  output_sample(sample);   // write L + R samples to DAC
$ U3 G4 L. h9 A  M. Z+ Z# X. m  return;+ R8 `1 I" ~1 w' ^. ]
}9 u3 j) U  O6 {# i5 v, ]
4 ?/ L' J+ N) H' J
int main( void ). E+ E9 [2 {+ C! @; M$ x
{
% C4 l6 M( u0 j5 u
- [; D0 T3 E# r( I8 b3 X1 m    /* Initialize BSL */' i( u* k, C/ c1 ^9 |" V
    EVMC6747_init( );! P9 r2 J1 X9 T2 n! o  M
        /* Call evmc6747_intr function */: p$ h! p  ~, h" Q3 |! I) @
    aic3106_init( );
  T" u0 f* g2 Z8 _        while(1);
: y  h; e! G% `9 o}! R" z6 c$ G8 x5 v; f

" E% c7 ^7 m1 b' ?
- f- [$ m* }9 \5 t3 }! h' Y3 aaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题  f3 O8 y, @# l6 I5 m7 Q
/* Initialize MCASP1 */4 @! q" p' G1 _
    mcasp = &MCASP_MODULE_1;
/ Q. a- A$ G  _" T8 h/ x    mcasp->regs->GBLCTL  = 0;       // Reset2 o% U. ^' S" J. s
    mcasp->regs->RGBLCTL = 0;       // Reset RX( k; u0 Y& }- M. [- T0 c! W+ T
    mcasp->regs->XGBLCTL = 0;       // Reset TX% i  X, H4 l  I! T& g  {
    mcasp->regs->PWRDEMU = 1;       // Free-running/ q  a1 n) s' n3 [
   // configure McASP0 receive registers
! N. ?3 V0 p0 n- {9 X( E# b/ N    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used) V( s- m* K- s& K
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 T- f3 c; R9 y1 H; B6 [    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 o$ ]' e' N4 n& l( E) o
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 ~3 ]& }! v$ P
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)0 X: n; U8 b1 ?3 b" V, f4 W6 `. B/ z
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,11 ?( E6 b+ X, v3 V, x* G
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
' J+ z% y6 c; N$ ~3 O- Q) M, U    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* y9 _5 q! ?% K% G# i* R
- O9 o$ {) J0 C" ^9 s
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used3 r4 n: F3 ~8 ?0 A- v# Q6 S
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 e( X- a2 T+ V8 s/ `8 L
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word- I6 f$ K8 \1 ?9 x+ f! l
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
  k/ C& M& c* ?    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
& w/ p  T4 f# S* ~8 C3 J    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
% E- W, m8 W2 n7 Y    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
# i: d' R% ]. \    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 R; @* T+ w  ~1 {  Z9 q! o4 ^" a4 r

" `/ L7 D" c! z4 t, R    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
8 z5 g, M7 D( B4 t5 @" _    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
8 H! [9 y. x0 y+ D. N    mcasp->regs->PFUNC      = 0;          // All MCASPs3 [4 O. T6 y& \3 g9 }' v- v+ o3 L
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1" l9 a. Y2 X2 ~- t- E6 }1 P( s
* O/ u5 a9 y" ]0 @
    mcasp->regs->DITCTL     = 0x00000000; // Not used
2 n) C3 j: S& z7 }& ]2 o# w    mcasp->regs->DLBCTL     = 0x00000000; // Not used
1 A! j$ y. w$ T" `, {; R    mcasp->regs->AMUTE      = 0x00000000; // Not used
1 z& |6 p  Y5 A8 v/ j2 s! T" k/ J! {; a
/* Starting sections of the McASP*/
  s5 z. A5 p- A9 R  B- A0 S) M    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
  u; ~: O' ~; v/ ]5 m1 E    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
3 @( {. o/ x  r* j$ C$ D( n4 ^    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 2 r2 ~+ A8 X" ]! J2 C2 O0 X
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' U$ J7 ~2 F# B" Y+ J& a$ Y# ]5 _: Z* _8 }& n# s( h6 I  {; v+ ~
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
  \9 a  S! C( G5 C: ~7 ^/ f, I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( H0 z9 H) G. X    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 @# u  a1 z; D" |% M9 F7 ~; S    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );4 D' F7 {' T$ e# W

& y2 R9 q0 g9 n9 @    mcasp->regs->XSTAT = 0x0000ffff; 7 Q/ f1 S- e; H" W9 ?% J
    mcasp->regs->RSTAT = 0x0000ffff; " W; b4 |% {# {! ]. j
8 Y2 G5 q- w+ W, W7 Z+ M7 U  H
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;; r' k/ `5 @; n
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 p; L6 U% S$ [    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: e% K; k/ R6 g' u5 m1 l* j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 t: w$ w+ l' Z  h' U
0 C5 p% r  {: r# p
    /* Write a 0, so that no underrun occurs after releasing the state machine */
) h. ^7 f4 v- `" D: R% k    mcasp->regs->XBUF5 = 0;
$ m8 @+ Y0 X( |; }$ S    mcasp->regs->RBUF0 = 0;
: r% P% R- V" \
0 \% k: s- s$ [% ?, E3 \/ r( I% ~    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# d$ s3 z9 n, T& ], W9 k9 _% @    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );$ S, Z  V- q, F
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; - E6 v2 J) O. V5 D) B# U; V- \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );1 v# j: p6 H5 x  y; g

0 i8 l; F; |( v# t( g6 W    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ) Z' I. s" T3 ?0 m$ u. d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( A8 A) \! A4 E* n. Y) g
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) {) D) f, s# X, L, `$ N* l( y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 P) h0 A# \7 r) S) C1 n& q+ i( o4 Q5 f5 [
    CSR = 0x0000;+ v+ q; V, A# C
    INTC_INTMUX1 = 0x3d;6 w3 A( g: f( z
    ISTP = (unsigned int)vectors;
- q5 |% m& e# r5 F& q5 i    ICR = 0xFFF0;  + U' O2 ]6 P3 r% H+ J2 z$ s  a0 L
    IER |= 0x12;  
+ V5 V. F! j2 K    CSR |= 0x01;  " B* W6 \2 x% K! h3 {3 Q8 U: c

3 J& h2 @/ C& r; S/ O$ ^) x- e9 }- \4 S6 L; r5 _4 C! J: g* P0 J* C
. R2 S/ c3 P0 Y3 Q( |
还有就是两个输入输出函数:
: [* P: D/ t' ~- m* }void output_sample(Int32 out_data)5 {, s9 v5 D2 w$ O- Y- j
{
" H+ u" b7 G! s& z  AIC31_data.uint = out_data;  ' I6 p* _' X6 }: U
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
: D  S( A9 V- C+ L}
. [8 y% d, ]3 X2 i* o9 u/ `5 p8 c+ ^1 W4 z
Int32 input_sample(void)
4 H# o3 j  Z! X  f( v  ?! M: ]* v% A{  
& u% b$ U/ f6 Y5 G! H) }  AIC31_data.uint = MCASP1_RBUF0_32BIT;
% n, ]- M* Y/ T+ z4 t, W; p3 V& B  return (AIC31_data.uint);2 H$ q2 q. {3 _5 j. v
}
5 y1 F3 \" E  I: X4 I# a1 c% X+ G" P5 O8 `: p9 j, 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-12-6 05:22 , Processed in 0.040087 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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