C6747利用McASP发送中断方式完成音频输入信号的直接输出 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ X* k2 |7 ^6 _, C4 Dmain文件:
( U3 e2 l) X1 Uinterrupt void interrupt4(void)  
% a2 Y1 m: M4 ~# ?1 r7 E! F{! R+ P3 l% {% j" C
  Uint32 sample;
' M, U! \% a; t0 q6 R6 e# }  e' g8 r' v3 ]
  sample = input_sample(); // read L + R samples from ADC
: z- I* U0 s- ]1 W* u& t  output_sample(sample);   // write L + R samples to DAC   \! R% `7 H# `( U2 c
  return;7 i, ~/ q' S. g) Z3 F4 q
}
; p( [( ~, G" _# \: e! O' s4 Q( }- I: N: j
int main( void )
1 C# A# g( @+ X* Z% n{
4 t- J. a+ _' U  ]* M& M
& s$ m* q6 f! F3 B% V    /* Initialize BSL */' U% {* [$ Y5 w
    EVMC6747_init( );
% W7 n5 G4 U! M" _! [        /* Call evmc6747_intr function */
) a0 h" y( }/ y* h+ M    aic3106_init( );! Y, Y' e4 L9 z
        while(1);% U% P6 a- l( m, Q
}
$ e" Q1 _' D2 r5 n, |: w0 Q/ z, H7 ~( R7 S" U( D% K# _# Y3 i- ~' Y# \3 C- h
5 w5 F! [" k0 j3 s
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" d2 o, C" D) x& Q8 J
/* Initialize MCASP1 */
4 x: k7 `" F5 B5 z, Q    mcasp = &MCASP_MODULE_1;
: {, N: Q, @, B8 s4 P( _    mcasp->regs->GBLCTL  = 0;       // Reset
; r# a" ~, Y1 R: `# b' X2 [    mcasp->regs->RGBLCTL = 0;       // Reset RX
! B! S" k+ J! {  w    mcasp->regs->XGBLCTL = 0;       // Reset TX# b+ J$ F8 M8 n0 o* N8 p0 ]
    mcasp->regs->PWRDEMU = 1;       // Free-running7 z$ V( S3 P! {0 X2 s8 O' i( z
   // configure McASP0 receive registers( P7 ]% v, c. o  U
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used2 ]+ R5 I  O- t7 x* g& b; c0 T% j2 ?
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 T* F) {5 d: J1 ]    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word  r  {& T, l2 d1 N
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)4 G. t) ^( j) F) `! w1 T
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
# R% h$ b5 U. I+ R- m    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1' q- A5 F7 ^- D
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
  I1 J: |1 [& J7 o4 ]. a    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; @3 H2 x" q' M% G' z, b
* ]. b  V, p* h# h
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used3 W1 H  x' y+ G) e, u1 i6 I
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 X+ t* Z4 k' V( H7 k( z
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ S- X2 y2 [+ D$ ^+ `, w
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
6 P  v, T8 H( z  D7 [# b    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK8 ?8 }8 U8 _9 i9 \& n; B
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1- ]; z0 K9 x4 ?, ]
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit! R1 D6 f: y1 {8 @' a% z* ?
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: L, s/ |! p! j* P" I; n" O7 N7 v, L6 q& T4 N+ t! f
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN: a" K" W0 S4 K3 ]5 r5 q
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
0 b/ i$ I* r& {) B( O1 V3 u/ _    mcasp->regs->PFUNC      = 0;          // All MCASPs# z. z6 c- N1 M
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ Z% E' m" a4 P- s0 ]/ @
) }" c/ M- `7 {. r% V/ V5 g    mcasp->regs->DITCTL     = 0x00000000; // Not used
/ H: L; P8 l' l+ C1 ]1 t    mcasp->regs->DLBCTL     = 0x00000000; // Not used& p8 q: K# R. Y/ E0 g# ^
    mcasp->regs->AMUTE      = 0x00000000; // Not used
) Y" n5 E( ]% H( D  C2 Y6 T
& @$ L* g( H& w' I' i# q1 G5 z, Z! e/* Starting sections of the McASP*/
3 C) V( {* `/ `) }" C+ p6 |" q    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; : }1 f0 |; l6 B2 O6 P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
1 c0 r- P+ A. @* ?# {) I" R3 I* I6 x    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # {' [. p. o# Q( t9 j8 i: Q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" w( ^7 x+ r9 |$ o1 C7 N* Y% ]9 ^1 z
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' P: Q' E) v$ O& V9 A    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
  ~: X' N; M- F" b' t    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ ]6 q6 ]  F* H# h% A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
  f! |9 R& T$ H$ @6 t  i4 R
