嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# a+ b7 j/ W# f
main文件:
2 s% i& m& B2 P& n+ P' D/ sinterrupt void interrupt4(void)  
7 T$ R: }9 E9 I6 k. G: Q{
9 u4 Q/ t* U" G  Uint32 sample;
; \4 O$ I- W% G; }4 b, F( g; J; h( s- K  D
  sample = input_sample(); // read L + R samples from ADC
9 |. O; o* e. z/ c; ]) x  output_sample(sample);   // write L + R samples to DAC ( Q& N4 ]; N1 ?9 x
  return;' n& a2 f* t1 m) l( e
}
# d9 C1 E+ M: C: x
  R- M4 q5 T* J- Cint main( void )
+ ]! ]+ X  X( [1 K$ z2 u0 _3 B{
8 n& o: W5 A6 y* T* d
5 u- Q/ x. \& z* Q8 o6 j; E; E    /* Initialize BSL */3 f' l7 Q% w  o0 A6 D2 U6 ~
    EVMC6747_init( );
' i) j3 m9 W/ _$ g        /* Call evmc6747_intr function */( L4 C9 e8 X- r7 X1 n$ k% i7 o
    aic3106_init( );0 D% S1 y# V$ l( L0 N. t5 q5 ^* p5 ]
        while(1);
4 f7 j6 v2 B' t+ h1 q( i. L: y}4 I3 f1 W9 i* P5 F- U) P
, a7 D, a0 d6 S" D7 z2 O

5 R5 Z; ~  Q- @' L! Eaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题1 d5 g4 g% D$ ?3 N2 U9 i& I9 Y9 }
/* Initialize MCASP1 */. B: v5 \' G0 U0 }, `% d$ v
    mcasp = &MCASP_MODULE_1;, w6 `) ?4 N( t7 |) o: M
    mcasp->regs->GBLCTL  = 0;       // Reset7 X4 M+ d: w3 [. o+ M  F
    mcasp->regs->RGBLCTL = 0;       // Reset RX
% s% {' p; n% n; W& |9 L    mcasp->regs->XGBLCTL = 0;       // Reset TX
2 r+ G6 u/ G9 D9 D    mcasp->regs->PWRDEMU = 1;       // Free-running: A" {* I2 u5 [
   // configure McASP0 receive registers1 S0 k; n# C2 M. w; y  d$ P: e6 N
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
- N8 M8 K  N( j    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ B4 L) U5 s) h1 F" B+ h
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word  U" Q, h3 D. }' i
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)$ e4 c, A' o; H% q7 t8 ], a# {
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)5 C0 j2 D- n3 U0 a& O, ^% j
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 H9 E2 U  D: c( G* r, ?+ F
    mcasp->regs->RINTCTL    = 0x00000000; // Not used* K6 B: Q  H5 c
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' ^, f$ `' L3 `. l; E' k+ i5 L$ A
7 |2 ^' e7 X* P8 j  o4 {- R
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used, N9 y# V+ i: F
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& i! b8 o/ Z! Y+ l
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word! s2 r% [$ t. J( W* W7 v+ {% e" X
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16' J: n  k& `9 X2 I) B1 Y% T) r2 q
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK* p* z# A7 J. Q$ e) Q! `
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
' q+ {6 B, \; l, s+ K) E2 ~5 V" ~    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit) Z  S5 u& O! e# x7 \6 p% L! Q! t1 b' ~
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: Y" s9 Q% w8 H8 o8 }5 S! b7 q6 V) U& o4 E7 j' W/ Y
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
; J6 s+ O4 C1 A$ s; h3 a: h' F    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
- z# ]# y) Z! @) S    mcasp->regs->PFUNC      = 0;          // All MCASPs) o7 e+ l5 B" e7 p. n( L1 X
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 c8 J' x6 |* f) h" a9 u' T9 O/ g7 N6 M0 b
    mcasp->regs->DITCTL     = 0x00000000; // Not used3 A$ H0 Z7 k9 P+ c0 b8 x
    mcasp->regs->DLBCTL     = 0x00000000; // Not used; u7 n- }+ A9 x6 F8 X0 x+ T: h
    mcasp->regs->AMUTE      = 0x00000000; // Not used
( s8 J7 d! s/ l+ J5 t) X& j& w2 L3 r% }/ y( z: o6 y$ s9 g- q7 s
/* Starting sections of the McASP*/
$ W" u9 C/ g5 K0 k( K8 p    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# A: Z3 f" C6 A2 W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  # p8 `( Y2 l) [, a1 g
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ; P* Q/ m, D, e7 `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
  X. F8 F, x% z% b  ~$ R. l0 \5 r4 f1 M
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; * z! r& E% h; F. ^) e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
) i+ \* [0 M5 O7 y0 {" B: S8 Y    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 1 [7 M) g- C+ P# U# D4 P8 m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 V4 J6 X: d0 ^1 k

+ X* g7 X. `9 _0 S  Z    mcasp->regs->XSTAT = 0x0000ffff;
. R1 O8 `7 _! E3 o    mcasp->regs->RSTAT = 0x0000ffff; 3 k1 |# T6 X0 d- n" {. M! x
' ^; r- x6 O* n2 E1 p% v6 J1 f/ a
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;/ y% E9 G$ `. G; r
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );3 N2 Y+ x& R: {0 R5 Q# U
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 f" m7 e, O) ?    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );( \2 a. \4 W+ v; k( V
" f. N& f6 E& C3 g9 c
    /* Write a 0, so that no underrun occurs after releasing the state machine */
# h$ Z/ Q0 Y7 Z1 z5 p/ {6 }# r2 \% l    mcasp->regs->XBUF5 = 0;/ ]: ?) e% i9 A* N" v
    mcasp->regs->RBUF0 = 0;
. R/ O0 l( {1 \0 c( Y  M
" q- G" y/ M% o0 G5 D    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % W+ W/ L. P" Y8 w# K! u$ V3 m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 @# P5 ]6 v' ]+ i# O
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 g$ @. Z( [/ P; z/ X
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: i9 I: t7 T. @5 d
; l7 g2 s4 Q6 s- Z! K5 p# e    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 W. r$ J& s% A' i; U
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );1 n. P) T- q  F* O; [& v, G" h) {
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;   Y9 R; I* r2 Z. ^+ N
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 t7 y; Y6 W4 l5 H: D# i4 R- ^) J/ V: k$ T" |% i
    CSR = 0x0000;
5 K! X% J2 z5 j3 F    INTC_INTMUX1 = 0x3d;+ I$ t9 `; }  X- j
    ISTP = (unsigned int)vectors;. c( E+ R7 D4 g
    ICR = 0xFFF0;  
' n5 v( L) k; X$ A: i    IER |= 0x12;  
6 r& }3 y7 h' I2 A8 b' x    CSR |= 0x01;  $ P2 r9 H, ]. b6 ?0 z6 F2 d( k

! I# ?: l) U/ E# i9 k) Z- K$ b, G. g" f0 x! d; N" E0 ~% L0 f
; v" M- K% F; w; |4 X
还有就是两个输入输出函数:
, c4 y3 ]4 u( \  S; mvoid output_sample(Int32 out_data)
; x# N# K! v( ]. `% C{
( M) z1 n3 j  T5 ?% }4 q  AIC31_data.uint = out_data;  3 E2 D- V% J' p. [
  MCASP1_XBUF5_32BIT = AIC31_data.uint;3 D3 ]" }- \0 Y" R6 K2 g
}. q: \7 g* _+ s7 I# V+ Q8 C8 v4 ?
/ {! C8 f+ O  T5 b5 |
Int32 input_sample(void)1 F' [6 ~9 p5 |+ Y. k% B! |5 R
{  9 u3 K! C9 X) \/ _1 ]6 s
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
! L" F' T2 X4 I& ]& q1 g9 z8 D! T  return (AIC31_data.uint);
6 F* o, D* A. j% _9 J) T+ Y1 k}
' ~( a2 q) O; G  h
" E7 a8 X* Q/ {: D" t. `4 P: J$ x
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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