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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, `9 [3 C: O; {8 g# z  R5 Smain文件:
9 v- \$ R( b6 R. O- H% yinterrupt void interrupt4(void)  
* I' |  ?* G* F{
  F" e5 J5 S$ J  Uint32 sample;( Y2 A  A# d1 o; k8 q) B2 r
& N2 F9 R4 Q9 z4 x: }: T6 ]' v/ B: _. ~
  sample = input_sample(); // read L + R samples from ADC" A0 z2 g% B. q. D
  output_sample(sample);   // write L + R samples to DAC 6 r: h) G2 ?! e/ t% ]
  return;: ?7 q* d/ x+ y3 d, k
}
9 d3 o# l8 I3 t
' ~; g. Q5 T4 Y2 Fint main( void )& Q5 w; W8 v$ k& Q" J+ w  j: d
{$ S+ s( A" {% u4 Y! T

+ h% U3 K' E, P5 u1 ^% m    /* Initialize BSL */& }5 J" s" ]5 v
    EVMC6747_init( );
9 g  p0 Y& ^% U; m' `& c        /* Call evmc6747_intr function */6 G0 M6 C4 w; Y& \+ b" C8 e- c+ d
    aic3106_init( );
1 B1 l: r) f$ u8 M9 `5 G        while(1);5 H1 G" }! X! D* l% e$ T# n
}0 h7 p, }9 P' D" X

% a8 y. }0 z% I# e1 v) j
4 D2 l! z2 d1 E7 t2 V) G1 aaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! V( [3 g- x+ ^! z8 R; A) u9 I# g/* Initialize MCASP1 */
9 `. Y+ n  `* L5 k- z    mcasp = &MCASP_MODULE_1;$ P' ?7 i$ `" F2 S
    mcasp->regs->GBLCTL  = 0;       // Reset
& C& N( u9 O6 W& h" o! d3 \    mcasp->regs->RGBLCTL = 0;       // Reset RX% I! T4 z+ }5 S+ \, ]8 w) t. L
    mcasp->regs->XGBLCTL = 0;       // Reset TX
: O% O6 E5 t2 {6 {    mcasp->regs->PWRDEMU = 1;       // Free-running
4 i* A4 l5 s" `6 X6 `   // configure McASP0 receive registers
% ]/ c. a6 q9 A6 X9 t2 ^    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used+ [& u$ ]0 [0 p# ]8 X" k
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 n4 a6 p) E6 V3 L    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( v3 o$ ^8 Z' W2 i# ]0 r    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* H% i/ Y8 H6 G8 M" ~' y5 T
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)/ ~; P6 k  U" B2 c4 z. K
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
8 `- n6 i, b  e; W    mcasp->regs->RINTCTL    = 0x00000000; // Not used
. \8 y* ~, ~1 F    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& }) W7 O' p" d) T4 v  i+ J- u7 X' x/ d2 d& s: `/ J7 K
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
3 x* t- U$ p3 d/ f! {4 L    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" A9 _$ Y2 g) U
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ |; V# M( L& B2 ^2 ~# ?6 {    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ e# {6 c, K3 F: t7 Z    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK' l6 j* N) Z/ g% x- C  x" m
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1# w, j: d/ B* H8 Y& f
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
( r; x# J1 Z3 C, R6 f# P    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. W3 _: W- A8 q9 {5 E
' Q- S# I& P& |1 ]9 s- A) V# e: Z
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN! i6 i, m( L9 c4 v9 ^% c
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT2 _* A8 H9 N/ ~- s+ _  d, H7 f4 S
    mcasp->regs->PFUNC      = 0;          // All MCASPs
/ I% j9 T6 T* G% m2 i, X' t8 K    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 f* V- b: E7 v  ?8 h  T, g3 t1 O% a% M0 f$ `" M1 g  a5 i
    mcasp->regs->DITCTL     = 0x00000000; // Not used
2 P6 x0 ~. w/ `" E% Y/ L5 f3 n    mcasp->regs->DLBCTL     = 0x00000000; // Not used7 ^3 J0 i5 i1 f, s, N$ _* P1 t$ H
    mcasp->regs->AMUTE      = 0x00000000; // Not used
! C/ E7 W( W8 }# c; V6 G. f4 e/ L
3 m% l+ ^) _( c% k$ K/* Starting sections of the McASP*/
. T  ]- G9 [2 p5 g    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; % s, u; n  p( V9 V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
- B/ X& [9 U6 N- X4 d/ \    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ l1 l2 R; O: ~/ |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
: [7 p" b5 g0 @/ a* Y* C$ K4 X  P' d8 J8 W# T) g; ^  v' I+ d
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; " ]8 |0 @' R9 b- @/ V6 F# Q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 Y& s# ?* M( G- |( i0 |    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 x' W( o7 U; y  O- x, W
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 w$ p( x- B) a4 x6 K9 w# m* J4 C/ C: U! o5 B
    mcasp->regs->XSTAT = 0x0000ffff;
# l; {  D+ R$ s1 K% e( p, M* _9 \    mcasp->regs->RSTAT = 0x0000ffff; & i9 @' K7 m6 ~1 `$ r

0 r. N- ]6 D. |9 M    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;: A' [9 a" D, `+ F  _
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 g- [) Q3 {" {( N4 B- S
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ C$ x- T! }4 N( G& r8 e5 \    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );2 S1 M4 A% D* |' g5 f( M4 w

/ m* }6 _% z4 I0 h& }    /* Write a 0, so that no underrun occurs after releasing the state machine */5 C4 }: p3 q6 S3 N. V) D6 M% b
    mcasp->regs->XBUF5 = 0;
