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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
/ M! m! e0 x7 b% E7 k- ]main文件:
7 l. e8 p% r0 J' b& b4 U2 V5 Pinterrupt void interrupt4(void)  
/ G1 T- a7 P3 X6 V$ c, Z{- ]' G0 S, o3 [; @
  Uint32 sample;
6 ?' o# U& z5 s& }6 v! S: I0 x" t2 J
8 W2 I% ]" r0 `( V, s9 L# b  sample = input_sample(); // read L + R samples from ADC
" z/ C# j0 m0 h4 J# x& `  output_sample(sample);   // write L + R samples to DAC % n% i5 g: {0 R) G
  return;
' `* P: z# F/ b# {, s. A}* H1 o( C7 f7 V: ^& |
" }1 s, i3 P. D/ E; O: P( q
int main( void )3 ^. \% f  n2 R% k5 @
{. b! K# A( L- `  R  ^7 E& P7 R& m! S

& j: n* x- q* @8 z+ H: k    /* Initialize BSL */1 z( m9 o5 G+ H' [) z
    EVMC6747_init( );
) A8 \0 O9 n' [" J/ k* ^+ b        /* Call evmc6747_intr function */
, w; ^! w/ W& E. o: Y+ X    aic3106_init( );
7 d% v# q9 p+ T; l9 Y- E        while(1);# N$ `3 X% n! B# o! W6 S
}
: I4 ^% a. P4 M, v# m  H( {( s# i' s6 Z  P/ P( v3 q: g
6 G- R" q7 q1 \7 D: t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* g7 D- J# I/ }3 A+ W/* Initialize MCASP1 */
. F9 l3 S9 t! t* j4 S3 P& V    mcasp = &MCASP_MODULE_1;, ?! K- r8 i  I# ~. j7 l: L* ]
    mcasp->regs->GBLCTL  = 0;       // Reset" M, U, }' k) x7 I5 n# j. x( t
    mcasp->regs->RGBLCTL = 0;       // Reset RX
