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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

1

主题

1

帖子

23

积分

新手上路

Rank: 1

积分
23
跳转到指定楼层
楼主
发表于 2016-3-15 16:07:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:9 t& J% b$ p7 P' j
main文件:/ ?. H( h2 ~# |2 F) ?1 a
interrupt void interrupt4(void)  
) e$ d' }$ c$ R0 F7 _4 n{
- t3 H5 W7 `3 T% P! d$ t: ?! j  Uint32 sample;1 Z; r/ o( A# L
# N0 C6 V* T: u/ L
  sample = input_sample(); // read L + R samples from ADC
9 ^  L5 k  v, c$ R; M  output_sample(sample);   // write L + R samples to DAC
' \6 M- Z# L2 n) y0 k! M  return;
5 _- s: V2 {% I, d}
) P3 b- q% a5 `. T5 x. W+ M! K7 b7 s& `
int main( void )
. F* E8 [9 [& X{
+ o# M* w/ C  B' R8 X* h0 H& B6 v* k! ~* g; U0 A
    /* Initialize BSL */
$ u* D. \( S+ x+ N1 g1 o! J    EVMC6747_init( );$ R& s2 K! y2 d3 y4 u! j2 X
        /* Call evmc6747_intr function *// r$ V9 c2 s' Q. Z' I7 H# @
    aic3106_init( );3 c; m! p; D+ I9 M: B
        while(1);" T4 {% o! T! J; L( I" s+ |
}7 K3 @( n# w# }9 U

/ l& }1 z( k/ d6 ~7 B) ]
9 w2 V" [* ^  `' a/ a" s; _& Daic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 C- `, {0 m& Z$ S$ b2 r/* Initialize MCASP1 */
$ m: o, L" R8 `9 x3 l! ]" H    mcasp = &MCASP_MODULE_1;2 _9 n* w0 m4 p# G, I* [
    mcasp->regs->GBLCTL  = 0;       // Reset+ W' Q  b' z( }/ N
    mcasp->regs->RGBLCTL = 0;       // Reset RX
" _: x, s! f/ ?5 C. |    mcasp->regs->XGBLCTL = 0;       // Reset TX
! a! e7 k6 p' F3 ?* f6 e0 _# x  i    mcasp->regs->PWRDEMU = 1;       // Free-running: H+ P; _# E$ q8 [3 V3 ^
   // configure McASP0 receive registers
