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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:, T+ d+ y. D4 g# _9 D% j1 g  q
main文件:
2 o& _$ \, x& T9 N0 f% jinterrupt void interrupt4(void)  ( }6 X# _# U* \, O" v8 b0 I; L# B5 i
{2 M" E; Z' h0 k0 z" A% Q
  Uint32 sample;
) \4 `7 [( `9 _0 t' S: W. q/ ?4 L. C9 j  g9 F8 P" ]" `
  sample = input_sample(); // read L + R samples from ADC
( C# G( O- v* A9 g" t8 j' R' Z3 b, B  output_sample(sample);   // write L + R samples to DAC 5 x" H3 q" f/ q0 u: K9 R4 q7 Z
  return;7 j. t8 l# a1 ?, z4 j" @/ N1 Q
}# G8 p6 X" x5 J& _$ z
+ M# C! u' z7 E* w
int main( void )
; |- y) z/ X- `7 U* z8 Y9 w5 q{
3 C( Q* ]# K5 X) a+ q1 j% u
4 Q6 `. x/ R3 N8 M1 z; s  B& t; ~    /* Initialize BSL */, m% F) ]  I0 D; g' _3 k; j
    EVMC6747_init( );
/ E$ d, C4 j! B) c/ V        /* Call evmc6747_intr function */  |+ [8 V! \" }
    aic3106_init( );, X  i5 {) B; @% c
        while(1);: \9 Y% T" B" Q4 J" I$ ]
}' z$ X5 ?7 G5 t6 O& @

