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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:) _1 e' V$ f) R  E) y: C
main文件:
, [. Y! Y% a$ ^4 A& G' l8 C6 sinterrupt void interrupt4(void)  : n# p  q. X% T# J' i+ a
{
- A! K2 f* G7 [- x" l6 v1 f  Uint32 sample;9 X& P6 b" [2 z

6 M5 _0 W  q8 _6 T& d' _  sample = input_sample(); // read L + R samples from ADC+ ^1 R5 U6 M1 q& y1 U
  output_sample(sample);   // write L + R samples to DAC
( z( X5 W% j5 D# f  return;! m4 A* w3 ~/ ^) L* t8 P
}/ U- l5 [3 w5 i

2 c2 [) W- Z; aint main( void )' Y5 F9 i& t( [4 |* {( L
{2 V. Q: _- B) G4 T: A5 Y6 R* v

) A# S! b! z: o; A- C$ v" B* y    /* Initialize BSL */
" x  q( i" _2 M9 e: R6 J& W* _    EVMC6747_init( );/ S- F, j  ^  e" P3 U) j  f3 m
        /* Call evmc6747_intr function */
1 P$ b) \3 v; s7 J1 q    aic3106_init( );
5 p  H' W; G$ v6 n# h2 Z4 i, S        while(1);! u* D. D) N! O6 Z7 p
}7 D# }; B$ s$ J! L7 s
+ X0 w/ b. e! j3 D* m( P! \
/ {, a7 {! k2 l/ }( J
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) O; y% Q; y1 w/ K1 V) p/* Initialize MCASP1 */
1 d7 r4 m; v9 D7 o% i+ x* p    mcasp = &MCASP_MODULE_1;1 t0 O* r$ m" f+ X8 i
    mcasp->regs->GBLCTL  = 0;       // Reset
( ]' n, ~1 M8 h* A! @    mcasp->regs->RGBLCTL = 0;       // Reset RX
) s% C+ v; t3 F0 y  r    mcasp->regs->XGBLCTL = 0;       // Reset TX( ^) [6 O& o3 \/ k; \7 h1 k
    mcasp->regs->PWRDEMU = 1;       // Free-running- Y5 Q' J' c7 ^7 n& `! `/ L8 L
   // configure McASP0 receive registers2 D7 S) x6 ^% G( z2 ~: W
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used7 P* `2 [7 I) \+ k% k
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& s3 y% ^* q6 `; K    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word+ R6 Y+ p/ @0 G! X5 J
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 W  f+ U* w( L# ^: W- y6 q2 X! E
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)! e! j; a) Z* F5 J4 C* ~) x
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
: O. B) F! y8 s* d5 D    mcasp->regs->RINTCTL    = 0x00000000; // Not used1 U* E/ @" z' @& j0 h" S
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 `$ @9 h* g1 m+ e, _; h
* o+ d6 N& u; u' W9 {* ~1 y2 Y& y4 z    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
  C$ v9 A- I( a5 F% @; u    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; l! b: Y1 k) ]) U    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% z% X% [8 G1 o( }% Y( m, x& w    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-162 k9 w* w/ s) Z% ~6 R
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK4 S- e3 v* I/ S) n, a' d/ ?* @6 K
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
1 s  N8 S, y/ ^. G: O    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
+ w6 F( V+ ]* [, B3 A0 q. f- L    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' p- E- p) J4 g- {8 \- v

' o6 y) g. O7 ]& z) P* k    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN( h" h0 H* Q# \- @
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT- w& ]* W  p: o4 R8 e/ a' c
    mcasp->regs->PFUNC      = 0;          // All MCASPs7 {7 @: u( f- \) ]+ ^2 T2 C: [3 F
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% I! S# J2 n0 F# u4 E% z( F

# x0 a4 X( q2 ]" x& k/ [' Y    mcasp->regs->DITCTL     = 0x00000000; // Not used
+ _% N- c" Y& O; t5 e' W* t8 G    mcasp->regs->DLBCTL     = 0x00000000; // Not used
# q% g1 I: ]. i+ n1 H# L7 R3 n2 x    mcasp->regs->AMUTE      = 0x00000000; // Not used
: V6 ^0 f9 l8 v& M8 `2 ~' Z$ E' H6 s3 I1 B5 S- ^6 G0 U
/* Starting sections of the McASP*/
1 B  X$ ]5 F; Q( Y. y! d5 ]    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 ~0 a9 [; e5 q; _5 W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
7 G4 w/ Z; R% F) v, ~/ M: Q: p1 B    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( @' {. T0 R1 l3 O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 J( \+ V- H& |3 j6 E  H+ Y
5 T) k0 o3 c8 [9 @" a( M  c
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 t9 y% K' `( n. \+ l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ d0 |: f0 t" e/ M$ ?2 ^3 X
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 1 r4 v/ r) Z6 r# h# ]" d8 [
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& V1 U" ?8 O% ?% f, w0 {' F

