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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# B4 M) }* B1 t6 Z0 z, J! }- |
main文件:  `7 i+ v5 ^! l  C, N" C
interrupt void interrupt4(void)  $ K- ^. R7 a, |2 w% Y! s+ M
{
4 V$ @: D5 S2 V0 N6 n  Uint32 sample;
9 X. d( n1 o5 }6 D& ]8 ^# @( i
' _" f5 t  @' D0 z: j1 h  sample = input_sample(); // read L + R samples from ADC6 N3 ]# k5 L. `
  output_sample(sample);   // write L + R samples to DAC : ^! E& M& [* a* G) ^4 j! g; ^- H% F
  return;
* E# N& U. ~# N; ]}; q) n% D2 [  e& O  d; f
" y9 a$ C1 M* d" y% p
int main( void )* U: x1 x  h8 c5 z/ l: S
{, ?* Q6 b) G* n! H; H

  p/ U- N( D! M( ~    /* Initialize BSL */
! r. O# f5 {5 Z) \! a    EVMC6747_init( );
" T; d6 N' @1 Q! i! ?% k        /* Call evmc6747_intr function */
; |3 t& S' u. U7 @% s( R3 B    aic3106_init( );
) E& c  Z4 g$ D9 l$ M' W, W0 H        while(1);! X6 Y5 H  O+ l  t. v% E; L" B2 n
}+ P3 y5 z# H/ {# q0 R9 D
; S2 G: E: |; I$ x# s- Q: D! l

. q4 ^: ]+ F/ x9 Haic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题/ ]0 F+ p9 r$ K
/* Initialize MCASP1 */
! ^# q# u( O) |2 Z# Z    mcasp = &MCASP_MODULE_1;
5 y9 ?2 F: t7 S7 K    mcasp->regs->GBLCTL  = 0;       // Reset
, \4 O, [) b7 r" G1 U. a' {2 v    mcasp->regs->RGBLCTL = 0;       // Reset RX% Y; o+ E. ^' e2 S
    mcasp->regs->XGBLCTL = 0;       // Reset TX& A& x( ~6 ^3 U
    mcasp->regs->PWRDEMU = 1;       // Free-running1 T' r- g) Q4 @% a
   // configure McASP0 receive registers
1 r0 S8 D5 [3 Y: m    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used7 H2 w+ J# c6 e4 y! [2 V8 j/ x# v
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( l; O$ t* r, T9 Y* @' Q  M    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ @* I  y: H1 r7 a' |
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)+ g5 s) c) T3 V& I/ _( W4 D9 M
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side). q* K& l, S' t
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
: Q1 G1 H" g& N* I# u* N8 p" s- d    mcasp->regs->RINTCTL    = 0x00000000; // Not used
! I$ k* D3 i0 K# N! F: J    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. z; S; f5 k: v% u. I2 Z
2 G5 `! l9 M' S7 M
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used% Z2 s/ [/ i- g" P! Q9 O$ r
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' l) R7 |4 n- J, g6 `/ Y' c
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( t5 ~  V: v- D6 f7 m6 S    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
  A. T3 Z" v/ j    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK6 F! L/ t+ y. F) b* Z' d! w. s7 m6 F
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
7 A8 E: _5 ~* T1 d    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit, x; Q) x9 J: g0 ^& }
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ h  s' ~+ h" A6 G