/ o7 Y' W* D! H9 L, T    mcasp->regs->XGBLCTL = 0;       // Reset TX, n5 z- V/ J2 c! x7 ~/ v
    mcasp->regs->PWRDEMU = 1;       // Free-running
  u2 `7 `+ o0 e$ U" I# Q   // configure McASP0 receive registers# x9 S2 ?' R3 W8 s  \4 r
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used4 X! h0 f1 \* D8 h+ h1 l
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' q& L6 Z' `2 A/ _5 g
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word, J  j+ o" t8 S) i; t* @; H2 ]
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! U* _  x( Y- V. z4 ~$ ]6 r    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
0 |! e2 o. O3 v7 O; @; [    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
9 p; c* P3 F  f6 q! I# v/ ]    mcasp->regs->RINTCTL    = 0x00000000; // Not used
) D' `4 D/ L; ]. r, U& h9 f    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 b" i( m1 I# N7 p" ^7 Q1 z
2 K* z! w  g* Q    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
* h2 W" p) M: B! W9 ?: |9 T    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 M; J* z4 Z2 b- E" N, O  x
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word. k' V7 H/ `5 J7 }$ x
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ x- O8 w9 {: ^+ |* K. ^    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
- n* [$ K2 I. N/ [- ]' W8 I$ N3 J( A- X    mcasp->regs->XTDM       = 0x00000003; // Slots 0,13 S' q" C1 h# F3 j# V  ?! D
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
; N3 ~' z( v4 Q5 }    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: c& I* p3 x( V  K8 m

# o4 X0 V5 _5 x* h8 T  a5 B" I: C    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN; `9 Y/ O. i' J; B' P% t
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT3 j2 k  Z% I( i
    mcasp->regs->PFUNC      = 0;          // All MCASPs
5 K$ J: Z8 B- y9 T, G; X    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1) R% _6 R2 o- J9 D* e* v
, x8 ]; \( P8 @& K
    mcasp->regs->DITCTL     = 0x00000000; // Not used
1 R; J  K( H' n& i9 W    mcasp->regs->DLBCTL     = 0x00000000; // Not used
% w* }% N+ X& h% R3 _5 U9 W    mcasp->regs->AMUTE      = 0x00000000; // Not used" n/ h* X% @6 C+ _

5 Y2 k, f/ f" P: R, A$ p2 f8 y4 `/* Starting sections of the McASP*/
+ o- ~6 L% r$ W7 C/ [' [! V    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; J' e6 ?6 v- X( f* [
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  / l: `% _) E% w( y3 j- p
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / C( X5 }0 \( W  |0 u- N# R
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ p7 l2 u: c4 v, D
+ r6 v; O+ P# k# [! \) c    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 1 ~( Y( n7 o6 _! t
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 o! g4 f: @4 M9 c# a    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 ~! c. O7 `6 f
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );  x6 |9 `$ r6 U$ j9 F4 r

/ R1 ^  S4 S4 }4 ]  B( @3 S    mcasp->regs->XSTAT = 0x0000ffff; 8 d; W: U) ^7 b. p. ^4 ]
    mcasp->regs->RSTAT = 0x0000ffff;
- B  i( |* V' D3 C
7 f3 {5 v# P8 |# ?& K$ n& k    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;  _- e+ d, I( k: ?0 P1 N; V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );3 G- |' t% Q% c; o' F3 |5 u
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ ^& |0 D. v  _- M+ G4 v5 ?    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: p6 A' D9 b) y& S. h/ J
% X- o4 I% {/ z5 h, Z  u5 I    /* Write a 0, so that no underrun occurs after releasing the state machine */% ?0 C1 h9 i3 Q1 W7 P; Z6 {, J
    mcasp->regs->XBUF5 = 0;& C* k+ l2 F4 G
    mcasp->regs->RBUF0 = 0;+ ?/ J, o$ x! Y  l( y2 E2 f' r. {+ }
# ]- Z- C& ?5 H7 B4 I
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - E  N! ]& y6 b- [  K4 r- e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 S. G4 h' H$ D
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 T  [$ t/ n* N& H/ e: z" f3 S8 W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 \- e8 C/ z- d$ ^) f4 s/ L
& G$ W/ V  U% q2 o5 ]9 r    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 v0 W' I& i% e8 U0 n. r
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- _7 L# |6 d3 X; w& D2 r    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! J6 L* _- E+ u" i    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) h( U- H6 L. p+ ?

, j4 ?/ k: m2 s5 z    CSR = 0x0000;' B1 e' p7 k( A
    INTC_INTMUX1 = 0x3d;
: A; f- Y/ t- ]3 U" \- S) h8 e    ISTP = (unsigned int)vectors;2 a* y, B5 I) w/ ]8 T3 |
    ICR = 0xFFF0;  7 b6 l: S) S2 y6 x8 Q0 ]9 h- @5 x! O
    IER |= 0x12;  
  V3 Q4 G& }$ E: f    CSR |= 0x01;  0 u1 i& q5 Q# \( U. f
! }2 _9 v0 b! p7 ~) O( K! y
- P9 K3 V  x- q
' V5 f8 f8 w# j8 ]  C
还有就是两个输入输出函数:- j' t8 J( S  o: h) d4 |7 b
void output_sample(Int32 out_data)
$ X# u* ], u9 }* O{
8 a# x4 L* U7 F9 D  AIC31_data.uint = out_data;  6 h( M$ A2 |0 _: R8 f0 _$ F/ _
  MCASP1_XBUF5_32BIT = AIC31_data.uint;0 P6 j6 c( X4 U1 R' N
}
* V4 A2 n! d- D
+ }& w: H" y+ J! _* \Int32 input_sample(void)* V, ~$ z7 C; L% o, O
{  2 I/ ?5 `3 `/ u3 q9 |, }
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
4 [; P# ]: C  i& S. u/ X# N  return (AIC31_data.uint);
( v4 J! F. H. M* K}* q4 l& K! p1 ]' G& ]/ z) V% i
6 T) d/ ]* h8 c6 W6 e
分享到:  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-11-27 19:59 , Processed in 0.038474 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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