. q/ j  \7 R& I, Q( q# ?0 h0 q, A: C    mcasp->regs->XSTAT = 0x0000ffff;
; b3 S1 I- L3 O- E1 S/ X, N# o    mcasp->regs->RSTAT = 0x0000ffff;
2 `  y' Y, E# }% m3 g+ R# N: S+ B# K& |/ S# I. N1 m; ^
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& v* k3 B) f4 a5 b- d: X/ E
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- e! z5 y0 Z4 c# {
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 X9 d3 x8 F/ n0 ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 A" |: x5 t7 w& H# t. _5 W  B; S5 z& P
    /* Write a 0, so that no underrun occurs after releasing the state machine */
. y( [6 e. r; ~) D* v9 U7 F+ q! @    mcasp->regs->XBUF5 = 0;
8 s/ y$ ^5 g# Q. z9 j5 _  Q  \    mcasp->regs->RBUF0 = 0;
% L1 g9 u# \) q1 v4 ?9 C
) p. O! I* e' D+ i    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / ?- X2 }2 h* |9 `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );6 C+ `( y2 R9 {' s
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , g$ p+ \+ g7 o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' V/ H  Y4 i4 L& }3 ?7 y
; R  O6 T% i5 \# Y    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 F; w# f0 w* ^$ q& Y  Q9 F5 g6 W* |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' d8 {% z" I" [5 F8 E+ @
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; + `  S7 x5 k  g7 g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% x( q) P; H4 r( \) F
0 _# M: C5 ~% P  R" d8 e! x* s
    CSR = 0x0000;
0 g$ Y3 y$ @' l4 A9 P    INTC_INTMUX1 = 0x3d;
7 g) F8 ]# y, c% N6 w5 b; X! a+ m    ISTP = (unsigned int)vectors;
1 k& ^" T, W) P) i& B    ICR = 0xFFF0;  
$ W; M( t" V( p5 c    IER |= 0x12;  
2 s2 i$ N1 J- k2 X3 F( `  P+ c* n: H) e    CSR |= 0x01;  , ?! b8 _# K  D% \! j: }8 E; a
; Y) Z  E: v% V4 M& W
# n  \; |7 H( D2 E6 K- h3 \

- d& p+ F6 y3 f1 f6 |还有就是两个输入输出函数:
" X* e8 o( O% D) W! qvoid output_sample(Int32 out_data)6 C4 S+ y: q! G7 F; \$ b
{! o% l5 x$ q: @" C
  AIC31_data.uint = out_data;  
! I! h( Q5 |* p7 P  c  MCASP1_XBUF5_32BIT = AIC31_data.uint;
; j9 D/ W. j. _}3 V/ J; q$ M% h/ g, O

1 U. z7 j1 {* ^# d! z0 H# pInt32 input_sample(void)
6 \) g# F5 S# J! ~* q{  
" h7 z' `- `  v; k! t. t  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ H) ]. r! ?+ `8 K6 o0 E" K5 ^
  return (AIC31_data.uint);; S- C) v: g6 d7 i( w/ N
}
2 b' v! Y# g, t! ?
* Z, N. P( X& [3 O% D2 ^
分享到:  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-8 13:35 , Processed in 0.037652 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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