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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
' u. h+ V4 {; }& b5 Bmain文件:* J" {5 u/ `$ s# e
interrupt void interrupt4(void)  
. S5 s+ E) F9 |1 O9 f, Y) b% m# \3 ~{
! _- m: m' U  ]+ f  U  Uint32 sample;/ A# M' \8 ]$ q8 ]- e+ }8 ^8 D
- P) f) s# N. }1 x* J
  sample = input_sample(); // read L + R samples from ADC" A; s8 d' P* E' L3 c, |
  output_sample(sample);   // write L + R samples to DAC $ Q! V' h- E- H7 T- L3 o
  return;
: l( D2 q. w7 E2 U- x0 }}, T2 t  S0 p; x( l7 a5 E! Y

1 c1 a( H1 P9 p: R; M- P+ zint main( void )
0 Q- ?  U% D/ K9 v" v{7 u1 `, d2 b& e0 r

1 \5 }. Y% b/ @6 |  G& P0 y! z7 v7 F    /* Initialize BSL */$ F! {; W8 E4 z. g
    EVMC6747_init( );$ p7 B, }! n: J5 o) Y
        /* Call evmc6747_intr function */
* H$ N, t7 h2 g: w    aic3106_init( );
( b: v1 M! m$ N$ D  H! `8 ^        while(1);
, K+ d& z$ m7 m3 a2 R1 \2 c}
/ H' P% h! _" [3 y' s4 Q/ h# y
  {5 N6 ?/ Q& X/ ~4 \( ]* Z5 ?0 J& t- B5 \  z" @
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 W; K# P/ `6 L5 n2 Z. T. y/* Initialize MCASP1 */
7 H# H/ W) z; u) ]0 n' I8 O% f    mcasp = &MCASP_MODULE_1;* P, c/ [+ b& @% {5 E
    mcasp->regs->GBLCTL  = 0;       // Reset
# L0 ]. D. }  W7 N: ]    mcasp->regs->RGBLCTL = 0;       // Reset RX
; @% v3 s" v* @( j  h- h    mcasp->regs->XGBLCTL = 0;       // Reset TX6 V% F& _9 ?4 w. j$ P
    mcasp->regs->PWRDEMU = 1;       // Free-running& y6 O9 I9 l: G: h! S
   // configure McASP0 receive registers6 y+ \' g6 y& O; @
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
5 w" c9 q+ E, W- u# Y# E( L" D    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 b& d& a& q6 t5 p9 b
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: |" u5 _7 ~2 I6 c* m! ?: T/ Q! ~    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 o- F/ k, o' a/ y4 B1 r
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side), a9 ?* K& d, ?7 `
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
" E$ ?  E8 [% p4 o& |    mcasp->regs->RINTCTL    = 0x00000000; // Not used* r6 e! n  M; m7 J( G! ~! _: H
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 F- G' b7 K3 H: ~6 f0 L( W( R

7 f4 P0 Z4 n7 n. N    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
  t6 J. C) m$ q- B% P    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# f- x  h4 k* ?( V
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 |5 L& h; H: z, s4 z+ Q    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 ?' |0 b& Q& `8 m8 `3 `
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK# v# F- b: a! G, h
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,13 K' m: f( Z8 F% m: H' G' O8 [' {
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
) M. j" y' k+ O; n    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 `2 K" h- F# I, ^+ O2 e# i3 g* R2 [& @, t7 ~) U9 Q6 E
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
3 A. `% b3 [2 O: y! a  z+ B1 D/ O    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
' J- e+ W4 @- T    mcasp->regs->PFUNC      = 0;          // All MCASPs
" e! E  r) c! G: o- I1 Y0 t" i3 b    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX13 O6 ?- m  S/ S* A% o9 N0 N

6 _2 s9 S) h$ ~. S    mcasp->regs->DITCTL     = 0x00000000; // Not used
9 _$ @! X# E! B, A3 B. y1 _    mcasp->regs->DLBCTL     = 0x00000000; // Not used
5 h( H' O) w* B) P0 v9 b( W    mcasp->regs->AMUTE      = 0x00000000; // Not used
0 j$ o8 W2 Y4 q
- R! H2 D- h2 m* k) V+ K/* Starting sections of the McASP*/0 m& i+ ]9 i0 L5 a, `& |
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 2 j. ]* j" a9 O+ S: P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  # B, H9 F' I) \" o( ^6 F& I
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* H! S/ e+ a6 z  p4 E1 W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );' T" B# u% c3 W