' `6 D+ J8 L( |# X& l3 y! E1 Q  S$ w3 c
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题$ a; s! J9 O; q9 `- I
/* Initialize MCASP1 */
9 R8 A/ d; Y6 b0 B    mcasp = &MCASP_MODULE_1;
( z; g( Y% E/ l$ X6 ?    mcasp->regs->GBLCTL  = 0;       // Reset
8 `5 Y. m! z, J. C3 x, E- Y3 O    mcasp->regs->RGBLCTL = 0;       // Reset RX! t/ b3 V( q3 l' D; u# \# e4 q
    mcasp->regs->XGBLCTL = 0;       // Reset TX; r+ }+ T# \7 b  p5 Q* B
    mcasp->regs->PWRDEMU = 1;       // Free-running' E* r3 e. e* v( r0 m6 s
   // configure McASP0 receive registers& ^3 t5 X, e* C1 B9 e) L
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
5 w2 ^; B9 T7 c* F  R- B9 m    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 ~' Z8 o% Z) b, v$ m) u    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, m5 B$ H& D5 F" @# `% _    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* r8 }& p: X# e
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
& I1 K; S1 V  W7 S$ ]4 ~( Y    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
- g2 n: m" ^: Y' Z' c, P    mcasp->regs->RINTCTL    = 0x00000000; // Not used
; d/ Q8 L1 f% B' s. I0 T' k    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" A- `: A" u1 I" S# b% G5 b3 M
  W: Y% ?9 l( D) \) H/ {% P
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used) b1 Q5 w; F, k- _
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' J. U$ i8 V. M- K6 n0 n/ ]  N
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 Q4 f( |. y0 L, F    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 T1 K2 \5 [- A- i' ?( p    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
) q3 h. t  j  b" x    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1! T. b: |; `- n* s
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
5 o+ d$ c4 \, ?2 r" e. {6 S: P, @' i" s3 s    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ z. v2 d0 y- s

1 [  `3 C( B- k3 L- B    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN% |+ P0 O3 O. \2 P
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
9 b1 i* x8 U; X  z3 p    mcasp->regs->PFUNC      = 0;          // All MCASPs
' A# t+ V  X+ s! f# h    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1  j" I) j4 j' K2 R9 M& ?  \
2 X5 p( {  r- J
    mcasp->regs->DITCTL     = 0x00000000; // Not used
- h7 n$ D% ]* l7 l( I( F5 u    mcasp->regs->DLBCTL     = 0x00000000; // Not used
. z7 E# b; b3 w9 o9 f& h    mcasp->regs->AMUTE      = 0x00000000; // Not used# D; {: j. c! q0 o2 {7 g

% k. e6 C! N* h8 T/* Starting sections of the McASP*/4 p3 l$ N9 s6 \& e5 l
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. r% X0 M" b9 e8 V# r+ ~    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
# e0 s+ A5 X! d0 ]  ^    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. `' B* X/ v% m  H& V+ V: D    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 K* @/ |% m" w/ g5 I
; Q. K2 y9 h% V1 l5 V# M" a
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . z( {+ @, ^# S) |' {8 v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 J5 A7 a8 _; l8 U) D: ~' t    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 e2 w% \! K: e0 [8 V$ m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 D: y4 n, G9 h' g+ a0 c6 O0 G% S. M1 R& x: D
    mcasp->regs->XSTAT = 0x0000ffff; & x/ h3 E2 \, {, i- T. N4 g
    mcasp->regs->RSTAT = 0x0000ffff; 9 j% L$ {* v! I% Y3 ~7 n
' g2 B9 z8 \+ e; W$ x( `
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ G9 R& T3 ^! u" K9 t# e/ h    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );: z& \8 x" r6 K4 K3 b
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) d2 T. u$ G/ h# Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 @: X7 m$ u$ ^( }
# r1 Q9 L. T  L7 s2 P2 s6 N    /* Write a 0, so that no underrun occurs after releasing the state machine */
, x. E" l& `$ }3 z    mcasp->regs->XBUF5 = 0;0 e% Z# l4 U" d% l* x9 a  F5 G
    mcasp->regs->RBUF0 = 0;# y: R3 l: ~0 ^. O4 n

8 K  V% D1 B7 S    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 d. j- w/ d. o* ?+ G  K; T    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );4 d1 c) U) g" F
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # e/ l' Y) `, b9 q8 T# @, o9 ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ [, `+ f+ z  y& \* n- r. ~9 b
- z/ X4 N1 l: f* p# ~    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; Y& X) s6 o3 S. a    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 m2 Q/ B( b" [1 f/ a8 O5 Z, G    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; , B) i, d+ h/ s5 d( y, X* k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );8 [6 a* G( A  Z; v) T8 u

' {) o$ ^: G6 L* y* i, Z    CSR = 0x0000;
0 J' o8 g7 K& w. {# ^. E% [) w    INTC_INTMUX1 = 0x3d;
3 U0 l2 E( h& F    ISTP = (unsigned int)vectors;
1 ^8 ?, z2 k- n! B5 h    ICR = 0xFFF0;  
6 S  M; o% W; E    IER |= 0x12;  9 X5 G. |) G2 w3 x4 @; N+ u; V
    CSR |= 0x01;  
, L6 C$ \% `' w) m& y
1 O' {0 x6 F, P, h
- I" `0 q* s  u9 x! i# O) F$ a+ U! M& S4 d8 T& i* O1 o/ x5 q$ g
还有就是两个输入输出函数:
; ^9 d( z! [$ `: d) ?* L. nvoid output_sample(Int32 out_data)9 n2 U* S3 E* U, N
{( J) y9 R3 p5 ^* f+ f# g0 {/ n
  AIC31_data.uint = out_data;  , h1 l7 P5 d  D0 _
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 T  p$ k# s3 {: n. b! ]4 x  ~/ n}8 ?( T8 }( F9 r# H' ~; q/ v! H5 x
/ O7 j# `7 j) c+ t
Int32 input_sample(void)6 y& m( h% J5 O; Y: a) \5 G
{  : q" E0 H1 H. o) V3 Z; K/ D7 s# r
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 E' x% L# X. ]! h: C3 |# x, W1 ]. O  return (AIC31_data.uint);
/ k* Y! ]1 @% m: W8 Q}
* J. }3 ^/ f* F8 ]4 y7 |1 H# T
分享到:  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-19 10:39 , Processed in 0.038009 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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