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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! o! r  ~5 s  R  x4 T( Omain文件:
* }: n# p1 A8 ~4 `! ^% f1 Rinterrupt void interrupt4(void)  - ^' X3 K! x" S
{/ d1 y9 X0 t3 X, S+ k( C9 T  ]
  Uint32 sample;6 H9 @+ I+ o; ?

& M* V" ^0 s9 D  r4 q/ c/ v3 c  sample = input_sample(); // read L + R samples from ADC
2 C1 k  Z; T0 {  output_sample(sample);   // write L + R samples to DAC % c6 r1 k$ ?  o' J
  return;" x! {) _- `1 @
}
$ k) j4 N5 k- k  ^& J
. ]* \9 N4 x$ g6 b0 G) [int main( void ); h& I: V4 E% D- s! n
{
1 u, _7 i0 V$ D9 {! e! X3 a, j- ]$ r: h& T) ^7 R& A
    /* Initialize BSL */
* e, a7 T6 O6 C7 o+ t7 L) R    EVMC6747_init( );
& X& {6 r0 {( R$ {5 J% A6 e8 l        /* Call evmc6747_intr function */& [" I. h0 j9 p4 |# t" n$ H
    aic3106_init( );
7 Z2 U9 O& ^+ `: l) f        while(1);$ c  a3 `& d, X( ?7 X6 X3 h
}
5 ^- ]$ I6 N" ?! N% x$ y, J7 E5 c8 b

- I6 B/ T; s0 S' G3 U' ^; \aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
: B/ B" C- E2 `/ M' S/* Initialize MCASP1 */. `8 T/ T( x! t' W
    mcasp = &MCASP_MODULE_1;
( J% o# M! b4 S% h4 o# M+ c" L4 g* \    mcasp->regs->GBLCTL  = 0;       // Reset
) v) J2 h/ E* b$ B/ A( N    mcasp->regs->RGBLCTL = 0;       // Reset RX: ]7 T6 n! [& o; X8 s% X: |0 O
    mcasp->regs->XGBLCTL = 0;       // Reset TX! v( V# \" N% o# s
    mcasp->regs->PWRDEMU = 1;       // Free-running
$ V9 Y; j" k, H, T   // configure McASP0 receive registers
) a" @0 O8 L. H0 @% A    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
7 g( @: o4 D# {5 x* f$ N' h: _2 a    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 _6 k: T, V/ Z! F  q  e7 s; G
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) w- h' _6 c2 J) \6 o    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 I% h& n3 t, B% ]    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)! M8 H8 Y' H" }' M: }+ h  F0 C' X  X
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1+ O6 m( _9 w' d' ^
    mcasp->regs->RINTCTL    = 0x00000000; // Not used+ z" c. x0 V# M3 u* q
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 j8 T7 F3 p/ D6 r6 m! k

/ C  f% M( h# w- U5 O    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
9 }9 v' R! p" G8 V4 E    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 ]5 C9 ^7 P8 u" p
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" ]9 Q! d/ n0 y$ q, O% j
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-167 i( ]0 A' a# e6 F; B7 w8 v! _
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
- Z* K6 m% |& F% w! h' N( P, g    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
9 _: J, n2 ]/ a* x! P: w+ ]/ P* F7 _    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
1 f9 s& x  L5 g" V, e" g0 p    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 ]$ q3 E7 h  t" a  w! W
9 G9 q0 x+ `' X  u" F0 w    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
0 M. ]* Z3 k) m, [! G# m    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT# g. N# v9 x2 I  B' n
    mcasp->regs->PFUNC      = 0;          // All MCASPs/ y/ J. r6 W* B. ]
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! U2 {! N4 z4 K, @' j' `+ Y1 b& _+ d6 g2 D, N/ R6 }! R2 a4 |
    mcasp->regs->DITCTL     = 0x00000000; // Not used6 ^$ k/ R/ g/ @* R" `
    mcasp->regs->DLBCTL     = 0x00000000; // Not used, }; w) X( i1 M" {. c, n
    mcasp->regs->AMUTE      = 0x00000000; // Not used# U3 h5 k6 o+ Z) P, X, r

