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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 J  M; @& _( n1 d1 w5 x3 r
main文件:0 c, ^: z2 R6 m; U: J1 a
interrupt void interrupt4(void)  , X" o# A1 N0 I1 c- N
{! m, F. X6 U6 g# r
  Uint32 sample;  K4 H0 r( c) }: B6 {* K
3 o$ w5 @5 T! b; l* @9 K. I" N
  sample = input_sample(); // read L + R samples from ADC
! ]; _, t4 `2 u: ]% U" R9 `  output_sample(sample);   // write L + R samples to DAC
# `3 x% a4 C& q) o4 w! ^  return;
, ?/ U+ H6 c3 |}( g5 n4 Z" T; s/ V* N& B# r0 e1 L

( ~9 S/ Z1 f' x7 k! n- h* m, Cint main( void ). v* T# k, H# @) o
{
9 N. @" N: i' y( J8 J9 u9 e, E. u7 q) s5 [$ ~+ j: m
    /* Initialize BSL */; l! ]9 S# W5 T
    EVMC6747_init( );
/ w% ^& N2 v' u+ j" E# |        /* Call evmc6747_intr function */
& b$ V2 c) Q% |( A    aic3106_init( );
& d( O" j/ h. I7 Q9 d; Z+ A        while(1);/ ~. x" Z: w) w; Y
}
, e8 }3 j1 t( k; z2 @! w( B% ?% {

$ E/ R  G( N+ a; G. h  Zaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题9 v1 O' A6 E+ v/ s) E6 F3 @
/* Initialize MCASP1 */, W4 I4 W9 a$ q
    mcasp = &MCASP_MODULE_1;
, t6 v  ^1 i7 y    mcasp->regs->GBLCTL  = 0;       // Reset
# V% @- L9 d2 U. C* E* J& x0 f% l$ @    mcasp->regs->RGBLCTL = 0;       // Reset RX
' z$ D# E, L: R    mcasp->regs->XGBLCTL = 0;       // Reset TX
( X1 I+ Z+ M6 O    mcasp->regs->PWRDEMU = 1;       // Free-running+ d9 |  ?# e& _( [4 t9 n
   // configure McASP0 receive registers
6 O1 V2 e( E6 G+ B; t( |: e    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used; W& v5 m" ^8 u+ U2 N9 U
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" C; a9 l' ?7 L' H7 `  r1 R
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word6 w# {9 @, w! ]# Y  |. W  X/ j
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 X$ m: D; A& t! x* c6 T+ g    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)" j* ^! \6 d0 `# j4 Z
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
2 y- t. P' G& ~/ D    mcasp->regs->RINTCTL    = 0x00000000; // Not used3 l6 I; P5 x7 r
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 C6 b0 j# i; `' h2 Q  {. Q' T  }" J
+ z/ a, }5 T" K, ^, c' S  u  t
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used& K8 {# `* g  V* b$ Q$ e6 }3 S
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' @6 {- @* b  K: f  f    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ f7 k1 c4 W/ J$ E/ }
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-167 ?. A4 r5 {+ Q3 s/ |8 b
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
' M6 j0 p9 Z1 m' g* S    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
- Y; N/ `! `7 ?    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
% V5 Z9 o: T6 H# Y' h" A    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' C2 A  O% N" D5 r& j" `0 o/ c( B7 b" j1 S/ q4 D
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN/ i" G5 [3 G+ k2 a" d- ?( o
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
2 `1 o! t! E, A' K: }    mcasp->regs->PFUNC      = 0;          // All MCASPs
9 x+ f% o" O5 Z$ S3 i    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 J2 q8 G' J# ^: ?3 K
3 i8 D; H/ F" X" @/ i% S    mcasp->regs->DITCTL     = 0x00000000; // Not used. w8 B9 a0 Z0 T. n
    mcasp->regs->DLBCTL     = 0x00000000; // Not used0 g" ^6 U& p/ ^
    mcasp->regs->AMUTE      = 0x00000000; // Not used
) O7 C4 k3 M% f% }( J$ Z4 |- Q0 V
/* Starting sections of the McASP*/
$ {" X( ~3 f, |7 e; m9 Q$ l    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 A1 A: v7 C2 L) \: b    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
) Q+ r) t( h& J, i% B    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / `' r. C4 ?+ @5 J* n
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ K  t9 i( e0 D% d$ B2 N9 x6 P) o. \3 v# i  y$ K$ _3 Y# U+ |
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 6 O% j% v0 \8 x1 p/ M7 t4 q- }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 v- `- M! s1 f9 g5 i5 a6 f7 y( q
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 1 _3 `$ n2 X. K( J/ V( y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );7 h! p' K! b9 E: N) f
& {$ v# @, h* a$ [/ e9 p
    mcasp->regs->XSTAT = 0x0000ffff;   S+ A# U+ b( V( m
    mcasp->regs->RSTAT = 0x0000ffff; ' u& a7 }/ j/ n

" q! x, V& H/ p# \    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 u6 S" j: W8 N  @% o0 k    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );+ H( F+ X8 ]2 j- u
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% K" s& O3 j( |2 z9 M! R0 L) y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );7 x" q. \; P0 H8 Y+ d
, s5 ]: Z" M2 G  |: b* d9 g
    /* Write a 0, so that no underrun occurs after releasing the state machine */
4 o1 t$ V0 K9 r  [1 Q3 `    mcasp->regs->XBUF5 = 0;4 {) r( ?/ x' M. c
    mcasp->regs->RBUF0 = 0;9 j  S# \; I2 p" x" O$ T

& L: y$ f- z0 C: [    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! j6 O& Y( N4 r/ O% j    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( @1 ]' X- T; e) R9 Q% o    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 T- P/ o( z% e& c. r$ w- E    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* n! R0 k- h) M7 [& c
: Q  Q1 a0 `5 f4 V. l2 L8 C' \) N2 F; K    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 0 L- y1 H2 a" \% @. r
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 _' W! J3 F# f    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) x: K6 x3 V' j: \; M' i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );1 k: Y$ o' Z+ q8 e3 U' L
4 K7 p/ c  R% q0 g+ D7 K
    CSR = 0x0000;" V$ m2 J" U' w- x4 c3 p
    INTC_INTMUX1 = 0x3d;* C+ e- h' d- e5 H' X
    ISTP = (unsigned int)vectors;
2 p* Z3 f1 [& l) T7 ?# |    ICR = 0xFFF0;  
  e: n; \/ l5 t  E# {! u6 P8 {$ |    IER |= 0x12;  3 g; X5 ?) W; X* @3 s2 P5 X
    CSR |= 0x01;  4 s) z3 l4 q% n, F- w- Y3 v
( R0 {; d. S6 j3 B
$ D, Y6 t6 u, Y, {. S0 z
7 p0 J0 T0 g' c3 H7 x
还有就是两个输入输出函数:* ^7 V# J6 g. K. T# w1 @2 B* X
void output_sample(Int32 out_data)
3 O$ q4 G  g, b% W9 K6 m; w{
! q- f- ~. d5 e* k8 v$ d! J# }  AIC31_data.uint = out_data;  
, d( J- _2 m4 h- }* `' d" D) L  MCASP1_XBUF5_32BIT = AIC31_data.uint;
% H: |# K9 {% K4 H, A1 D$ A}
' ]7 d0 T6 ?, S3 [) a: S: p0 t( c6 ]1 `
Int32 input_sample(void)9 ?! l& B4 O" {6 b
{  4 c* c7 h$ Z7 o9 [9 z8 r/ B6 E
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
' k9 O1 z7 u% B3 Y  return (AIC31_data.uint);
: Q' `+ {. o9 c3 }% L- h' w}
# v; {5 w( U8 y! ]' _
% ]# v# f, c1 j. \% ~  Q5 ~1 \
分享到:  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 15:15 , Processed in 0.041398 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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