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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ e0 _  q1 c9 @3 T, w- k8 ?' @main文件:
/ y  K: K! w+ T6 R+ }: G& Ninterrupt void interrupt4(void)  
9 A  B  Y: p1 I1 a{
% m; N* J. E, P# S: \5 Q  Uint32 sample;
  k, d2 R% i2 p- P# r6 m+ `/ L" a. C+ M2 J/ ^/ z; u) l& V3 ~
  sample = input_sample(); // read L + R samples from ADC
6 h( {+ O4 G. x" S9 L# g  output_sample(sample);   // write L + R samples to DAC ! _) c8 |  a9 I. a  l
  return;
6 l, f6 L$ e9 p}! R, \, \) B* l. p# b0 O
$ g! L: y% e5 C. Y- s
int main( void )
3 N5 I( @8 i; K{
3 Q. w/ Z; G6 x
; v: ?+ R# g5 d    /* Initialize BSL */
7 ]5 h0 q2 Z5 P/ K    EVMC6747_init( );! X$ e2 ]) A3 F9 W3 o3 D/ ?4 L
        /* Call evmc6747_intr function */2 J, e( d" Z1 q) d( V& }9 t2 [) w
    aic3106_init( );& Z: J0 a9 v  @' {5 q8 v- J9 e
        while(1);, ]; j6 \/ i& A! ^, D9 ]: U2 R
}1 }! B7 u) R+ l( C' `! ~- \

7 u1 U6 b  |' i+ q. n
  H7 l4 F% C3 |aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 Y! J$ W" O, F* _/* Initialize MCASP1 */
: Q7 |* |$ R+ G; }3 R7 |7 v3 M7 Q    mcasp = &MCASP_MODULE_1;
6 O1 v! c% P, ~    mcasp->regs->GBLCTL  = 0;       // Reset4 q) a* G2 r& v; T5 w7 _
    mcasp->regs->RGBLCTL = 0;       // Reset RX
