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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:- a$ \5 M, F6 i' N8 |1 b, C8 O5 w
main文件:0 J* S2 n& ~2 i- j. _" n
interrupt void interrupt4(void)  ' x  F8 U% I7 z
{
) o1 S$ m& T0 `4 I9 J  Uint32 sample;' U. M; _* ~' n# x( ]! H9 N; d/ E

2 a7 W6 D$ i. ?3 y3 J2 V  sample = input_sample(); // read L + R samples from ADC, n- c! u# ]) x
  output_sample(sample);   // write L + R samples to DAC & f$ Z0 u* b0 m7 m
  return;2 l- Y/ `: `1 m2 g/ O1 X
}+ B+ V" z( {( ?7 W2 e

! `( ^4 w0 }. vint main( void )% i* H, D  v0 l2 h- w5 b* b: G5 F
{% E$ x9 f" G' c  ~/ b, X& O3 ^

& e' T; V' ~2 O    /* Initialize BSL */! J8 D" s1 w! [6 y9 D9 x# `
    EVMC6747_init( );1 s, y. v" [) e! F
        /* Call evmc6747_intr function */
6 F+ y% p9 B7 r. e  ~    aic3106_init( );7 |  U# J# O& E# Q" m
        while(1);
1 w$ A4 M' u. a$ [1 A}* N% p4 w; A( x# }

& Y9 V" u0 f$ n6 A8 Q- \, C" h: N
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 U- m' y! Q' v& w4 {. g' b/* Initialize MCASP1 */; o3 Y( E- l. f8 p+ W5 T$ Z, ^4 K. ^
    mcasp = &MCASP_MODULE_1;
& a1 ]5 b% \8 D2 t& f1 o    mcasp->regs->GBLCTL  = 0;       // Reset: b8 G! g2 z, f# m3 c
    mcasp->regs->RGBLCTL = 0;       // Reset RX7 o- j# V+ R. O6 \2 f! T3 ?
    mcasp->regs->XGBLCTL = 0;       // Reset TX
' {; g& B" [/ K4 k% t: w    mcasp->regs->PWRDEMU = 1;       // Free-running
# G; S9 Y( W$ e   // configure McASP0 receive registers
8 t3 a- _( W8 }1 ]0 ^    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
, R! `3 ^6 Q3 Q% g. ~9 \1 M0 ]    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, S# V& w: `4 W3 ?( c    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word7 K1 E" X: v8 k7 J5 q+ r8 I5 V
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)" N; Y. {  V. Z) ]8 m3 N
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
, l8 ?9 Z7 u+ v. a- Q0 o( ^    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1$ q2 d, c. q' u! `6 w
    mcasp->regs->RINTCTL    = 0x00000000; // Not used1 A3 G  X( y* w6 R/ q
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' a8 x. B8 P0 W+ G* y
# P1 m' \1 L6 V0 f8 z    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
' G7 q4 \0 {, ~! ^2 C; E    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ W$ l$ `$ Q. x9 V! p3 M1 c; m
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word, C: T' v% X2 @" U
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16" E# k7 R' Z! x- }
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK# C! H7 d8 d6 ]' }- J+ Y# k, m9 y
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1) s) x: j4 w# G( q: R" g
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 @* U1 I# k; e    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 L  F3 ?: ^$ F. [& R( ]  K3 X4 }2 {" ]8 S
* ^& {* g$ H, i3 W$ w6 U5 q7 @+ l
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN: X& F3 Q1 B/ F1 S* n
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT5 \/ ?0 U( V" H! e: h6 b
    mcasp->regs->PFUNC      = 0;          // All MCASPs
/ j( O, S$ g/ {0 O7 C    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 f* r/ h7 r8 }, I7 u0 o: ~; K3 k6 K3 |
    mcasp->regs->DITCTL     = 0x00000000; // Not used
. W( Y2 O% a* L- ]6 J& Q    mcasp->regs->DLBCTL     = 0x00000000; // Not used
2 P; k: C0 p/ n" h/ ^# `' a- T    mcasp->regs->AMUTE      = 0x00000000; // Not used
4 \& u1 t! T, V& `2 r$ D. {
% D+ k: ~3 G( L" D1 c! t) ?6 i/* Starting sections of the McASP*/, n3 t$ p5 ^" [& H' S6 L; t: E
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; " h' T9 Y$ C/ _$ P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  4 w9 K2 r2 i! D
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 2 ^3 f% P% Y" J$ H
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );0 {4 @9 O0 W% [. r/ k, A

! ]* L4 R( y! {" x4 {5 y    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ! A) h8 _' h5 @1 V& M: Y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 {- z4 B% ]# a& P8 C    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 _  ~0 z* N8 S! O- d; ^    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );1 m4 ?; R+ g  g6 ^& `+ Z& _

# F! r( ^" z, [8 C    mcasp->regs->XSTAT = 0x0000ffff; 3 |. r- z6 H/ o" O
    mcasp->regs->RSTAT = 0x0000ffff; - Q$ ^& ^+ Z+ T; x& o1 b5 }& y

/ ?! i0 B/ \4 z1 j8 N- @" |8 Q+ L    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ q7 t  a4 L' ^- m' k+ ~1 d    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 U. `2 o3 @1 @- K# u$ O
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 w; z" w$ {, j" N/ ]5 U
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );$ Z- Z& I6 H( ]" f2 U. f

