嵌入式开发者社区

标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页]

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:2 t. f- v. S7 }
main文件:
$ K9 C1 w& K( H0 ~) @+ Yinterrupt void interrupt4(void)  * ?, i+ b! T  n: t/ N, r
{
) H: y5 K7 z# b9 q) i6 {% h  Uint32 sample;
$ e6 N9 d1 y/ W' f2 V* p) q* X0 C6 n# e
  sample = input_sample(); // read L + R samples from ADC
( E7 H. o9 u7 ~5 w  output_sample(sample);   // write L + R samples to DAC
3 x6 x4 s' O: _5 K$ @7 b  return;6 Z4 ^" E; M2 X, J
}
/ ~/ Y1 g( S$ S! e  ~5 T; u* D: S0 o- c
int main( void )* {6 `* L" a$ ~
{5 U3 F0 J6 k6 s9 c8 z$ o

8 z2 K/ v& t8 ~# n    /* Initialize BSL */4 {. f8 m/ u: B) {) f
    EVMC6747_init( );
7 M4 F& u1 z# H$ N: i4 ^2 _4 b        /* Call evmc6747_intr function */
. V7 w. B# m* p  U. ^8 o* T/ A) i    aic3106_init( );$ U1 z; P9 C; {
        while(1);
0 k( `5 y8 B' l+ w. j& f}
- S5 W9 e, |4 b( p2 C
' S; `$ e- M8 ~& f
9 N; r- v2 L* Haic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题9 c& ?7 p6 M! K6 ~: M
/* Initialize MCASP1 */
6 \  _( m0 N1 F7 B! k" L$ ?* K    mcasp = &MCASP_MODULE_1;! M7 y! X1 T# A9 W
    mcasp->regs->GBLCTL  = 0;       // Reset
+ B% C) F7 P! }    mcasp->regs->RGBLCTL = 0;       // Reset RX  B  O3 U! K* _' g* }% s
    mcasp->regs->XGBLCTL = 0;       // Reset TX
7 e, e9 a! P; h/ y# M  c& Y    mcasp->regs->PWRDEMU = 1;       // Free-running
. p& _% Z3 v6 K4 O1 p& ~3 ~   // configure McASP0 receive registers
0 p7 m3 E! U7 h0 U% b0 t2 t! R    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
+ @" |4 W5 v/ p3 v8 H4 ~; C    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 ~# A4 g' p7 q# @" W/ G5 m+ g+ w    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 e1 ~4 l/ Z# C# L7 ^- P    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, M/ v! W7 e* \    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)4 {' ?3 d3 I* G0 E  f
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
7 s2 ^; _2 z5 H1 Y: _' X$ l) C% h    mcasp->regs->RINTCTL    = 0x00000000; // Not used
* n; c( ^) ?. I# G0 m    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ s: B. n, y& n! `# J
# X. U; S/ _' D3 S3 Z; V* h    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
  W5 S& p5 g+ @, C) x7 L    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 ]2 E# ]: Y6 n; y
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" d. f% d+ h/ C
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 R0 b  d, ^% D2 q. a& F  B
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK+ D; N0 G- W0 ?3 P6 H) T9 L
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
' ~' O' Z2 w* L9 L    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 ^5 |* ^2 ^5 w* @1 v  r1 T    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ I, B! m. b5 o0 R
$ e+ D2 f+ S6 l! r& }' ?
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
2 q" G6 x, f3 M' g    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
- i" y6 t( b4 O9 F* f    mcasp->regs->PFUNC      = 0;          // All MCASPs* O8 j: `1 e8 K/ S& m2 G1 d) {2 ~6 H
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( _- p$ i: F2 t% ?; a/ ?! D- n8 ?8 ~( v6 N1 {1 L
    mcasp->regs->DITCTL     = 0x00000000; // Not used1 {6 ~& J" N: T! P$ O
    mcasp->regs->DLBCTL     = 0x00000000; // Not used* R7 u& j, F1 D. ~! V  i
    mcasp->regs->AMUTE      = 0x00000000; // Not used9 `! e  f# X  E" W

- w( I1 u3 D# y4 H* \1 n/* Starting sections of the McASP*/
8 \0 r. y' M% D" g- N1 Q& f3 t$ L    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; $ [. J0 I$ W$ X9 i7 M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
6 J2 s6 l3 v$ q- h; w    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* h' p7 D6 Q9 N" l# a4 G    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );7 S+ Z1 @& s& X) `$ Y4 b) O
7 t$ @7 }( b2 Q: M! O/ D. {
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . `$ X+ g# |3 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( C# ?; l0 m; z) M1 F    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; : `% \5 k8 H3 h, ~: n# q8 C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );2 ?2 a6 V; \* [7 X/ G1 W) U5 I' @) z

" w- ?8 y: x( y- m0 @    mcasp->regs->XSTAT = 0x0000ffff;
5 M0 ^8 _2 q3 S. Z9 o) G0 f    mcasp->regs->RSTAT = 0x0000ffff;
4 s* J: m: s' c0 N# g, F5 O5 d+ E/ ], v2 x0 D
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. ?8 j$ N& X9 g9 {
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );8 G! g- t$ ]1 w  u/ Y" p
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ) v8 f. K& M( a" V! I* c+ N
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 a* e: i; F% }6 w" ^" `# m7 T0 `  Y$ G  B4 B
    /* Write a 0, so that no underrun occurs after releasing the state machine */
3 D4 ~7 Q8 I8 E/ v    mcasp->regs->XBUF5 = 0;. D& f# G/ j3 M6 Q+ g( c
    mcasp->regs->RBUF0 = 0;( t5 f& u( X: Q! A  K1 d2 H

1 B5 w( o% g: o# F    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 U6 ~; B6 A+ T, j0 t- _" E+ C    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ i" g0 _9 j% P' B$ `3 P/ |    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 3 a- H5 W* _' I0 B# G& K6 w
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );+ V3 ~! G/ ]! U9 }
; v6 a" P$ |, P& r1 |
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 r" {' G! Z7 b$ G: o; Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );+ L; N+ x1 J; ~7 B
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; " f1 D1 e8 {- D1 _
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );7 R/ j" S$ _; f: Z; e
$ e2 p) C" k( Z- [, t% l9 {
    CSR = 0x0000;
