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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 _" ]( M4 y: X2 q; h4 k3 W5 cmain文件:% z4 b' y8 a; a! B+ Q' v+ S
interrupt void interrupt4(void)  3 y: |% @8 @/ F+ U* @
{
% D) Q& P  ?* b+ d1 _  Uint32 sample;7 w" u# A5 G# ^& i6 q" U1 p- ]
* Z4 {: U. @1 f& g' D+ J4 k
  sample = input_sample(); // read L + R samples from ADC
8 @( A; l% g6 o2 h, \  output_sample(sample);   // write L + R samples to DAC + e& i0 r7 [7 ~/ h" t8 N
  return;
# ]1 b8 ~1 ?3 R8 Q" J}
  g& [3 Z' s! x" p9 x+ z4 u% S& O6 y0 Z) b' j! i) t+ U7 R
int main( void )
, p: b- A$ e+ z% b{; E7 _* l  j- q) @6 i" u
! l7 b8 `4 k; D) R6 B
    /* Initialize BSL */
7 L. {2 _' X" o1 p    EVMC6747_init( );; s) _, c/ _# q. V# f
        /* Call evmc6747_intr function */
' |8 x; x$ w( _+ Y  i/ [. o; W    aic3106_init( );
' e3 i  M9 _/ F% n6 L+ d5 R7 e        while(1);
1 H6 p! \7 G+ g9 O}
, S$ Q- a1 L- P8 f" \" x0 }! \. ^. c8 O0 b" P5 @1 T% O1 p

6 R: \: g+ H  b$ w- f  v/ w. q/ K/ Iaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ f* x. a/ S- d, N/ K7 B/* Initialize MCASP1 */+ j  e8 ?; S0 D) `4 q" w
    mcasp = &MCASP_MODULE_1;# T( f3 G6 f' x) H
    mcasp->regs->GBLCTL  = 0;       // Reset7 ]( B. ?9 c; v& L
    mcasp->regs->RGBLCTL = 0;       // Reset RX9 `3 q, V, O% ~& ^  R
    mcasp->regs->XGBLCTL = 0;       // Reset TX
  S- t9 |; K* b2 m    mcasp->regs->PWRDEMU = 1;       // Free-running1 v* `* i  p- \5 Y& o- B
   // configure McASP0 receive registers7 H. |* T: R# G* Z
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
; k" |# _  O* j) X    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 _6 g3 i* l$ p1 E2 z- }/ `    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word* D2 K2 V2 C" k/ g+ o+ ?
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 ^0 a! h: _0 B1 D0 m8 w5 K
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
* [2 S& K8 A+ m# S  e3 }& q    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1& K  a" X" x5 Y1 ?; \7 ~3 G0 B
    mcasp->regs->RINTCTL    = 0x00000000; // Not used7 u+ W# z& ?2 B. j) Q/ x
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% _( P$ Q' A; b7 K+ t' b  H3 E

0 T' D; H& n6 m; V8 x3 i    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
' @1 L8 h! W% G8 m3 G2 {  w# u    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 e- Q/ Q' ^- B3 m; l    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* Z. p5 k9 m( j8 x+ a8 q# l, r
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 T5 l4 K( P+ k' x    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK4 Y7 r0 z. }. W: Y2 s6 _2 I1 `
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,14 T# [* X' T0 s' O# h
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
7 y% ?9 e! E1 t    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 h) U" {* l! a

, p! x$ ^, u$ x( [4 ~0 r6 d. V% u    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
9 T) j7 Y: J& C2 g9 U, ?; {- B. j    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
; [$ q+ v3 U4 A    mcasp->regs->PFUNC      = 0;          // All MCASPs
' M3 v* O- c  y- R8 s  n: M1 u    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: D, i  m8 y5 b9 _
5 p3 g; p- P. J) S% \" p$ s% s; W0 d
    mcasp->regs->DITCTL     = 0x00000000; // Not used
1 r! b* v% f* j  l    mcasp->regs->DLBCTL     = 0x00000000; // Not used8 _- B2 s# y4 r" o' q& I. \
    mcasp->regs->AMUTE      = 0x00000000; // Not used
& O( R  C& f7 N+ G1 Z
. K. U) B. d2 M* T5 ~7 |2 ^( P! T/* Starting sections of the McASP*/) p0 s* J( Z& O9 }; W
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ! v7 k' o' Z( H1 p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  ; {. ^) }' u6 E& F6 s4 y
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% C! ?" |9 Z% m+ }8 b, M    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 m; }, i# i% O8 J, N0 H" W2 {3 j, ]* f- d) w3 J. _
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; & [! W$ I( t' q2 C
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 E+ e1 ^; V6 g" z# X    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; $ ?4 G% P: f) V6 t) U' ]; |- z- X
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ P' O+ N2 y! M6 @5 E! c

$ w  m+ T/ R0 E  |& v. ?. x! X3 N    mcasp->regs->XSTAT = 0x0000ffff;
- A+ P; x/ o+ M4 `4 v    mcasp->regs->RSTAT = 0x0000ffff; 1 z, U/ N, U' P+ L4 {3 ~& i

: t- |8 k2 B& L9 J2 u& q0 C    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ R9 a) g* M4 J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
- d9 \4 n1 |& H2 V    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, s! T3 c) g* K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
' Y8 R. _0 A$ M/ w$ ?) b5 a9 `9 h" v
    /* Write a 0, so that no underrun occurs after releasing the state machine */
- D4 e+ t% r" K1 E$ r0 l    mcasp->regs->XBUF5 = 0;" x" f4 _8 g5 [- P2 E
    mcasp->regs->RBUF0 = 0;
- O, S0 w' ]# d4 @, X3 _/ ^" q* P' p7 |. }5 e8 I' ]4 ~
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 T# d8 E% X- x+ D2 Y, s+ z. q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 P- k: I" l% U* W: r  I    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 K/ K4 R  Z- \' h& ]6 r    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: _" u5 ^, |9 E
- j! |7 o. _8 A. T  ?    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' k. G, H* s0 I# a    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% v. P# U& r' y8 z& s5 F- Z5 G$ r    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 m9 v9 a, x* r3 i( h6 P+ [    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );" L; s: Z) ^: {5 H" d! w' R

( v& }  p7 Z: F    CSR = 0x0000;0 C# h  @/ B1 P3 S! p$ c
    INTC_INTMUX1 = 0x3d;! D  l: Z( M9 E2 }# E% D" p
    ISTP = (unsigned int)vectors;
8 P. v# P6 u; `) R! Z    ICR = 0xFFF0;  
3 Z# v) g: j) I6 \& }    IER |= 0x12;    K* U6 G( Z8 P/ ^/ f! i) w/ i, J
    CSR |= 0x01;  
; T% Z( A( }4 k$ M: \4 `4 U8 z; X! G1 h& g, y& u, W
# {$ L  k* P. A9 X+ i. v3 G3 h0 K
: U6 M. N$ V, e5 V& @1 l
还有就是两个输入输出函数:
; ?, B: a/ K. H3 O* \. W' e) Z$ Avoid output_sample(Int32 out_data)$ O$ y& g+ t3 Q9 b6 O, J
{0 j5 n8 `- y/ l. h1 _0 t. i) D
  AIC31_data.uint = out_data;  " q8 L+ I% {! y" W6 ^2 v) k: m. ^
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
( y. K/ U4 G; m5 Y+ P* e# h8 d}
' Q; z" l% m, h0 {, J
+ W$ h" l% Y; Q# s& uInt32 input_sample(void)% U0 ?9 p1 q# G! b
{  5 I4 a. _* P# V* P" ~
  AIC31_data.uint = MCASP1_RBUF0_32BIT;# _% G/ s- t0 `/ U4 c
  return (AIC31_data.uint);. `7 P. o  _3 J
}8 N% X% g% O! C! d0 f6 V* y  s

7 e. v9 R* _& r" n
分享到:  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-2 20:34 , Processed in 0.037807 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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