+ K' j. f& D' J6 @. K" k    mcasp->regs->XGBLCTL = 0;       // Reset TX8 r* z; w( h$ x
    mcasp->regs->PWRDEMU = 1;       // Free-running( W4 }! `# ?) K0 Q: M' ^7 c' v3 O: C
   // configure McASP0 receive registers9 |* P0 p. x3 ^0 _
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
* @: ^- D& j/ v9 U( u8 U8 i    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ \6 K& r+ z) H    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 E0 m4 I9 W+ b9 e! V    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 l4 K6 b1 d- r7 e0 q! i
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)9 z5 Z* h5 u" J& c. k1 T/ ^& A
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1! o$ U( d5 Z% o
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
! F0 a, e+ E: R1 z    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 W, \  ?9 u7 B  C, p2 W' ~" H6 l

# w% N* {& q) ^( d, a1 y* }: q    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used! ~+ [& Q  y# i4 y& n7 \
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ j/ Z- ]# g0 m; I' I% k$ Z
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( x8 |  N  ~6 }9 i6 d% V    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 T5 w  K: R' u! u8 L' B5 D
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK1 ~( J  i, m, t% x4 k/ S% i: e$ {
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
( S# n. q3 v9 W2 ?- O    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
; D+ Q) Y' ~: e1 S    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 n% e' n& g% d6 v- ~4 _/ W* Q% T
/ V/ o' L; b3 U, p: Z) D" U    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN" Y1 [& W' n: V# {5 z  R- c
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
2 w& G' Y2 J. ?+ x4 R. ?    mcasp->regs->PFUNC      = 0;          // All MCASPs- u& P+ t2 L. m! R
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. e; `; F' H9 o; }. p& c
# ]9 ]+ d9 U3 N& `- n& Q
    mcasp->regs->DITCTL     = 0x00000000; // Not used, F: i5 S6 \  t; s3 M% N% ~7 v2 t
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
* _2 |$ Y( V& c  w0 `7 S& F2 ?    mcasp->regs->AMUTE      = 0x00000000; // Not used
- O7 |7 q$ D6 r% w
7 F. j- k( V1 Z& j$ M/* Starting sections of the McASP*/
. x8 I/ q4 b4 g. a8 K' p    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 1 m* g; A/ n" a( `" _) H, }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  4 b$ o0 w  c" Z9 J/ M+ y, T0 C
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
0 o6 d/ P/ J& N" {8 d# s+ t- H  ]. \    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );4 r8 Y; Z) R5 Z3 q, @0 s; I

+ M' p, p2 Z7 ?+ L3 S# ]7 n    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# K9 y! y$ w4 c, W& r0 b. L; `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );! q+ h' A; h* g$ g* a
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % Q; ~8 \( i% [, @8 k! k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 s4 T% F" ^- e# E* Q6 J4 i: I# M3 ?0 k5 \! f6 i" Q3 O& P) q' C
    mcasp->regs->XSTAT = 0x0000ffff; 7 Y+ B2 f( m+ ?' z% D# r/ u; I
    mcasp->regs->RSTAT = 0x0000ffff; $ y6 T4 o  J& ?8 D& p
# T8 r  q5 n3 W  J3 x
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;  g1 G  f* X: V/ T
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ J, ~8 T$ L* _    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 o  x4 _3 C6 y' m' a6 A
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );& m( v, C  \0 S7 J+ {' M
. l7 c2 N% ?. Z/ R( n7 ~
    /* Write a 0, so that no underrun occurs after releasing the state machine */: B" f6 Y' h6 S9 O. H
    mcasp->regs->XBUF5 = 0;. u# i: V8 n2 u5 u& P- K! r# v
    mcasp->regs->RBUF0 = 0;) ~4 I, E0 {* L
( h* V/ ?7 z% h& M
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; , x; D( ]  c0 L# w1 Y7 F( o
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( d. d( u8 G6 Y    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 [5 w% K- B; [    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! {# q, ~7 H( D: q4 [+ Y- e
2 C; S- J8 {1 n9 V; ]7 W- U    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 `$ @$ F$ z0 U! s    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, t" n6 P  i2 w( H! @& a' i  r$ @
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
: O# _3 u8 d( R$ J    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, X) z- P5 [8 {. R1 b& \3 J
+ ^+ V8 @2 O& O# k/ X
    CSR = 0x0000;; A" F% F0 f; T) P4 Y5 \; Q9 e$ `
    INTC_INTMUX1 = 0x3d;( O( y5 p) b; `, ]5 h8 V) t4 _
    ISTP = (unsigned int)vectors;
9 F4 I% J, T" M. V- S4 \    ICR = 0xFFF0;  
' X( ], Z* h6 W% O: H5 X* {9 _    IER |= 0x12;  0 L% k" _0 k' a/ G5 K
    CSR |= 0x01;  $ Q) Y1 Q1 W  t( R; }4 W

1 F7 R8 J/ D/ W% ^, O8 C( x
5 x; A5 |: u7 F  I4 t  |6 H+ e/ K; T6 q; h# p, R/ l0 N
还有就是两个输入输出函数:+ }  z- J2 i. f3 l
void output_sample(Int32 out_data)
; c* m; r" r% \! K& ?{
3 j" Z* N+ {, F# u- m' W  AIC31_data.uint = out_data;  " M! U! u) z1 j8 K0 t
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ Y- F3 D4 }" J6 @0 J}
8 S; ]4 i# ?; w7 {. l( r! Z8 R8 `- F2 {& q% W8 B5 H4 E# m
Int32 input_sample(void)6 m3 R9 `+ E0 g" I9 e
{    u4 v' L' }' a
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 e2 T! P) D2 @- e4 F  return (AIC31_data.uint);
' v$ A* c0 C1 G6 D) G}$ W3 v0 d5 z/ \  @

1 W/ k0 Q' U$ a3 M9 O, }. K
分享到:  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-14 22:13 , Processed in 0.051179 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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