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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:  o8 t* @: R% N8 e* F) z; b
main文件:. x+ I1 L; r: }; k& x4 q
interrupt void interrupt4(void)  7 Y5 W* ?" {; y: m/ q) k
{. L% P7 I7 \- l7 N7 b
  Uint32 sample;
2 t1 Z6 ]) q. ]; L$ Z
) K2 B0 G1 u. ~) W  sample = input_sample(); // read L + R samples from ADC
9 m+ K6 G8 j$ H& M  output_sample(sample);   // write L + R samples to DAC 9 W4 B- d9 i- U: ~4 a* j. R9 ~
  return;
+ F( d$ P" ^! W, D: H& W- k}
9 C0 M% W8 B- _/ e8 p: X6 }. i
9 O* u) A9 e- p# l9 h5 Yint main( void )4 v  Y' G$ k) l! s: K3 I
{( d1 [" ^7 d7 N, s

% _8 N! E' I+ Q/ X    /* Initialize BSL */$ k  O7 X: Y) s( y
    EVMC6747_init( );
0 i9 ~1 |; B2 r+ q8 D. ~1 [        /* Call evmc6747_intr function */
( k* a/ H8 K7 @- G7 M* t6 r6 l    aic3106_init( );6 @) _" R3 [8 a1 D  {  l' N7 i% d
        while(1);, x3 p5 b$ \7 x" {
}
' a( w- n- p4 @; I6 g; J( `* @' B& }3 a7 j6 K6 P+ ~
' A" c4 f; Y3 T  B- N2 o
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
3 B& m; T8 ]4 E/ c" F/* Initialize MCASP1 */
" k& L  u) g  L+ |2 ^( ^1 p7 N5 R4 o    mcasp = &MCASP_MODULE_1;6 B4 u# G3 ~5 J. G* s) s
    mcasp->regs->GBLCTL  = 0;       // Reset
" h3 V6 k( _0 I, X    mcasp->regs->RGBLCTL = 0;       // Reset RX  I; ^  K, H# v4 {9 P* i8 ^; o
    mcasp->regs->XGBLCTL = 0;       // Reset TX
" s( b( M) ~7 ]" }* i. \( p8 v6 C/ C9 r    mcasp->regs->PWRDEMU = 1;       // Free-running
! }- o5 v. d1 t4 L   // configure McASP0 receive registers  M7 \9 E; {) V7 M  z
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
  m; B  ?2 f* o6 b3 |. K    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; T$ W- K, t$ i8 Q/ X0 S    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word* G4 X0 r; \( U3 ]2 `
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
% g4 k: Q1 X5 ~  Y2 A4 P) o) Q    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)8 y5 L9 x! h! q4 m' w5 t
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
6 B3 s3 x5 M1 ~8 G* R! O9 a    mcasp->regs->RINTCTL    = 0x00000000; // Not used# T' Y8 Y$ C3 g: j4 s; Q8 E/ A
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# E4 U; g3 V% n3 o2 U& `$ E) n; ]
' o$ q$ O( y% G0 h* Y  F    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used' j1 n; \9 h+ D& M
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: N) C3 s0 t5 I% `- Q    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
  Q& ~3 n! j3 ^3 V  h    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; v% f) [' e2 l$ F7 N) P% H    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK8 u* H& K2 e" t! \$ @7 x" ^* p
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1; O: k2 n3 H' X
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit$ Y" C, U$ ?3 x# M& Y
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* R7 E! s* y8 o- W. o# z; S1 o8 U
( f+ V5 Z4 ^9 Y3 Q
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
4 l) b' u( N, \$ u8 p) h5 Z; h    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT, z4 H& I, V/ c$ @$ w' F
    mcasp->regs->PFUNC      = 0;          // All MCASPs
3 L7 x1 Z* r% x! B$ c9 s    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 x; w1 a9 v5 U9 q$ t% n" q( [' j5 D" J6 r/ W
    mcasp->regs->DITCTL     = 0x00000000; // Not used2 U9 o; _9 D  u. I% }
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
& h# e4 I! U/ _/ q* d    mcasp->regs->AMUTE      = 0x00000000; // Not used) q, M/ j$ t8 r8 b- `
: i4 z- i! x) B# y  V+ K
/* Starting sections of the McASP*/- z( w4 l& W) N4 Y% {
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# @4 `5 x) ?. R6 F    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
) ^5 r9 ^3 v0 }0 s2 I' H9 S    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 L, Z5 |+ }7 G. U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 E& }# }7 r" U" z
" X! w% j5 H# A6 E& y& Q# l
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ) i5 t* S" Y! O( f. a  h& g) P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% v* Z# y0 g" H9 B. n5 \    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 ?6 r! x5 j  P. e( F$ t* |
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );* [. P; D' w5 g* E7 R% S
' ]. U- p/ k: ]9 S
    mcasp->regs->XSTAT = 0x0000ffff; 0 G- Z/ l! c+ ^0 o
    mcasp->regs->RSTAT = 0x0000ffff;
; X$ W+ ?9 g. ^# G8 g5 Y* |; U8 y% ~7 a4 l* l1 \4 r
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 H+ N+ \6 l: l2 ^: Q7 M    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );+ o1 |; c2 [2 W' ?- j% t& J0 s
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* Y% S& b/ G+ y5 f% U; w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- v( m0 p  ^. w
  b# t7 F8 T7 ~- e1 p0 S+ v    /* Write a 0, so that no underrun occurs after releasing the state machine */
* `) W- S( a" G1 |3 l    mcasp->regs->XBUF5 = 0;
+ A: c- Y2 D! |  c+ Y4 K: Q* y    mcasp->regs->RBUF0 = 0;& O' E) c( d" E/ a

& z5 o8 x- t4 g8 @+ _5 x* R: A! U* O    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 ^' [) d% [' `7 k0 L( l( v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ w& M8 l. J1 j6 i1 V+ @
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
" {& @4 _2 ^; s- G    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# [: E$ y& _6 y$ u$ ^
# e1 Y6 D; S* V# I+ W
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 I( t/ e* [' _& T. j6 T    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 g3 P# {% N* B' _' [- j8 F6 B  ?    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 4 n7 a; A" P5 F3 k: [5 f( I$ N" s5 }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: {2 K1 u& I% O& s1 e4 ]8 B2 o1 l# D& D/ v
    CSR = 0x0000;! B4 t+ a/ [4 W9 O0 y
    INTC_INTMUX1 = 0x3d;) _+ C9 I: l; w. b- v0 t* T
    ISTP = (unsigned int)vectors;! N& M$ {" \* J
    ICR = 0xFFF0;  
1 H; Q) x6 V! H! b9 t2 \2 ?  K; W8 _    IER |= 0x12;  ! T8 ~' W7 z" l. W/ a. S
    CSR |= 0x01;  ' s5 ?/ K& x+ c5 b' o8 k5 E9 E; G7 Y
  j! E0 D6 I  g' ?) [  l

/ o' }* Q$ N' B0 y/ H; E9 ~: r( e. b1 V; E% A" q
还有就是两个输入输出函数:
' i$ o0 K0 ^( P" Ivoid output_sample(Int32 out_data)9 j  M4 I; T4 I, I  I) A; o9 z
{
1 ^0 {' f! s. x$ H# W0 R( ]  AIC31_data.uint = out_data;  
: r6 g. E7 Q# W* a9 Z# |$ m1 [2 E( {  MCASP1_XBUF5_32BIT = AIC31_data.uint;3 E4 {) R0 O4 o) w9 r/ n: @! X& L2 M
}, X' g0 B( k  A% z# |
6 |8 q: F9 ~6 ?. o% v/ a) ^% @# w
Int32 input_sample(void)
  ?; Q' V/ e  w7 s# S; p{    U7 {% [6 G2 E. M' ]
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ G; E/ v: o# ^2 m3 U9 {9 W0 j  return (AIC31_data.uint);
( Q2 E$ P# [) S) {}/ v% S, Q6 D1 W) N$ j9 y
3 g; J4 e$ J5 V: r" @
分享到:  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-1-22 21:24 , Processed in 0.041865 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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