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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( q( \' D* s( b4 d* u: B/ Dmain文件:
! z8 V0 {3 f0 U/ ]% K3 |interrupt void interrupt4(void)  
2 @6 y! J8 d5 B+ o( P; J{' W+ y  M+ }- O
  Uint32 sample;
9 M3 d1 _, b. v6 b9 n# e9 e( x6 K& y! l: b" p! g4 t! o
  sample = input_sample(); // read L + R samples from ADC
) A5 p" b# |& D7 [4 F+ B  output_sample(sample);   // write L + R samples to DAC : y; ^& s0 ?6 i0 s4 ?
  return;! h5 |3 _# V7 K/ K, T
}/ ]- K. Q5 q, k" |, q! e
5 w8 h- u+ Z# o# ?6 T8 S+ h
int main( void )' W: J; B6 j& ^8 N! y1 g
{
/ y; x% p: V. ~( [* W) E3 ^0 z5 D& Q. p3 m8 J6 {! p
    /* Initialize BSL */' s2 j# u1 x1 ]0 j* [+ d7 w; O
    EVMC6747_init( );
9 o, T6 `: P! R* T        /* Call evmc6747_intr function */. ?: X- [" A1 v6 P2 }
    aic3106_init( );
, M6 @- S2 i5 {( M4 p' D        while(1);" T+ t. `9 B- {5 k
}( X) g) k% U% h9 I6 _

8 L6 a* ]4 d1 i# I5 m) h: _! v. e) H/ L9 |( p9 c- g
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题, s* F& v# O, ]: c
/* Initialize MCASP1 */
' p& q$ B; L1 B$ O8 f, k" p    mcasp = &MCASP_MODULE_1;+ _' p& z- t5 O! T* z( A
    mcasp->regs->GBLCTL  = 0;       // Reset
; E' i% k1 s) b# e9 [( ], ?    mcasp->regs->RGBLCTL = 0;       // Reset RX; n# K9 T2 \; ?# k  O
    mcasp->regs->XGBLCTL = 0;       // Reset TX6 u% v( ^4 `" E& ~- ~- k/ D8 A
    mcasp->regs->PWRDEMU = 1;       // Free-running
* e9 r1 R: [8 v) R& `$ x  Z   // configure McASP0 receive registers) k; m& |( b) r: ]$ t7 X; v- J
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used) Y1 }3 \3 }" n
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ \. E+ S5 v* U8 @
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ E% |3 ^8 c1 E0 w( ~" M    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 e1 U$ t% F3 _9 @    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)$ C% z0 l1 Y7 k
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
: v: A, \2 D* @" [2 }    mcasp->regs->RINTCTL    = 0x00000000; // Not used
4 @# f; i- c. o7 D    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' a! v' E$ e. r1 V2 S1 i& b$ s+ {: K- \5 X
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used- e: i4 o" F! F0 ]+ ^- E4 D
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* p$ E" \' W0 s+ O! x" M    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word- O$ T1 ]2 n6 z; P
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16+ h% \. D5 M4 u4 @5 q2 g: W
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK2 ~' z% g4 O% e. P* B% g
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
( T& @) t" n6 k& Y+ D5 T/ Q    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit/ _4 }1 E+ b+ N' o+ V2 }
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ @8 Q: b& P. I7 G0 g/ b- x: F/ p" }5 f9 V
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
4 `& p9 c+ i7 `& h/ b    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT1 m- h; g. L* }- n# m6 O/ @7 x
    mcasp->regs->PFUNC      = 0;          // All MCASPs; [% B4 p3 M6 L3 H1 T0 E2 B1 K7 @
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 u' }/ G0 C5 ?( W8 ]: J" g- s# f
4 K- v5 ~4 o( J; z0 S3 g3 n
    mcasp->regs->DITCTL     = 0x00000000; // Not used% t/ T7 y% O$ ]1 A. C
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
% W% q+ j7 ~+ n# G( R# `    mcasp->regs->AMUTE      = 0x00000000; // Not used
/ r5 I. Y! Q7 H4 g& v" W, w
( S1 U  L* a0 E3 f% }$ W2 U: D/* Starting sections of the McASP*/
4 d1 ~, D) ~) g9 w/ a8 `( x, B& F    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 5 Q- m/ h' f6 A. @2 J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
+ Y! B9 u: K3 G8 b1 m$ Q/ F) ^7 z    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 x, Y0 e& @  D3 K! w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );' e" C& Y, b% ~, @) K+ m
7 K( G8 F; J2 z4 L, P% e
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; " z. S  [- j! o' d! r) V3 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ s9 ^0 K' E# _' B+ r6 r    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 Y2 c7 i6 A& k* }- T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ Y3 W# |5 n( d; y+ f$ S! }! x2 k% E6 M( k+ Q0 q9 b
    mcasp->regs->XSTAT = 0x0000ffff;
2 C; @3 }- O  \, M8 `; a    mcasp->regs->RSTAT = 0x0000ffff; , J+ J0 O2 M; D& i* E( v( X5 D

8 }5 w# c3 P1 O* }; o    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
3 z- b0 A' s3 v& R, n" ?  q6 t; J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 J3 S( J! L6 f$ T4 l) E    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ; d0 \% E5 J5 B- h" o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );* z/ B  Q2 q5 K; ?

/ |. P, [1 d/ R' G    /* Write a 0, so that no underrun occurs after releasing the state machine */2 Y; |1 G9 |# M# a! k
    mcasp->regs->XBUF5 = 0;4 w, t! H6 D$ h3 C
    mcasp->regs->RBUF0 = 0;
+ U( ?5 F% c! `: Y7 d7 A/ e" B4 k$ D7 t. k: }. x
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
* O' B* v: u/ i0 W! i% ~    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. X1 ]# t2 H( m; J( B0 h( B% M, W    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; n# e2 q9 }' m, p9 [5 n* j# f) K4 g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 R3 y7 q2 }! G9 Y; d
+ N' G7 f, ]  ]+ y$ Y. q2 ~/ I
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
  l, }; i/ N: M    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );3 n+ m0 e% ^3 b" P
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * B: N* c! C; S4 {3 l* y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 H' K# z4 e$ B' Q: y4 W& l+ y; f6 G- S  R9 u2 S8 @  ^/ d( j
    CSR = 0x0000;8 H; I8 h7 Z# m; n
    INTC_INTMUX1 = 0x3d;+ ?% f' p) w1 D, n  d8 v
    ISTP = (unsigned int)vectors;
2 E& {3 Z& w% k. a    ICR = 0xFFF0;  
- n; ]9 E7 F# ]& c! y9 O    IER |= 0x12;  + k! D3 R5 _5 y0 [5 O
    CSR |= 0x01;  , w. K, a$ b' f7 G, p- [9 G

9 t4 r) Q/ ~2 N  l$ l/ [( p( J
  `6 p$ T, L  i7 U, a/ G# w/ ?+ l
+ z0 Y/ J9 O+ h2 B$ k6 N还有就是两个输入输出函数:
, ~, @$ D( F- B5 A; [void output_sample(Int32 out_data)4 M9 p% t. X/ ?; a/ [
{
1 O8 J5 D; f2 q% p8 o8 J  AIC31_data.uint = out_data;  
! U, k/ g* }" ?3 z  o) r  MCASP1_XBUF5_32BIT = AIC31_data.uint;$ ^! F7 `# K) m2 R' b
}
) c$ g( q, r& `& M0 d) x
6 j0 P; j$ D3 O8 R$ mInt32 input_sample(void)1 w1 r2 \# w) y$ f/ }1 a% P6 [7 y
{  
9 N6 C) |7 o" p1 H" d  AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ a6 [+ ~; g2 X  {  return (AIC31_data.uint);. t$ T: p# F: x
}
5 Z9 t) U6 {+ Q  c; j7 [4 t! g/ q1 G4 e9 x/ j, A( A
分享到:  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-13 06:41 , Processed in 0.038013 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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