嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:/ f3 T9 }# Y" l2 q
main文件:5 f0 x0 e1 V- ?/ i4 ], U
interrupt void interrupt4(void)  9 [% r1 H5 w1 a
{
- h4 i$ k3 t% T5 D  Uint32 sample;
9 {5 u7 i* s2 g$ j# [* x* J7 l+ s/ n$ H2 T. j: p+ y* I
  sample = input_sample(); // read L + R samples from ADC: _! _& l' m5 n, K/ d3 ?
  output_sample(sample);   // write L + R samples to DAC ' E' y5 X* Q& p7 P/ g
  return;0 ]; ]0 w4 K5 s5 j" E
}5 R1 b: ?2 t% X; k3 L& Q
* B3 J5 r2 L( W3 T; |' @
int main( void )
$ d1 {, b( K( ]+ I{
* a3 D' k# U2 s: M3 \
3 C& k2 T6 E. c    /* Initialize BSL */
  k, [* u1 Q! Q! C    EVMC6747_init( );2 _" e7 w! c) u8 r  @
        /* Call evmc6747_intr function */
4 Q  l3 t( A6 j: K    aic3106_init( );! F+ J: ^  g+ S5 E; {2 S5 R- G0 _
        while(1);& w! F. R6 T" a: x$ W/ a3 j+ K/ h
}, u8 g4 ]" ?  e/ U8 ~* V7 T
9 n  v2 R- k6 {2 G' ~+ o9 P) ?0 T

9 W8 _, S4 D$ i/ e9 j8 j- O0 Oaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 X: o" H) @% m' d; Q/* Initialize MCASP1 */" Y  |# l# H' J+ |) H
    mcasp = &MCASP_MODULE_1;
7 M- V- e$ u- D' C  l3 k    mcasp->regs->GBLCTL  = 0;       // Reset* \5 s: ^1 p" R. `1 W
    mcasp->regs->RGBLCTL = 0;       // Reset RX' t/ o2 L. S( j6 ?
    mcasp->regs->XGBLCTL = 0;       // Reset TX3 E- m) q( t7 Y+ E: s& n- I/ }
    mcasp->regs->PWRDEMU = 1;       // Free-running3 f- _3 Q2 V# P; f9 ]- H: |
   // configure McASP0 receive registers
+ x2 b# f5 D4 R9 m7 l    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used& w! K# ~) ]$ D# W5 I
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& _* n" F# W3 q6 `    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word0 u! a( z* |% k1 j# q4 @) W  s6 z
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# ?1 u) Y8 P8 q( A* X    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
! N+ E- u/ C0 z% }$ e' a1 F2 [( d    mcasp->regs->RTDM       = 0x00000003; // Slots 0,10 z( T4 w3 ~7 K: t2 O$ D
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
. A) m- R! T( S$ v' m    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' ^2 t8 W* z( |8 Q  W
# d# s7 _4 o) Z7 P; d; X
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used" j1 L6 \1 F# z* [* j4 ?! b) [
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* x( p0 ^/ g4 o' R    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word, l* J0 c3 E) k( p5 |
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16* h1 w. B* Z$ h8 ]0 v& ?+ }/ Q
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
6 K! Y8 ?: Y( P4 F; P  m    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
- g5 N0 i* U& Z- ], Q    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit* @+ y7 T& \* y/ b
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: ]1 O- N  @/ P$ K& D% V1 D2 Y
1 X, _& Y! X0 j+ Z1 H  @2 ~( I
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
: L4 e+ X. J% S5 p    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
6 d- f" n& P' m- P2 M( V    mcasp->regs->PFUNC      = 0;          // All MCASPs
& @  k$ Y- m! e7 Q2 b7 s7 Q" ^# N    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1# S0 l3 b8 O1 g3 ?

( M( i& t2 e2 M2 o    mcasp->regs->DITCTL     = 0x00000000; // Not used
% ]4 k# n/ p3 o! u    mcasp->regs->DLBCTL     = 0x00000000; // Not used& Z3 T# ?" B2 P' P
    mcasp->regs->AMUTE      = 0x00000000; // Not used# R: j; T6 r# G2 \( y
4 m* ^& k4 @& n
/* Starting sections of the McASP*/
2 o* K8 G* d" g" T$ B1 S' `    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 2 Z4 D+ b! X' @; p
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
% d( y$ b, d: z- ?7 P: W    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, E9 O' u; ?6 J3 f    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* ~% ^' [% R, E4 U3 i$ s1 ?
4 y; I1 ]8 Z) g* k" _    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ! P+ U2 V- Y7 W! E
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );2 g& [# g: x" B6 r" W& M" L% E
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 ]' M: {; ?6 a3 x- J1 s$ u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) {. z/ T) \! S; a2 z- a

% ?/ @' N2 b* D! M/ Y, Y5 F    mcasp->regs->XSTAT = 0x0000ffff;
& Y% ?+ J! [7 U  N7 L+ [    mcasp->regs->RSTAT = 0x0000ffff; ) N% [. U% I4 v" @* v, a9 \, Q

; A5 Y  e( N, H3 Q0 G- O* x# ?    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& o, O+ n- D: E
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 a8 b# {* y% `, p8 E; }0 R( A    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 P; \7 ?6 R8 I    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );) {  O/ U. q3 ]+ `' j) g7 W

' c+ N% j8 j/ _0 @* G    /* Write a 0, so that no underrun occurs after releasing the state machine */
' r6 [1 Y! {" ^; {  V    mcasp->regs->XBUF5 = 0;8 L& I  O- S7 `4 `& W3 o0 \: v
    mcasp->regs->RBUF0 = 0;
$ m9 x, b; x. Q! y5 @9 d# W
; v  c, p6 n  x, P    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; , U. T* K+ Q( q3 n2 S8 }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* b4 N3 l" |' W# |8 \    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & J0 L+ P, r9 [# Q" P3 i' s
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 k  e2 G4 q2 R& i; M
8 |" l1 ~$ w2 H4 J7 Y
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ l: t; W% ~4 s    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" Y; R1 ^, {6 A/ s9 ]; J    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) a7 D+ I2 i, R5 B1 [3 m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! h: {/ d; E, l; n) ?% H+ m$ Y" ]7 f# H  P* r& T
    CSR = 0x0000;7 A3 G, Q1 }8 Q/ `9 H2 Q- c' \
    INTC_INTMUX1 = 0x3d;
2 B0 P; H4 y* [/ s4 Y! Q: w: @    ISTP = (unsigned int)vectors;1 ?1 V' E! O7 n, A' k" D
    ICR = 0xFFF0;  
1 c4 ^) ?$ j, k# W. f$ e    IER |= 0x12;  
5 V% j# T, k5 t' f2 ?) |. |    CSR |= 0x01;  0 m7 |7 [+ Z: E: R! `- F7 r

# w4 O2 \$ i: i( A0 z
# G# R' x; m% X7 o, |1 C+ k5 N. t) {
还有就是两个输入输出函数:
/ |7 ~! N. f! h' C# Y! S. ?: D6 Jvoid output_sample(Int32 out_data)
6 c9 r' |3 ^$ [7 k) f& p{/ N$ M; e, \+ q4 E6 c* k( _, \4 {
  AIC31_data.uint = out_data;  " s$ T+ h0 a$ S  u6 x
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 r4 \( Z7 ]; D' g5 g}" V! {! P% ]. I" g
0 O$ {$ G/ l# i8 G; `: p2 S& s
Int32 input_sample(void)
* ~8 J! h3 j/ {{  
% e5 A' i1 G+ V7 N# r8 s  AIC31_data.uint = MCASP1_RBUF0_32BIT;. N7 O. Q8 I/ k, |0 O  ?/ f& r
  return (AIC31_data.uint);! d, h* F0 |* M4 s4 `4 k7 w) R4 ]
}
/ u( S4 H6 b) H  a0 b2 P- a
# y8 m$ l; O8 v. o( H3 r
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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