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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 G; w6 y: _" smain文件:( R# X8 Q5 K5 \
interrupt void interrupt4(void)  4 p; m& I9 g* U8 g3 j! }# z% Z
{
/ d% M  M" |* c3 m& `5 ^) f$ H  Uint32 sample;
+ @; N% I6 H  M6 d1 ~+ _" [% v; \5 T5 @( e  B
  sample = input_sample(); // read L + R samples from ADC1 ^7 d6 o  m1 v9 ~
  output_sample(sample);   // write L + R samples to DAC
0 p& P  w4 z# V( u& U  return;  \! a$ y: T  ^: H
}( ]4 \! J! s3 I7 Q8 O& L
% p; O! i* G% ~8 M5 N9 Z( g
int main( void )
! l* |5 u. X; S3 h- m{* z! Y1 p; B, |; a9 }! z
/ o- h) R+ D8 i4 [- q7 ^
    /* Initialize BSL */
! y  U) E# M6 a  W    EVMC6747_init( );
3 X& j8 x+ ?& z, X4 ~' {. @        /* Call evmc6747_intr function */
, ]$ S4 |2 \2 o$ v6 R' Z2 I8 w    aic3106_init( );3 C; }4 E$ I. M
        while(1);% [, p0 A% c3 ?
}
* p8 v8 Q5 r, E5 q# \6 {$ b
# x" T" v6 D$ i- `4 m# K( q7 D
0 \2 G% n9 E. ]9 a' u( s; a9 Raic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 m7 p5 u3 n' H6 t! J# N/* Initialize MCASP1 */9 h1 M  g2 ]$ @
    mcasp = &MCASP_MODULE_1;