, T0 o8 j& `, V9 z    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 4 J# u0 E6 \% {" s1 {. d7 K9 i- i% i
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
  q  R" |' a: j" H: k    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ' {7 D9 J6 A. [% a  U! X
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
2 S; Q# f# u' c0 O5 L  \7 u$ }7 I. a* x! j% ?2 O* p! {
    mcasp->regs->XSTAT = 0x0000ffff;
; i: X! y3 S# j! D2 B+ Q7 Q) }    mcasp->regs->RSTAT = 0x0000ffff;
. a% n  i7 v- a/ B+ y
: K7 \1 B, j, f. f    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
: ]0 b& @( y5 V# m$ C2 R/ `% G3 |    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 B" G7 Z( w9 E/ g/ c6 j% w6 ^  G    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 X/ X' d& ^. X9 |' }4 U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
. b1 H4 R0 c8 s0 h9 p% S, F, I( E6 b) }7 u5 T: u2 m6 D
    /* Write a 0, so that no underrun occurs after releasing the state machine */4 q3 i( Y; G4 @* ]( ^% T; u+ s3 l
    mcasp->regs->XBUF5 = 0;( j, W1 k# k& `0 K( R6 ^: ^7 Z
    mcasp->regs->RBUF0 = 0;
2 n. T! {! A% y, a7 |0 A6 W1 I/ a" w
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- ?% G) W1 I! \/ X7 [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );* I  p4 x- R: `% A* w/ B
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ B7 }# H3 K9 y- u/ X    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 d( ]' g% U4 E. b
7 Q$ d% y! S8 y- G; Y
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 |+ k: T$ B9 ^" m/ g0 Z$ q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );$ I8 u' d' _9 z+ X# G
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; / n, ?3 {+ b* N+ i6 r  m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
8 V! F- {5 `/ I3 f' |! v
' i. ]# ~: A# A% ^$ g6 y    CSR = 0x0000;
, j* ~, J2 F  c$ J- W" J    INTC_INTMUX1 = 0x3d;6 D" I; l& i9 \4 x/ j
    ISTP = (unsigned int)vectors;# ], Y. v% V* V1 [4 l, j+ I
    ICR = 0xFFF0;  : S4 f% V+ l+ \; z
    IER |= 0x12;  $ X0 M8 m# ~4 r5 l! J. r0 @) x$ C( }
    CSR |= 0x01;  
8 @) n( H+ d. C' a& e- N; _* b) Z& s2 c! Y- T/ o& h1 K0 X
8 m6 X$ Y# @7 D; ]! D1 T
; v* \4 L9 E* w5 N5 a
还有就是两个输入输出函数:7 N2 ^' A  Z" h" x, s
void output_sample(Int32 out_data)9 @+ i2 m8 @' g2 ?9 i  U) q
{
  l5 t- a# _- P( N1 X) n& J/ Y  AIC31_data.uint = out_data;  7 E9 p0 W/ r7 r) a
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
& Q" a. D0 l5 a# }9 @( \}
- h3 k+ r5 `) k$ C2 Y( V9 _6 c$ J$ K+ f* H! c# d: n3 [$ u6 L
Int32 input_sample(void)+ C, N% F1 r# i* R/ o! R; X0 M
{  
6 e% E2 R5 S/ g- {) _  AIC31_data.uint = MCASP1_RBUF0_32BIT;7 c. f$ F6 y& K# G6 C
  return (AIC31_data.uint);2 M! H0 A+ Y9 v! F" T
}6 E1 E6 M; [& a/ y" D) n1 c: O
' t5 O7 i! z+ G( L6 b3 c
分享到:  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-10-18 16:57 , Processed in 0.038512 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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