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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:1 x/ J/ i: T( H' Q5 r3 r! G
main文件:) [7 @) ?8 v' q6 p3 ^
interrupt void interrupt4(void)  
' M, l9 `- P( [, h* ~  l& \{1 `9 o5 l. l4 j  E% g3 H
  Uint32 sample;
6 ]5 \8 x5 x6 O% r7 c0 E3 B8 L2 w8 Q
  sample = input_sample(); // read L + R samples from ADC
( D% W& V, G, q* P) O2 u# K9 P  output_sample(sample);   // write L + R samples to DAC 8 x" ?0 t9 E* O' N  v
  return;2 x4 n7 r9 d2 r5 L5 k9 f
}
, B8 |* T1 l% \8 `. U) E, {' l" M
) A" O, A# W+ ?+ e3 j# a5 iint main( void )/ k+ q6 k+ Y6 J+ Q) I
{
1 S& k! _% k, [) Z9 K: A
( `- x: U8 U# z9 l2 e    /* Initialize BSL */
" d7 L$ ?% j* ^- o; B    EVMC6747_init( );
' b6 d3 x9 f7 u! j) D+ k* o+ {1 s        /* Call evmc6747_intr function */
8 J- d: }4 M- q6 |+ K    aic3106_init( );
, j1 j  r7 _& E4 f        while(1);7 o8 T) F/ |! u7 |7 ?; ?
}; ]" ~$ l* Q! Y0 b' a

: ^0 w* c* u- k  D& z1 |8 P* c+ X9 p# R/ ^, z/ `9 y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题3 Z& z) Q  Z0 ?
/* Initialize MCASP1 */4 ?$ X0 j6 a' d% v0 C. @4 P
    mcasp = &MCASP_MODULE_1;
; ?- J+ z7 R3 q% c% N    mcasp->regs->GBLCTL  = 0;       // Reset2 l8 r2 _1 N+ r. `
    mcasp->regs->RGBLCTL = 0;       // Reset RX
& |4 [% g% x! c3 q5 a3 V/ l    mcasp->regs->XGBLCTL = 0;       // Reset TX
7 }$ c/ K0 V- g    mcasp->regs->PWRDEMU = 1;       // Free-running
6 K8 G$ a9 G0 U0 Z/ n) s   // configure McASP0 receive registers' q' J4 K0 N- v- `# I  A
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
0 y, U# A0 a- Z. S    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 r9 @! l/ m& ]) u* s. S- C. ]8 r
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" i( j2 _+ _, {) L1 e; v    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( ~7 A% ?( g8 T    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)3 B  |- H* E: _! {8 J7 [
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
( B1 b) b! s: l% E- q  b    mcasp->regs->RINTCTL    = 0x00000000; // Not used
9 r5 |% B% Z# |1 }    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' D9 U$ i9 a: T
0 H6 A8 `- Z" V" w2 \    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
" x) a4 }7 I; s    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& v  a$ G, D* ^2 d* u1 h, L    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 g/ W3 Y$ _" l
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) I: o  b6 {( ~  G    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
" P+ N2 L' T( E$ ]/ |5 L+ h; b, S    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
2 Z1 L! B6 }, [  o    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit* o3 I7 i+ b! K) C) P, B) ]6 b" N
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* _. d. [. N2 j6 j0 u% b! G  g) S) L3 T0 C8 i" T; l6 ~# z* U
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN7 b4 B; U5 I% J- F
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT$ c/ @/ [9 l' q
    mcasp->regs->PFUNC      = 0;          // All MCASPs
5 L0 v( S( Y5 C$ r' Y) O2 l    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 ~  Q8 g. i3 W5 ~* ?$ x
6 [' ?! M+ H. k7 a! Z    mcasp->regs->DITCTL     = 0x00000000; // Not used" C! R; o; }2 o! r! b7 p
    mcasp->regs->DLBCTL     = 0x00000000; // Not used) @3 K5 b- _. P6 Q
    mcasp->regs->AMUTE      = 0x00000000; // Not used
2 j+ L, ?9 E$ s  J" X7 P8 p, I1 R# V3 K" G
/* Starting sections of the McASP*/: \% R4 G  j( {+ Y8 ~3 G9 g7 A: C, f0 C
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; $ b& u* \3 \+ l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
: ~0 K+ u; o. K    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- G/ ]# B# V( Q6 s: |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );& _* g" e5 X: Y6 O5 @3 H' Y% X

% E& Y8 J2 R( G1 o0 L8 G$ K    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
  @! [. Z% K1 m6 _8 b& ~& e+ ?    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* X) D. f$ F9 T- D* o    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 {2 V1 O8 e2 c+ O1 L
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );* }4 v5 k$ y' l! P* @

( `$ Y% R" H8 R% I; I5 j    mcasp->regs->XSTAT = 0x0000ffff;
' h2 B/ w; ~4 }; P/ \2 H    mcasp->regs->RSTAT = 0x0000ffff;
) e, X; C) I: i+ H0 ^0 \7 a
" E/ c, |% l( G( j; S    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. D! J( s1 j. |# C. T% u# }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 Y, y+ J; q9 K    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 ~8 h4 ^' @3 w3 Y' L
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );" g& l( g; Y$ e8 C: e) Q4 b9 b6 `+ Q
  m; K  b6 e; L$ X* ~+ i+ T8 f. e
    /* Write a 0, so that no underrun occurs after releasing the state machine */
