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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:1 r8 r& u- j, o) u; ~; ~
main文件:8 T- [% w* j$ g
interrupt void interrupt4(void)  5 A2 A$ D' @6 I6 @" H
{# k$ S+ c) q" M
  Uint32 sample;9 x$ Q( R& a7 L1 _5 x* p/ y) a1 u$ E
' i1 S% s$ v& x/ y& C% ~/ O1 o4 E% h
  sample = input_sample(); // read L + R samples from ADC
3 N8 K) X% f4 `3 \  output_sample(sample);   // write L + R samples to DAC ! l1 a- b9 h5 L$ f+ w* j4 R0 ?! a
  return;# |  \0 W/ j$ G# ~6 K
}- W9 {3 R; f  C, s( r& N- N5 X! e

* L' w# {1 N' r. uint main( void )' Z* n# z2 w) V3 p- M( ]! Y  v
{8 g% w6 C) i5 o  @4 ^/ t8 l( y

4 I4 }8 f0 {( z5 }    /* Initialize BSL */0 R0 Y9 l, H2 x+ S$ z( j3 i! K
    EVMC6747_init( );
' a) o% [* l$ b& a% V        /* Call evmc6747_intr function *// x0 J, T1 ^: I% x' a
    aic3106_init( );
' Z9 f6 E- D3 d; Z/ k        while(1);  j. R& E5 f1 N9 t' S
}4 D1 y: |) L+ U  A- K

! P: T1 n* F- A$ M! Y- G1 A& i# F/ o" B% y7 y% L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" \1 _4 S# h0 t- y$ J: z9 p/* Initialize MCASP1 */
3 B# C  K! l) |- n# g$ n    mcasp = &MCASP_MODULE_1;
- o+ ^8 Y( T) B! Z" N; r$ c    mcasp->regs->GBLCTL  = 0;       // Reset
$ @; s, ~9 v) A4 N$ r% n    mcasp->regs->RGBLCTL = 0;       // Reset RX, r" y- o- c( g( s% r# l/ E& C2 q5 W) B
    mcasp->regs->XGBLCTL = 0;       // Reset TX
; M; K& O8 d" v$ A    mcasp->regs->PWRDEMU = 1;       // Free-running$ q! T; Z6 U7 H& v) I
   // configure McASP0 receive registers9 k/ t2 Q! `) D9 e" ?! ^- M
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
6 C, }% `2 _# e" `( h$ w: {& ~4 K% r    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ G* e4 Q! n0 q
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word+ H' X! t! R4 L' D
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side). H1 H: G3 ~  E5 Y% m9 J$ {
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side). o% s7 w7 f5 w7 A! L1 c. d
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
, q4 j, u$ ^- z( [5 d; @1 `    mcasp->regs->RINTCTL    = 0x00000000; // Not used
8 \4 Q* l% k7 b9 b1 `; L# D. _    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ v: o' M4 S1 J. Q+ C4 \
: u* u1 `# H& E5 c+ S$ b
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used2 h4 n+ Q& i& w
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' w- {& X( L$ I/ {- c    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) n" l4 ]) \! q& J1 o    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16% a8 {2 Q/ K- Y, h
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
5 L' R# y: q3 [- ~/ l2 l7 |& R( f    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
- O0 T& n( i0 |! f2 h1 x7 H3 _    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit( k9 c/ d! v5 Y& |
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, `% P7 f: T9 e, {% R. Q6 r6 b! Q5 G- b, B% o2 c* O
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
& W  b- |8 s" H. j4 ?7 |( ~1 [    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
3 z8 @8 g! l, }5 Q8 R, V5 U, c" c    mcasp->regs->PFUNC      = 0;          // All MCASPs3 \' |) v6 H  N! R
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
% K; j- X7 D- b5 b2 [9 t1 ?+ c0 s
    mcasp->regs->DITCTL     = 0x00000000; // Not used
- Z1 N0 b3 i+ G7 [: @    mcasp->regs->DLBCTL     = 0x00000000; // Not used1 {& o) i8 `3 K- `3 ^+ L
    mcasp->regs->AMUTE      = 0x00000000; // Not used
+ Y! W3 n9 i# [: a+ D: D5 R1 s2 i4 N1 ^! f/ @1 p+ v
/* Starting sections of the McASP*/8 k: l2 w# A+ j' X6 W& ~
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" N  i( b; l5 c; c) i7 ?8 w9 n    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
! F  l4 n" L: [- Z% K" a! o* w: Q    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # D) }  b5 U# w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
8 x3 Z+ R3 ?: ~! o+ J0 @( K( p7 i+ K# P; n6 d- r& A5 |
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ) \# w5 V$ Z& O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ D" W0 l; Q) O. u) Z    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 X1 F0 t% c1 \% l& C* ?  V
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );7 K+ L( l: H# J7 J/ {3 y

, y# r% e3 d8 n2 n: t4 P    mcasp->regs->XSTAT = 0x0000ffff;
  N4 t; d4 H( [4 [4 e    mcasp->regs->RSTAT = 0x0000ffff;
$ m0 L2 k$ H# `9 n: u( p" M4 k4 m( X# Q, ?! i- M! m( }5 R
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! l0 |9 }5 K$ B+ E
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. h: @6 S3 _9 |  i$ H( K. \/ s    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 4 {# c. _" c- g# [
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );5 v  T: K+ s" a, a# v

& t% T/ _, }% Y! @5 E" M- p    /* Write a 0, so that no underrun occurs after releasing the state machine */
1 k! a3 h$ ?1 b0 b    mcasp->regs->XBUF5 = 0;4 U" J) X' A( f5 ]6 {$ m; G- v8 W
    mcasp->regs->RBUF0 = 0;
) E; y1 ?+ |3 T3 a
, U; Z5 o8 `5 v2 c( p- N8 }/ w* ]    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / w3 v# S$ t  O- f# \" Q* U! |# i
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 o2 n/ S- ~( B9 b6 L    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; t: W" b* F+ @' h' j1 Y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 [: H& I6 R/ J& u/ B% N. n6 X
8 _- r, v& t2 [0 w3 g    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! B2 s# J; P7 z4 R" u; A4 j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% ^3 U5 B( v+ \    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 {+ s( o* Q+ H4 c
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 v, @- V* R2 y2 g5 R; b( u- M4 Y. M, h3 b0 Q; F8 x
    CSR = 0x0000;) r" N- ^+ a* e5 {- Y: u6 j1 ^8 g" l9 n
    INTC_INTMUX1 = 0x3d;
# ^" f0 |. O1 K) g8 k    ISTP = (unsigned int)vectors;" w3 Q0 g- I1 @/ U1 M
    ICR = 0xFFF0;    E+ g9 W  m9 D5 W
    IER |= 0x12;  & A+ e& z2 U+ I% m. d$ Y) e8 {
    CSR |= 0x01;  * n- o: r/ ~' g8 v* Q% _4 \+ J  p
# T3 M; W2 m2 B3 n" X

( h) [( w! r: k6 L4 t, h4 W, r$ T* v  w
还有就是两个输入输出函数:
! t# s1 F' }4 z8 o! ]void output_sample(Int32 out_data)' a/ w' O6 y0 s
{6 \& w& q' f* C% V0 g8 ?. B
  AIC31_data.uint = out_data;  0 K& E8 I1 R5 I) w- G9 j
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
, n! ^0 z- m) c$ |}3 K" x+ N& a8 T

  L: q6 K4 z- A( ^: ~8 _Int32 input_sample(void)0 o- F. q; v- I& m1 h( G# P( |) [: p
{  # q4 a+ o/ n4 Z% S: W! K; H5 f3 s
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
8 l. b+ F$ E8 f  `% Q" \  return (AIC31_data.uint);6 V  X7 H& j8 g* N5 c5 s$ ]: [
}& N0 y! O/ R! H* {1 D+ j, N

: H3 [; y& ^# Y" e1 B3 Y7 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, 2026-1-7 17:27 , Processed in 0.038225 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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