嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:$ N% x7 x* O4 n0 m% o
main文件:
0 C/ u: |! d  X- x: n) N6 G' F. Hinterrupt void interrupt4(void)  
' |1 u* q$ w8 m' z. S{
- c; @2 U% L: R% \; X7 G( S  Uint32 sample;9 w2 t" @/ Y/ n

$ e2 U" @/ k/ |8 K. j  sample = input_sample(); // read L + R samples from ADC
3 k6 D" D. L; L) ]( d0 x. ^  output_sample(sample);   // write L + R samples to DAC 8 k! p+ F( B! @7 X1 j
  return;
9 q# d: S9 f) G! P( |& `0 K6 e}
/ i% ]. L: P+ M: e
3 M" y. z4 U+ U# F: y) `9 Sint main( void )6 j& D. X7 |! H0 C/ E  C# y6 H
{$ E) D$ u  [6 L
6 L  w6 ~$ k5 J1 V3 S
    /* Initialize BSL */3 u) `' S: ]5 y( I2 @
    EVMC6747_init( );
" v' l5 s; o: \' ^        /* Call evmc6747_intr function */
( H  [3 N( t, d; y1 m/ O    aic3106_init( );
8 t' d$ x$ S3 i        while(1);
/ Z( l  m7 v9 W) V4 f' z, u}! n9 ?- R- [, G% G5 L

/ z: u2 j4 _6 l, ?, e( s1 i+ L5 F" _' ]; H$ A
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 o8 H* s6 c1 {# t  I* X
/* Initialize MCASP1 */. C  w7 x: g  L) l: Y
    mcasp = &MCASP_MODULE_1;
$ H5 q7 B7 w# \2 `5 F    mcasp->regs->GBLCTL  = 0;       // Reset
, {/ v7 o5 ~: J: a    mcasp->regs->RGBLCTL = 0;       // Reset RX0 J1 s  v  V% N3 u
    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ q/ K) f9 M7 j    mcasp->regs->PWRDEMU = 1;       // Free-running
" d" F7 _/ E+ v5 D, a   // configure McASP0 receive registers/ T. q: {$ E7 M6 a: {0 X2 a3 K
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used; k# o  j' C+ e: q0 r
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, }4 B7 X2 S7 z% k
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( r# z! _/ z/ O9 _  W0 C- q0 Q* s. k    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ N+ b0 a7 I! @3 G: `4 v, n' c
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
1 y4 ]: F2 i' ]    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
9 y" h! s! L, k) Z. L- h    mcasp->regs->RINTCTL    = 0x00000000; // Not used4 {9 ]3 s: N  B9 ^
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 _4 q# d1 W2 h, I