- A  a1 q2 i, G7 u" |% G, i6 N" C    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
( h8 E8 C5 ?0 ^" {! K; A: M    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 x9 M, e- X& W    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 \. Y* `# @! ^: d$ v! V    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 M: J$ Z# x5 g# M6 D    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
! W6 Q0 E& H# v$ s. m& s' E    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
+ s, _0 v% K1 l$ c8 f; a2 w    mcasp->regs->RINTCTL    = 0x00000000; // Not used6 ~) k6 |% M" F& S. N
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 O4 [* K6 J5 H9 C; ~: \# X+ o$ V$ j* \( M
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
! R$ J, Y1 x7 W7 o6 d$ Y8 _    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 `( E1 b2 f/ q3 u1 i/ E- T    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ x* q! A5 U" ?) u9 N4 `" M( U
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16) d/ `7 J9 h% V% u. {& _' B8 }  u
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
* M8 F; u8 Q2 R3 T: E0 L& _    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1. X4 O0 Z% N/ M7 c
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit( J/ S, z  F, g( L; f% H% S8 ]3 m
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 F/ o* J% {) P, L& R; O
6 N1 O# E% @5 t: n
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
3 M7 n5 h9 U1 K! ?3 N    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT4 T& C+ q8 s4 P+ E
    mcasp->regs->PFUNC      = 0;          // All MCASPs/ C$ a$ q" G3 A& Q
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 {! ~- U+ |. F9 m
, l( P+ I+ b# g: `( y& E1 L    mcasp->regs->DITCTL     = 0x00000000; // Not used$ S, ~3 O# b8 w
    mcasp->regs->DLBCTL     = 0x00000000; // Not used2 G. h# \9 S( O0 W& y3 q* Z3 h. s
    mcasp->regs->AMUTE      = 0x00000000; // Not used
3 F3 S% h* N8 g9 h' C
0 E2 _) N" t8 m# d9 C% C! j/* Starting sections of the McASP*/
7 u  Y/ I3 P; `; z    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; $ }' G: G3 X5 ]+ Z& M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );    s* ]* ?! {2 s7 H* |* K: F
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 9 ^& X9 `% Y' e8 Y" @- E
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 p$ g, q' L, @" ~7 E# J
$ u1 z, z, ?+ X( p1 u1 b    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
6 U$ _4 i. _" h7 ?) I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( r& A+ N3 P  c( O; {8 g    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; $ v* H( o- w- \3 r) l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ ^* u9 V8 N+ H' f3 _  _1 D' }: I" m* `- J5 _
    mcasp->regs->XSTAT = 0x0000ffff;
6 R5 D$ y$ [! i9 E1 L  B    mcasp->regs->RSTAT = 0x0000ffff;
1 V* F: `& k: k6 L; x0 a6 m- G/ B& R) P* `# `
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;/ F6 F* e6 A* Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );% N$ r1 u: f( {' u$ R5 G
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ h6 ~  Y$ \4 @* G  b8 M    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
  `5 a9 E+ K2 ^) W& |" d" e# G" ^- K4 W! l1 B( M, B% E! Y( {
    /* Write a 0, so that no underrun occurs after releasing the state machine *// z: o. R. Z6 U8 L: ^% G
    mcasp->regs->XBUF5 = 0;# J. t6 J" j7 k, N) z
    mcasp->regs->RBUF0 = 0;7 \# O8 L* t; y
4 G4 w) U1 v4 m$ U8 r1 R
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) Y1 c+ W7 k; S" Z8 k; n% t% G3 U4 V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );4 o4 ?7 o# c% F5 g8 b
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 y# H# `% ?/ X- i6 f! {) j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
8 [4 ?# S+ U# r" |- x9 f! j9 c! z% ~; \1 N4 A
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 S8 R) G) f4 _# l( l9 Q- ^" C8 ^    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );# G8 W2 c6 `4 z0 s. K( q5 F% H
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# G$ n- ^$ i) ^- b3 L; a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );$ j: J6 J4 R* V8 @* i7 s1 [. I7 C

; h0 N8 B* L5 y  p  ]3 \3 i. q    CSR = 0x0000;' f# s+ I; L+ U4 w' ^
    INTC_INTMUX1 = 0x3d;
3 y% \1 f5 A. T+ `( T" H* d: H    ISTP = (unsigned int)vectors;
# @" f0 v# I$ j    ICR = 0xFFF0;  " K' O8 c* m+ w4 L+ B0 t
    IER |= 0x12;  
3 E! o. M  U. {! w    CSR |= 0x01;  
1 A4 T8 G7 G4 _
5 p+ O" p1 T* {7 g0 b0 R) a9 j0 P$ H" n3 s! S. x, p) P

( |: h. i0 ~  F, m* B还有就是两个输入输出函数:& q" F& A- C$ O2 f# m" ]1 M2 X
void output_sample(Int32 out_data); j% ?) r% b6 u$ J
{
+ |* B9 G) t; f' P" Z8 Z3 O- W  AIC31_data.uint = out_data;  7 e$ P' t0 ?# {8 d
  MCASP1_XBUF5_32BIT = AIC31_data.uint;, G% ~8 C! s: K& [
}
8 M7 P7 R* q9 a' o. Q7 S. }' R" ?' C
Int32 input_sample(void)
; {. G8 t$ \8 P{  6 m; Q1 h0 d! y2 y+ ]$ x+ ^
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
- t4 m% C* g  _7 }  return (AIC31_data.uint);6 m9 ?# H; ]# g/ A, n$ }5 t
}$ V: v/ N+ A- A) H
2 _  d: T6 p1 ~, v, m1 Z
分享到:  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-3-14 13:29 , Processed in 0.049021 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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