, c% b4 {; N" R' u, k) p% [    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
# ~0 I- S, l* ^- m  `6 I7 ?7 v    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT2 U4 l/ I3 R+ m6 ^. s% a/ @
    mcasp->regs->PFUNC      = 0;          // All MCASPs+ f4 \, J" ~. X* L9 T1 w" Z
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 P. i* e& ?' W9 o0 l8 k2 ^* y0 v4 j# b5 H$ K, w2 M# y
    mcasp->regs->DITCTL     = 0x00000000; // Not used
7 _6 @; P4 R; R2 y9 l  G    mcasp->regs->DLBCTL     = 0x00000000; // Not used
3 k* V$ x8 W8 w- P    mcasp->regs->AMUTE      = 0x00000000; // Not used" @/ L- I3 U: u! b( |2 f2 \

6 h3 R& T% w, l. F3 `0 i+ q/ E2 T/* Starting sections of the McASP*/
% z1 ~4 \7 E( l5 S    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. m1 S4 ^; t5 `: L- Q$ i5 F7 m    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  ( G) M5 i: a* }1 L) d( K' x
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; . U/ G9 J/ W. Q8 F( }) i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ k0 d0 H! \; g
3 n0 O3 g# X- C* g& s8 Q    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# {4 i) G: K$ ^9 Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );3 c4 Q* c7 h: v- `* ~6 f+ a
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 1 M% G3 p/ _$ R/ D* J9 ?) Y! u  d
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! Q( v; b. S6 x& c/ ]
1 u! x. n1 X& ^0 ^" Z# u9 q    mcasp->regs->XSTAT = 0x0000ffff;
  r% k! ]8 |. A    mcasp->regs->RSTAT = 0x0000ffff;
' c: m# N! k( Y2 T* L
" x6 S  @0 C; S! m    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;( E$ L" W, k, x$ ~# I. k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 H7 r. y+ E, k5 i. Y& A
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ) R. Z$ U; K' p
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
% u& U) t& d- V8 A. t. h
8 U0 L& M# d: C/ w    /* Write a 0, so that no underrun occurs after releasing the state machine */
5 z' J% G+ K4 d: X- w. L- n& ]    mcasp->regs->XBUF5 = 0;  I' X. _  ?" v, e# v
    mcasp->regs->RBUF0 = 0;
0 P6 ]. p" F) `4 S5 T4 c- Q! }, Z1 A( _6 _& I2 x4 _9 p
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 Y- R0 D6 _2 L7 H    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& K0 L$ L. |6 |2 s* I# w/ z8 N' i    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' P  S* H& c# r6 d4 i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 \7 U1 \( @5 D& I3 `' v) e5 l/ A

. {% ]% G# t7 E8 d    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( ^* x# g; B( w, ~  `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 F% S, a" r  _% j    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
+ q1 h4 |  O' _7 x/ G( Q5 z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );6 l! @& Q; A9 F4 S6 e
8 t1 r6 i$ d9 V+ _9 `% c
    CSR = 0x0000;! x! R$ o( E9 d/ m
    INTC_INTMUX1 = 0x3d;4 p* @7 B5 ^+ T  Y1 c. Q3 i- n
    ISTP = (unsigned int)vectors;
$ _; G1 }" U% ?' q) F  Z    ICR = 0xFFF0;  
* U* l( k8 N" }3 N: d) Y& G0 {    IER |= 0x12;  / v: X5 ~+ v/ Y0 n
    CSR |= 0x01;  , [& K% y; U+ A' e
/ p+ ]  q* k: W- K

: ?" ^- Y7 c% I! z- k3 _9 w' o4 ]
' ~0 t7 J7 ?1 k还有就是两个输入输出函数:
* I; Q# d! z* z3 `* p5 O/ zvoid output_sample(Int32 out_data)
) n& w/ Y: M2 T- n9 v0 ^{
- t/ W, I. ^; v, Y5 E- F  AIC31_data.uint = out_data;  % z+ l! f+ x7 E* l4 y  [- ?
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
. Q$ a1 g) j. F  _. }}
. I0 P+ I" U- x) o
1 q- ]$ }, M0 n! y* v2 y- TInt32 input_sample(void)
$ \0 k' G0 Z" S; K{  
# P" y1 u' u* ?* u/ T1 k2 H% k  AIC31_data.uint = MCASP1_RBUF0_32BIT;
" E; |$ n2 R1 I4 r/ j6 t( L  return (AIC31_data.uint);  n) o! k3 i* @& n+ \
}1 Q9 C5 H/ s0 t
) s0 O6 Y4 V. ~0 p, s3 J, q/ o5 S
分享到:  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-19 23:23 , Processed in 0.038248 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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