" d- m3 R, }# J    INTC_INTMUX1 = 0x3d;1 A# X, ~3 ^  Z9 J5 N: G0 R
    ISTP = (unsigned int)vectors;
# `! E/ l. n8 i3 z- o& w3 F    ICR = 0xFFF0;  7 T, d* ?! [4 R3 K( ^8 {- l
    IER |= 0x12;  
: K+ G" J! m% y$ h3 z2 z: ~4 c    CSR |= 0x01;  
& F+ f3 }9 o1 I0 E* ^4 i4 o
) @4 p4 i8 s* {2 b' u; `. I4 f6 N) Q; [/ u. c, z% g
, a8 D2 d7 ~( E$ {0 k8 R8 w2 \
还有就是两个输入输出函数:4 G6 t+ ~& {9 P: k9 h* g
void output_sample(Int32 out_data)6 U0 Y, ^% F- w+ k
{
8 f% [( d4 ?+ P! P2 h- |  AIC31_data.uint = out_data;  
) p$ _- E% V, A! H  MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 P" h  b. ]: _}- ]8 U, o7 M. L* r
; e) R9 a! t4 [% e: A  k  m5 f' l# {- R
Int32 input_sample(void); _, s; U; s+ a* T1 D
{  
1 _  f9 j8 ^' q' t4 }+ M$ b  AIC31_data.uint = MCASP1_RBUF0_32BIT;/ H; c. A4 J& `7 y' {
  return (AIC31_data.uint);1 a$ r& @9 B3 X3 q
}
/ D5 y* u% I; V( f% s
0 f% [0 {8 A! @3 s! P
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4