8 v  @5 B2 F. t' ~" I: M    mcasp->regs->RBUF0 = 0;7 c! }' e& P: }% q. c# J$ `
, N% A7 _7 W7 \# l$ q
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 f/ I# u7 H5 D* x- b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 j" n2 U$ o' L4 i: U! E/ K" X    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; m- C6 H/ O6 R6 b
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );5 _, g, b( Q6 r; O' c. T
# s3 M' N, s7 _" u$ o/ D
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ N' J) N3 @/ c% O# j, d% ?8 y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );0 Z' R8 c' o+ R1 G& N9 I
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 q+ O+ `! R$ m% J9 R! j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, }+ V. `/ y: T' V+ x0 y- {
, Y/ {: i) N( A7 m. E  D/ x
    CSR = 0x0000;
. s& w6 w4 j( U8 b- w2 Q$ s    INTC_INTMUX1 = 0x3d;" |; g1 X. z  @! v
    ISTP = (unsigned int)vectors;& y$ B. i# V+ J1 P5 H/ N! i
    ICR = 0xFFF0;  * t$ J% R3 q+ Y8 H5 y- {
    IER |= 0x12;  
% j. v( O* G% [: U7 K    CSR |= 0x01;  8 k: C  W7 {6 E9 e

4 q! P6 D+ R; S0 T) @( c- G6 q$ B
+ _- n- f" K, @. P$ J& h2 P0 ^
2 k5 y8 Y" p6 I2 A/ M; Q; S还有就是两个输入输出函数:
2 \  g, a: y6 {6 k* Hvoid output_sample(Int32 out_data)$ `" d) C/ g& n4 Y5 _, B& c8 T
{
# h  X$ I8 u3 x  AIC31_data.uint = out_data;  
. d- J! A" |, h, Y# l9 X) w) Y  MCASP1_XBUF5_32BIT = AIC31_data.uint;1 P" c& K: M& O+ T6 B& A5 _
}
/ u7 Q* O9 Q& N( p8 ~$ P! S0 r/ w! F1 q( A
Int32 input_sample(void)- R" {& _6 h) f+ Q: }5 I& M6 a( ~8 E
{  & Y) ?# `" s6 w1 |& C% L, I
  AIC31_data.uint = MCASP1_RBUF0_32BIT;' ?$ g( \6 _7 g6 a9 u( N/ l; P: t( |7 }
  return (AIC31_data.uint);! X! C9 O4 V* S: H- d  `- b" y
}
: \/ q% e: I0 z
0 c  B9 b8 t. O3 J2 [/ m
分享到:  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-11 12:13 , Processed in 0.036915 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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