; x8 D2 C# {: O& [/ p: L3 T    mcasp->regs->XSTAT = 0x0000ffff; * Q$ v+ A1 G3 m8 C
    mcasp->regs->RSTAT = 0x0000ffff; 5 _4 |7 M3 R+ }3 S! G0 H, r
% @; }/ Y; D3 t( L  d' B  y8 C8 M$ H9 W
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 W5 X7 g" C2 T$ y$ g. Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );/ |; D' m4 w. O7 O& u  c2 p% P$ L
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; # h. J' Q; u4 }$ P
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );: w% {: w- t. `6 a. W: \" p
' Y5 k6 ~# ?+ p: o! C
    /* Write a 0, so that no underrun occurs after releasing the state machine */
$ n1 p: Y( F  o/ X) c6 G    mcasp->regs->XBUF5 = 0;
5 j1 R# q5 [* R1 Q0 ~% ~    mcasp->regs->RBUF0 = 0;$ e' W8 M  B! A! `) I! G6 F% A

$ G, h& Y& s9 T    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# N) C% }# |0 O* l' q: g    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" Y9 w' y) R- D7 H    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% Z- t0 Q4 y5 o    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
  Z' e7 R5 V5 _% ?' _' m0 F+ N; l
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ y, u  n3 |, |* Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 ?% g2 |+ ]) w
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
7 @0 B% G, j" ?4 `* a: {8 O8 ^    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
& i8 ?. F  e, y' a- i
% G1 [3 t) b# c- \    CSR = 0x0000;. a7 e, p2 S2 z
    INTC_INTMUX1 = 0x3d;- \2 [9 u3 c2 N6 F3 P
    ISTP = (unsigned int)vectors;6 i( D& Q1 u- e0 h
    ICR = 0xFFF0;  * Q5 u( m! k1 C! r' |. F0 O
    IER |= 0x12;  
  W8 @! b; ?- V* V* ?! c    CSR |= 0x01;  # d$ i0 |9 q5 X+ ^# Y$ q. M5 Z+ ?1 }2 m
! D* E+ O( v& ?& s$ g
0 m" U3 s) E! O9 K9 G

$ m5 Y, u3 K+ i' H6 {8 q还有就是两个输入输出函数:
1 C. J7 c0 ^3 r$ V0 Jvoid output_sample(Int32 out_data)
+ b. R6 T$ r0 k: d1 A{5 e; k$ z0 j9 H( }7 l+ _! Z
  AIC31_data.uint = out_data;  
! r5 a! L: O5 V8 t2 P; H  MCASP1_XBUF5_32BIT = AIC31_data.uint;! p  z; I7 n7 C2 y4 B$ Q0 \3 X* Y
}
, i$ q$ h6 o" e) V6 a3 A' Q0 ], f( U/ W1 \) p% e% I8 H
Int32 input_sample(void)
1 o6 r1 b3 L, G! Y4 N{  - O' P3 o4 @3 h3 k: d
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ G0 w( H# e" {4 ~8 H( ]( D  return (AIC31_data.uint);
1 M6 ~1 }7 h3 q}3 V" l1 k/ W" a! }# U
( K2 `/ X) w: G+ F2 Y* V& 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, 2026-2-7 10:25 , Processed in 0.050414 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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