8 s5 [; q; C! a    mcasp->regs->XBUF5 = 0;  k! G5 c/ b) P' s% T
    mcasp->regs->RBUF0 = 0;
+ j( n& r, m! `4 z* b- ]! u. [6 Q7 q% u( o6 }0 ~. M
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 Z+ y8 B" [9 m8 i' q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! W3 Y4 c" e) F* [
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 S7 a, n! L+ z: Z6 D    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 ]. j8 T: n9 A! `5 r' U# U; [
$ D2 F' b5 b/ Z2 @    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 q& j  M% {6 ?4 d' b
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ b+ U; ^# ~! d( c& J/ o- K    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
- Y  Z! A3 `' L2 {    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 z8 j1 O4 }5 j/ J+ P' p2 Z
9 N% f, ~0 B& q  q
    CSR = 0x0000;' t: q. j/ T9 T* z# G5 F" l
    INTC_INTMUX1 = 0x3d;
  M) `  b! f, z" b( p' p    ISTP = (unsigned int)vectors;
9 Q- l% i6 G7 l4 r  j! Z: q    ICR = 0xFFF0;  , @* g9 e# O7 d) h  T7 A9 j
    IER |= 0x12;  , \# P8 T$ D% E% w" a# J# C
    CSR |= 0x01;  
  @; M. _$ s1 l2 X/ p5 ?0 ?2 R
* y$ v$ B& i+ @! G/ f  j" ]! o  u: `

. A$ c. i5 _: ^! y/ c5 d1 N$ V还有就是两个输入输出函数:- k7 Z4 B' }& X0 `
void output_sample(Int32 out_data)
% F$ \, Y0 A& }0 Y' {; e. {8 T2 ]{
" r2 A/ w: p0 r& ]! P  AIC31_data.uint = out_data;  9 I2 H- q  i. @) b- B
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
% ^8 W7 [0 F. |& D6 }* C}
& W9 H) ^8 W3 ^3 \3 `- y# D7 }' C. Y* U
Int32 input_sample(void)9 |; h5 f( j" V
{  
( b9 ?5 B, N/ J9 J/ ^) o  AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 V9 c+ l' k. l/ l- T2 n; K) E' P  return (AIC31_data.uint);
2 e/ Z. X. Y" M$ A  s& S2 F6 T$ ?0 e}  S0 X% x2 B# I8 i) j6 m; |

8 f1 Q$ N( F6 i' i) R
分享到:  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-12 01:21 , Processed in 0.046736 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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