$ `3 S9 N3 U' r    mcasp->regs->GBLCTL  = 0;       // Reset: E% A+ L3 B3 M# h7 A5 P5 m
    mcasp->regs->RGBLCTL = 0;       // Reset RX# I7 }1 h8 @) X( O* s- G
    mcasp->regs->XGBLCTL = 0;       // Reset TX
; C- o- y3 G6 H( G& E& _6 i    mcasp->regs->PWRDEMU = 1;       // Free-running
6 i0 Z) n  V/ R4 j' G4 ~   // configure McASP0 receive registers$ d: K1 O5 c( z3 k& T+ l$ r  `: t
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used/ D/ a/ V2 q6 y( p" k
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( S  b1 N7 ]: l( N- h8 A: \, A
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ l: _$ H  Q: F5 n% W    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 X$ B" V# `  `' ?* g, ~
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)( k( p6 V' A; o, c
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,15 p) \" t" l; D3 B! C8 e& S# K! h* t+ F/ k
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
3 f$ F. ]& }3 k) x  C" X    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 N3 N0 Y8 p; j6 ]1 a" S# K0 {$ B3 }  R* C% h5 t( e' @5 ~9 K
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
) c5 s5 W2 f$ `/ q! U    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) y  t( k: e/ U$ B, C( ?
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' n9 c! q6 @- `( k- @0 S    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16* T, I, A6 Y. e, t) E
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK+ [$ z* F! n/ s' o$ {1 I
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1  ^' m. n4 A# t3 q/ f4 C1 ~
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit0 k* ]6 \3 M: j, [3 k; B
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. c4 b* K* e( N  {, @+ {
+ g5 o- m( ^+ Y8 I+ Q    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
$ i' Q/ T3 ~% a    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
" F6 M/ h: R# L0 S    mcasp->regs->PFUNC      = 0;          // All MCASPs
! m: y) L+ [( }    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 E( \/ ?. L( ]# M/ l9 U: F" _0 ]- x& }  o/ F6 i
    mcasp->regs->DITCTL     = 0x00000000; // Not used9 P+ l) _& {6 D* T/ N
    mcasp->regs->DLBCTL     = 0x00000000; // Not used% p/ {9 M) y: V
    mcasp->regs->AMUTE      = 0x00000000; // Not used- S% A. z3 e& ^6 Q8 M, e

& v5 `/ F0 H+ _- x% G8 z6 ^) n/* Starting sections of the McASP*/0 ?4 o& {; o8 ~3 r( A8 d
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ) X* p" r: e' e4 F$ g- \  |8 |  {! d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  & P# L7 ^- }. U* V5 J% B+ @! G
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
9 ~7 j0 f3 m8 ?! w1 k+ X1 ~; ?$ ?  A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
. p3 y; ]* i3 u
/ c" q7 b; x0 ?: Z, ]. c) O    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 j, r1 k6 A1 n  o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 Z! g& Y1 Q( \6 s# C0 H    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 V9 q# ?$ h$ J6 N! S6 y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 t% o! I6 E7 V3 U$ Y* T# {( T) i+ a, ]9 N! |
    mcasp->regs->XSTAT = 0x0000ffff;
' `* Y6 c: ^: G  x# i    mcasp->regs->RSTAT = 0x0000ffff; ; F$ F3 q0 n7 n1 `( d
' }" p1 C; w  ]
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. Y3 H# R0 O2 ^. @/ Z) m2 P7 R( d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) \/ Y$ R. `0 y1 P: {5 l    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
7 K' h( i5 z$ f: J) m6 a, d    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* |5 c; l; R; c) s, O
3 u- h" {' a) D, L: z8 _2 {    /* Write a 0, so that no underrun occurs after releasing the state machine */+ v# H; C( p7 E& M, p+ d
    mcasp->regs->XBUF5 = 0;
6 f$ L: ~% _7 W" J    mcasp->regs->RBUF0 = 0;
+ d" d3 T- e5 D" g; ?' {5 K1 ^8 f4 [+ c4 f  W; i$ R, r
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 e6 N2 p8 T* M0 ?2 b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );9 n0 g' B+ E5 z# j( r
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : z7 O) M; }- i1 W4 A& `0 G
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 f  L/ U3 i6 f7 k) q; B# @( I1 g3 e6 s/ A. I
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 N; U: b- U! ?4 h7 G0 h2 M. s: \    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. l/ s$ d5 G. V% _
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* S1 o$ J2 X4 ~! V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
; }+ v' J2 C% E$ ~  M6 M( c% Z6 b
  h8 B( N; X& `/ ^    CSR = 0x0000;
# {0 c6 r% f5 v$ T) Z    INTC_INTMUX1 = 0x3d;, L4 Q: u: j. k; {* p; K2 [
    ISTP = (unsigned int)vectors;9 c" A; g% n; H  s* \+ m# D
    ICR = 0xFFF0;  9 i; B" e2 T* Q! p( d
    IER |= 0x12;  $ |1 R1 c. f- T. u
    CSR |= 0x01;    H5 X, Z5 E6 d& J; }5 }7 p

2 }7 A4 m# q( J$ q( Q! {" M; O$ R$ y/ B

  D1 n. g+ r: U0 F还有就是两个输入输出函数:1 ?0 S! v, V, h
void output_sample(Int32 out_data)" h) n# [8 ~* u, Q! @+ ^
{- G( I: c, n. ]  D* _
  AIC31_data.uint = out_data;    ~' G# Q' G5 {' s# k1 z2 f
  MCASP1_XBUF5_32BIT = AIC31_data.uint;- l/ v1 t& N  q' Y) p
}0 z5 I6 h1 A1 q, a
  l7 G  E; [6 C2 u" Z& w! R! Q
Int32 input_sample(void)9 e% K- H9 h2 A1 i, d% e7 F8 s
{  
- L# @2 Z6 d% u' z1 u2 L9 d7 E( l" ^  AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ o& L+ n) _4 c$ U0 E8 ~/ z1 O' e0 b  return (AIC31_data.uint);
4 ~- V. p' o( v8 q) E9 C7 `}% D# \( E& i  m# W/ {- j5 U4 ~
. N9 R' j0 P! J, @4 X
分享到:  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-11-5 05:38 , Processed in 0.037070 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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