8 x0 g- z1 v! w( w  `    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
$ k3 g# h- @+ H    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: a+ `, b% C4 |6 S$ b    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 s% M: ?: o) {5 P  B0 a
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& }+ j8 Q  F" ?, M" P% B% y  g
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK0 F8 U7 }3 r2 s' N3 |' k% `6 k
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1$ z: H; g# H* P/ R, r8 h+ H
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
5 `0 `' x4 {4 s# V* j. o6 X    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 h' A0 g6 Q% v# ^; M  g3 y
9 t& W7 b4 ^# L7 F* e! n* y
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
0 s9 K; Z" k* p+ x6 D    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT$ z: p. ?' A, N3 l. e$ E$ ^+ Z
    mcasp->regs->PFUNC      = 0;          // All MCASPs% j- c7 B$ G( U# U- D
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX10 l, k( @: |$ ~' j! ^- r- A

$ T# U! s  Q8 C6 T$ m    mcasp->regs->DITCTL     = 0x00000000; // Not used; P1 a7 B( N3 U) s9 X. J9 t* P( t
    mcasp->regs->DLBCTL     = 0x00000000; // Not used' J' |: A# D) s2 D0 O
    mcasp->regs->AMUTE      = 0x00000000; // Not used
5 D2 r: |* ]4 n7 b) S
0 F# i; w# O8 y1 F' x5 b/* Starting sections of the McASP*/
  \( l7 I! I  c( z9 V: w    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
9 q- @% v6 u1 Q" n' C  d. ^    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
+ B6 s. X# {; {' s. E/ d    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 2 s+ h4 ?5 d. v% W
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% T* |+ X; Q" Y. l( \4 S# _
0 j: W/ r; ], \; P3 _4 q1 k    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 ?1 [$ k9 j& ?/ z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );% y9 z8 \0 a) H7 y' Y2 Q* }1 }
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
9 J$ y' V0 _) ^8 E7 m/ W: S    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' R2 q% D5 q, f; A& @, l9 X- \- ^! ~5 }+ m0 x+ B2 X) l$ M& Z# C3 q
    mcasp->regs->XSTAT = 0x0000ffff; % F3 k6 i) u, J
    mcasp->regs->RSTAT = 0x0000ffff;
0 L# i" Y1 O- n8 M, m' [' i/ Z- S3 D0 N6 a) V
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 G  z  A* E+ L  A* v8 A, |" A
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );& c9 W9 s( r! R
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- g; ]% |& F; T6 J* F. L3 w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( Q3 @. q5 z0 i+ n! g: S( N. t0 E4 L, Y5 S& K0 c  c
    /* Write a 0, so that no underrun occurs after releasing the state machine */
: H: a- H5 q3 A# @4 |3 D! }2 }    mcasp->regs->XBUF5 = 0;
& b9 J# t8 u$ Y" l" a1 |* B    mcasp->regs->RBUF0 = 0;6 I1 K. `0 Z; N1 U

2 _9 F, u  ^, Q" h# G# E3 K, Z    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; & a+ a/ G4 f8 e% o
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( e) B- N  h6 d
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# Z$ l8 E9 z' |! L2 v3 x$ v2 y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# A0 X  T6 a  V/ Z4 S4 _: u% {. x2 Z, q* v/ A1 a
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ; P$ e1 i- v/ h' J* j
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );4 A! }  F/ r+ ~" @
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 0 H2 b6 X3 Q  k2 e* J
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 S2 M- v' c+ C

/ ]5 @8 @5 V9 X2 v( G9 C    CSR = 0x0000;
- S3 Q$ z0 D; Z+ Z) r# w, Q    INTC_INTMUX1 = 0x3d;" Y, g; L, h$ x- E! z1 z
    ISTP = (unsigned int)vectors;
; n; s7 A" v$ m9 D- z    ICR = 0xFFF0;  
2 K# w0 ~1 K' y6 b0 G    IER |= 0x12;  
' y& \8 q6 H+ S8 V    CSR |= 0x01;  7 j0 j% B& T( K. ?

3 r7 M) W2 s1 Q  |5 P! E
/ T3 h4 J/ G: |5 X: ]+ [) w+ S; N, ]3 U* C5 V& V/ }0 a
还有就是两个输入输出函数:+ G: y2 c- J& ^% t
void output_sample(Int32 out_data)
1 v/ @; ]. u. l) `& D{/ U2 P. P& {( P0 l$ ^  B
  AIC31_data.uint = out_data;  4 K! i4 c* R9 q+ ^" x9 B
  MCASP1_XBUF5_32BIT = AIC31_data.uint;. J9 A! |% m+ D9 x4 y% z4 ?. E
}7 E! {. e# r% I/ U
6 t& [4 q4 J; u) E% B
Int32 input_sample(void)
" j+ v, j* z; C  x  E2 f$ v{  
" }6 C  U0 k. q% `6 `6 C  AIC31_data.uint = MCASP1_RBUF0_32BIT;+ f! c& G& X! W: e+ w* b% ~, e
  return (AIC31_data.uint);
$ C) ?( O! b( {" u5 V}
/ |3 Y5 t* a0 _4 L
* h9 S" A: Y+ K
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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