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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:: ?5 K' R' R3 J, F; e
main文件:
- T5 d( Z, C: `% B9 Tinterrupt void interrupt4(void)  
& ?2 X4 t; d- N. b) V( T! d{
. M5 Q; I; j# _! h3 H  Uint32 sample;
. U( r5 S* v0 G  C9 o# Z; W* ^, p; Z; O8 k2 }6 e- d: r
  sample = input_sample(); // read L + R samples from ADC2 T7 d7 t5 x, T  D: G  `2 j
  output_sample(sample);   // write L + R samples to DAC 8 l/ N, U; F1 w7 R) z2 R
  return;3 V& v. G0 b* ?
}5 e$ P& W  Y9 U3 @# y

7 k0 T# L2 Q+ C. X6 vint main( void )& r' A" x# X" ]3 I
{
. l  x4 d5 `. y5 X" t% D/ F
3 N0 \: l" o/ g2 ?    /* Initialize BSL */1 y6 M  u+ D- k. h. ^7 U
    EVMC6747_init( );
. u/ f- p( `6 v. }  e        /* Call evmc6747_intr function */2 k2 A0 D2 y+ r# {) R  ]3 E4 m# c
    aic3106_init( );
% ]: r& v9 `, a, \  P8 O        while(1);
* |! X# T# v/ y- ^* |8 }& N* b) A}: R& V! ~& M! w4 h0 g" p$ ~! n
  i4 q8 }8 v6 y4 c0 Q

+ ^6 B8 \, S% @# kaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题* u4 p1 O) G0 {) ?9 z
/* Initialize MCASP1 */
( _) Y, ~3 V" P4 q: S" M    mcasp = &MCASP_MODULE_1;
6 m- V# l! p9 l5 O    mcasp->regs->GBLCTL  = 0;       // Reset5 f) C) ]& ]7 `
    mcasp->regs->RGBLCTL = 0;       // Reset RX
$ i, \- T8 j8 K" S5 G7 m; _    mcasp->regs->XGBLCTL = 0;       // Reset TX# E( P6 I+ {& ~) f; r
    mcasp->regs->PWRDEMU = 1;       // Free-running