. V: e- H3 _6 ~% D% r" r    /* Write a 0, so that no underrun occurs after releasing the state machine */! }& k) s& E, V9 D
    mcasp->regs->XBUF5 = 0;
  h" H( Q& V$ o( U# D    mcasp->regs->RBUF0 = 0;
& W/ x9 b4 f+ n) T" l2 X5 u6 p
5 A! Z, \; N$ O5 z; ^3 G1 V0 X- O    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 3 C# Y9 G: w4 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );) j8 Y. r. T+ l( D+ I% X
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 j3 R% S- ^2 |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! p+ @* m9 j7 Y
' c( w( I% R. [2 o    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 7 g6 N/ N" b8 _0 X
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 q1 U8 s* r+ G/ q) g% m3 z: M    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 4 Y9 x: D( d( X* p# o9 b
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
& g0 r, G: B/ W$ @" W) I. |- s3 F3 z: R, F3 O! z9 E
    CSR = 0x0000;
% o" \" D: r5 e5 B3 Y5 Q    INTC_INTMUX1 = 0x3d;: |6 ^9 L/ X. ^+ u
    ISTP = (unsigned int)vectors;  |2 D5 G9 H. i% Q& T+ Y
    ICR = 0xFFF0;  
9 t7 I2 |# L8 E8 L3 t; m9 J) K    IER |= 0x12;  
; g& c- n$ Y$ ^7 g+ K    CSR |= 0x01;  3 k2 \8 A6 u0 b! g$ x- O! V: E

. x6 j/ F: O4 z+ r; {9 K0 Y4 G2 e- z# M5 R3 f$ U' ]9 V2 k

- V' c5 y( q) E& S& j还有就是两个输入输出函数:
- S5 U  o/ _7 g! j2 Wvoid output_sample(Int32 out_data)( \  u2 v) J) E  `  ~9 f4 W9 U& U
{
7 l  K. Q% O& u0 s  AIC31_data.uint = out_data;  
& \5 N/ E" A$ U0 m1 I; _) I; b  MCASP1_XBUF5_32BIT = AIC31_data.uint;6 C6 D, O; d; n0 y
}$ X3 B1 t4 f- E; b( a

8 R0 j4 U$ f" pInt32 input_sample(void)
6 ?+ v* R6 z; Q" Z' `3 e) k. L# q{    H- K. v: Z* x  B! F+ i
  AIC31_data.uint = MCASP1_RBUF0_32BIT;! w! i3 R0 }; ]6 ^9 M
  return (AIC31_data.uint);  |/ T, k& |: w5 t2 a
}' Y& S/ Y& Z2 ~: v+ f/ y: b
' U! K+ l  v1 J7 X- ?. l6 z
分享到:  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-7 20:29 , Processed in 0.037758 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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