2 T7 D/ |+ O# t/* Starting sections of the McASP*/4 ~: r, `0 E3 w( n9 _
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 z! Y! G9 R& V1 z9 d    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
" W1 V% K% H9 x5 n* W2 \8 T7 T    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 0 i2 z: X+ ^" M4 m% B! T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );1 m4 ~7 j+ {3 T: ]. T9 e: J
: g; h- X6 O3 F' y8 Z8 }8 Y& j# h
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 ~  K, S4 S, P( m- \& b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );4 ?+ u! ]! ~7 c) l
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 V1 k' l/ N- ^  w* }- n
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 z- ~" B. x3 O$ s5 n, y+ [
# y+ e, H, Y, s5 A5 J$ h8 v% Y+ i. x    mcasp->regs->XSTAT = 0x0000ffff;
" D/ H6 Q0 h' g0 M    mcasp->regs->RSTAT = 0x0000ffff; 7 T- t, e5 m+ q* B  O" ~

) Y; X, V( b; Q- M    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 Q6 [, @5 q2 y. b- y- Z" H4 g! q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- k  _" {( X/ @* y: v; M
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 B- j2 R$ n9 ?' f( R: W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: m$ R0 @# S' D  n% c" ]7 C, o2 i  O4 c  I) G  U) l  E! N
    /* Write a 0, so that no underrun occurs after releasing the state machine */
* K6 o( U$ K9 {7 b7 x. k    mcasp->regs->XBUF5 = 0;
6 S! `& T  H0 D+ @    mcasp->regs->RBUF0 = 0;
6 \; U9 T9 w  s; o
& `1 s2 M3 X) n! D. d/ [    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / E* c  y8 X; n) v; x( q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
+ i; [- k- w& a8 t; a5 o: r: y    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , D$ c1 _8 b% c4 k) x
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( [/ z. Z* y# [8 T4 r  n8 t: c. Q& b1 n# o' Y+ W- S
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 u0 \8 o7 L# {: }0 ^7 W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );8 w7 F! m3 ~; ~9 s
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; + C' [, d) s- Z5 ^! ~
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );2 `. m5 M6 Z& D/ x

4 M4 E9 [! }! N8 L$ w3 k+ ~    CSR = 0x0000;3 h1 c- {2 V* `8 o9 |* v
    INTC_INTMUX1 = 0x3d;, W: E6 d/ Q1 W" Q2 f6 j
    ISTP = (unsigned int)vectors;
6 u) }' p( @( ?9 ^5 H+ |) C4 p. ]    ICR = 0xFFF0;  6 G6 y- B. I9 X, ^; N1 c
    IER |= 0x12;  
. a. I. w- H/ u6 F3 Y4 B+ b- P    CSR |= 0x01;  
0 D8 C& p" E8 |1 `, J3 [6 ?
  S/ D' q1 l, N. T7 P+ c5 o) W" e* ^; P  T

8 @0 C% R6 d, u+ t还有就是两个输入输出函数:
) o: f+ U: Z! z$ z: l5 J2 G5 \void output_sample(Int32 out_data)8 Z; Z7 J. N3 w/ |5 S1 I
{% t" q5 g3 [) f- q6 S
  AIC31_data.uint = out_data;  
# T" _% V- X2 B( w6 S1 f  MCASP1_XBUF5_32BIT = AIC31_data.uint;5 \: d$ J$ m( k; T. i2 O
}
* ^  W. P7 Q1 M6 {' m5 J! }" b- C! d- A
Int32 input_sample(void)7 w7 M2 m, A4 F2 O5 J
{  
  |5 p# C. L9 R$ n# H/ ]  AIC31_data.uint = MCASP1_RBUF0_32BIT;3 ]7 ^6 N3 ~: E% z( x# V: u* S. j! u
  return (AIC31_data.uint);& _  P  _# R4 P: q
}
0 t, T: w! [& A: M- U
4 V& T* W! x& D( G! i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-7-8 19:59 , Processed in 0.035587 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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