C6747利用McASP发送中断方式完成音频输入信号的直接输出 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 n3 V3 [& J) y7 s9 O+ pmain文件:
& O+ U  `1 T% c7 m- D: F7 H2 rinterrupt void interrupt4(void)  
( S2 H5 {, a/ [! A( b% r! m% Y7 q) Q0 H{# B+ R6 o0 Y  Q% `! w6 ]) n3 ~
  Uint32 sample;
0 V: k6 S: h7 i2 B8 T6 Y4 Y. d% w# y) k/ U( _: A) M; K
  sample = input_sample(); // read L + R samples from ADC( q0 c' X0 {* g$ I. c& q( y% A
  output_sample(sample);   // write L + R samples to DAC & t9 J; G1 ~6 X: @) ^$ Y3 G
  return;
# Q/ n$ D. h' G( a' x}
  u, b( z* O& X/ x/ R- _6 H3 s5 U2 X; t& y. o6 w
int main( void )& G; H7 T7 Y& a
{9 E& B4 C7 A( I4 F: p
$ k2 }1 ]7 T+ d1 @
    /* Initialize BSL */
! r* {( Z+ h" l+ Q% \6 Q. D2 g2 J    EVMC6747_init( );
  q4 |1 J; T) H6 K+ V( {& d# O2 F        /* Call evmc6747_intr function */
7 ~8 J  X) E" \# d0 C# [    aic3106_init( );
+ E+ ~1 U: E6 [1 y        while(1);" i( O: C* Q# X& h; ~! S1 {3 P4 }9 k
}5 g8 k( P- o9 K

" A9 F2 B2 w" N
7 @- r0 [( R3 E, V3 ^  d# ?aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' n8 ^% S, \) g5 X& _9 P/* Initialize MCASP1 */
/ H5 z; B( x: Z; t1 e    mcasp = &MCASP_MODULE_1;/ f8 \% P, y1 d) i
    mcasp->regs->GBLCTL  = 0;       // Reset4 t+ N7 d5 d5 f4 j2 T& Q& o8 {
    mcasp->regs->RGBLCTL = 0;       // Reset RX
$ ^; D3 K  [1 @2 Y7 J    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ [8 p$ R8 G9 M) g; B) R% }    mcasp->regs->PWRDEMU = 1;       // Free-running
6 ~. s3 g8 v. k6 C" n) r* |   // configure McASP0 receive registers( {" c8 _& \8 [% Z9 s3 a
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
  ~! b9 ~  a4 t9 K4 j# t+ ^    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( f3 Z9 e  z& M8 u" A
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
5 i8 W, R, N/ N; |% b4 d    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)' ]  ?9 x4 z& M" T: o" y- }
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
9 O& h+ F5 Z; Q0 ?: @    mcasp->regs->RTDM       = 0x00000003; // Slots 0,13 @+ i5 S% |# a% k& c  U
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
) t2 y, K/ m- E0 Q4 x8 C    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 K% a8 W  Q1 s& r* H* \
: k) W! O" |0 {1 i7 w! ^; y    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used. k+ y( Y* @% g7 j" H$ H8 a
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. H0 {3 ]: p2 l0 `2 I    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word: @. j% o8 D) s' D% k" o. X
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-167 S- X" l2 ?- r; y( |
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK" D5 g5 S. V: G! `7 d: F
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1, A0 l8 S) _+ e( Q9 r# V4 Z% J+ j, E
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit" N* Q: t  d8 U5 T" x6 `
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ ^7 D1 x/ p$ T) R+ o5 w" \, y& U/ t; f/ c, r" I2 [/ Q
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
" e' m4 r% K  I/ H; W    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
+ y3 x: V  g# X* U9 H0 Y    mcasp->regs->PFUNC      = 0;          // All MCASPs7 {* s. Y" n8 _3 Y
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. V, X" j9 l7 G2 n
  ?1 l! Q0 }0 U$ c2 `- |9 `  n
    mcasp->regs->DITCTL     = 0x00000000; // Not used  \9 r1 n" w# p
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
4 f! \2 h% ~4 X9 S( j8 H    mcasp->regs->AMUTE      = 0x00000000; // Not used
. n% }  g9 r6 W+ I, Q# _' k& k+ O/ P8 b$ e$ ?% j: v( K
/* Starting sections of the McASP*/
9 k. u( t) c% Y6 d9 n& G# U& y    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 a; y; x% n# k" Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
# P3 F) H- @2 `7 x3 C    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; + W! f; w' f' G. X, J# b1 O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );& i0 u7 y8 \( W, I. a' B7 g
; u) K! q4 G; \
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# o/ V1 q: |5 f5 s. a) T    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! C) W# P, N& X$ |, H( m$ ^( F/ z$ U    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;   I) R1 {/ U1 h, ?
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ y7 y3 W- }( ]( _
/ i  w* B. f; o+ v8 Y$ H
    mcasp->regs->XSTAT = 0x0000ffff;
- c5 s8 b6 `9 I: N    mcasp->regs->RSTAT = 0x0000ffff; * G& S: @+ d7 n/ l9 r3 [& k7 B3 K  a
) p* @+ N; m' q/ B% y% d. d
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 W7 c5 ~3 b, O/ C; D9 _" }    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 ?/ _& D3 D# J; ?! f    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; " Y9 ?) G" j4 z: w/ F, N
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 E" H1 H7 \# X9 ?- Y$ n+ X4 p: }7 i! M
    /* Write a 0, so that no underrun occurs after releasing the state machine */1 T6 @+ w/ l& e* Q  i! S% X
    mcasp->regs->XBUF5 = 0;
* z1 q5 Q! n+ [1 x  Q0 b2 E& [! E    mcasp->regs->RBUF0 = 0;) N1 @0 _8 n% a: E

: L1 B! T2 S$ [3 Q) P    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; # k. h/ s# w8 h# R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( C+ G1 K3 }/ k+ Q1 o
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ! z& Z0 E& y( }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
5 n9 k: F6 \( I5 @  E4 ~* s0 N8 }. B6 `7 Z
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- Z- K! Q  e, B9 o' C3 {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 Y! G7 o2 c6 B8 X2 M/ P    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 o. Y* Z9 ~+ ~2 Z5 p- ]5 W0 [) q  B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 z/ a- h3 T$ F1 A4 b7 N3 G% o% B% o/ @% O
    CSR = 0x0000;
3 b$ G7 `- ^7 e. }    INTC_INTMUX1 = 0x3d;
; C* H# R) C4 v9 Q9 ~    ISTP = (unsigned int)vectors;% r8 j$ _: ?8 x. e
    ICR = 0xFFF0;  ! s+ G1 r6 B0 ~' @9 K3 z
    IER |= 0x12;  
  F3 @9 t- J  m    CSR |= 0x01;  . J4 K$ k8 d% T% }0 h+ O

$ n6 Z" P# Y/ \9 U
6 f/ x2 c. v% L  n: G) ]+ H3 H/ _; ^$ z. s
还有就是两个输入输出函数:( _* q/ ^) @% h; ?. S) U
void output_sample(Int32 out_data)/ `- W+ I% c6 F, f2 u
{
7 U! r* _/ f  d& c+ g9 I& k' U+ x# v  AIC31_data.uint = out_data;  
' _# n9 M  z6 L8 l0 J  MCASP1_XBUF5_32BIT = AIC31_data.uint;$ H, n. G5 F8 D: s: ?$ h. g# a& ?
}
# h2 p* E/ I  m+ e& ]
) K0 m+ D; Z9 t/ c/ y" ^0 f$ S+ vInt32 input_sample(void)
3 H0 \  K- w7 u/ a{  
# k9 Q$ M- d8 V" g: H9 u  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ t. |/ O4 Y6 [# V+ ?
  return (AIC31_data.uint);
% x# q' M3 q! B  Z# g}
) T9 E) I2 K; |# h- K1 K' V1 Y- o! v
: [9 O5 S% `- k/ J$ P4 ?6 y
分享到:  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, 2026-3-11 21:46 , Processed in 0.041487 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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