/ O- A/ {. q* B   // configure McASP0 receive registers- k0 r% p9 V; ^& c: N8 G2 W, e3 R
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
  ^: h! N- ?( @; F% G    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. F! c5 F# B% f+ ^2 ~4 ^2 A6 B! ]    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word, ?( e2 {2 P. T3 T( h
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)' B( u- ]; S( j8 z
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)9 u  \( W& R0 I" t4 f
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1/ z. `2 i8 U6 ]5 ~- }. k$ ?5 Z
    mcasp->regs->RINTCTL    = 0x00000000; // Not used" b3 a9 o1 z6 f2 \! P& B6 }; H
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 D7 T* b% b5 r) ?6 i- `' o* _4 a; Q, X, J. V" o. b& O! x
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
0 w5 ?+ u6 Y6 J, x# x6 ?    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 X, M5 A8 X* b4 F" S8 J- O: ?; E
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& p  J8 P  ]. N2 Y    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16/ L- o9 b+ b, }6 g' k7 O! I1 @
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK7 S% g( o% I- x, X6 @3 X% E* B
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,16 m; h8 O$ U# k( M$ j: F! g
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
) }( \; L; @5 X! M: \    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
  A# z/ y# O8 b& f8 ~3 H( u7 U) ^- R% n
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
( u" A- [1 I5 K/ O, Q$ H    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT% J+ S7 G/ c2 w5 V
    mcasp->regs->PFUNC      = 0;          // All MCASPs7 ^2 Y& M1 q0 |  a7 T
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 v7 w' `, n4 _% O8 R8 s3 }0 z7 G  E0 N& A
    mcasp->regs->DITCTL     = 0x00000000; // Not used
" v! J( T8 S! |    mcasp->regs->DLBCTL     = 0x00000000; // Not used; |5 F# J2 D1 A% B& b
    mcasp->regs->AMUTE      = 0x00000000; // Not used+ U/ h. [! ~& ?$ v& R7 s& {9 f5 n
: [3 n" X1 p9 C# [5 ]* Q
/* Starting sections of the McASP*/
& `, w( j/ v! b# I8 X    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 }. M! w# Z- [; k, ?4 z$ f    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
% L$ c7 C( O" l; `# ]6 P. I$ T    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
" _( k6 W  e# J8 c    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );  z; N$ A9 v) a4 u1 f
% ~4 p2 A$ [$ j( |. j
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ( I. W' S$ k* [
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
) E; {+ x# y& R$ U& h9 ]( I$ B4 \" s    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) t1 c9 j" g& e    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 Q6 S* f5 a/ V# G( P# H, k
% z& P% |- \  n6 m    mcasp->regs->XSTAT = 0x0000ffff; 7 X" ^- s/ y" _# z: l: w6 {
    mcasp->regs->RSTAT = 0x0000ffff;
" f) s' B* n& c) v: Y7 E$ E  e7 b) a1 |1 {& K  X" D# \
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 q; l+ t  r8 i: J, @! r    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" n: ~% `: D# S# F, i    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 X5 W8 E- N8 v8 {1 r9 l4 x    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 F$ g5 p0 F9 ^7 P' B. o& m4 t
2 |% R* Y( D+ d0 C
    /* Write a 0, so that no underrun occurs after releasing the state machine */5 ~* E0 S# |4 N9 R8 V
    mcasp->regs->XBUF5 = 0;
" e, v: L, I- \: k& x    mcasp->regs->RBUF0 = 0;# ]  k6 m0 s% o4 ?0 i7 i- u( L  T1 g
/ X2 @* Z& F0 b; Y% @% L( B+ o
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
* [) K  Y# O0 @! e5 {: @# f5 k    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 \2 K6 _' X" i0 R0 S6 h; R
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 i0 t' A- g1 i$ k* Q2 g7 o/ A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ O* B4 |: u! o4 |0 @6 j9 a+ X$ q
# i7 C* d( s. R) |- A, t- G# r    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , Y) t) u8 k0 q. L6 O& N% B/ e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 U3 M  d- X' I7 z% s7 a& J    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; . c" o: R4 |& G, k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
& R$ i& Q2 r* ~3 C% D- Y- Y. e. J9 X; j2 S3 g, M) m
    CSR = 0x0000;
0 q  L5 L8 W/ v) r    INTC_INTMUX1 = 0x3d;1 G6 i/ X, W* d8 z( c
    ISTP = (unsigned int)vectors;
1 G9 e, {/ k( w( V) o    ICR = 0xFFF0;  
+ `! w6 K0 L3 a& x7 I  c    IER |= 0x12;  7 g8 ?2 T# [  f$ v8 v: j
    CSR |= 0x01;  ! B) z$ p- a; h

+ K; m* Q1 X6 p7 _( p
! w6 g% Y, |# X9 e& J* _7 K
* L" e) `( H( Q6 }/ u+ Y( i6 d9 C, y还有就是两个输入输出函数:" H9 t) H, I8 D0 M) _. {  h* D
void output_sample(Int32 out_data)  t8 t+ f: }  K: X8 _
{
* e  Y+ c2 V4 @) y5 P5 r/ b' F  AIC31_data.uint = out_data;  
: k6 k1 ]: T1 _( @. \  MCASP1_XBUF5_32BIT = AIC31_data.uint;0 C* w& v) v6 C
}
- A& z( w9 C0 W0 `
: R5 x4 g9 z, V1 SInt32 input_sample(void)+ \+ ^/ S1 C/ D1 n
{  
9 T8 C$ O. v4 R1 z: _  AIC31_data.uint = MCASP1_RBUF0_32BIT;
. h+ J, j* O% e  return (AIC31_data.uint);3 J- u4 O8 N4 r. j; ~* ~. u
}- \/ ^& @' R# Z' W+ f4 Z
8 D5 o/ g( m& n) b; y2 g7 w- X
分享到:  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 23:03 , Processed in 0.043396 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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