嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:8 I. G% W) r, Z
main文件:8 K& K! m. _( A) z
interrupt void interrupt4(void)  3 O4 h/ A+ w5 k+ p: T' w3 ^: A
{# }' o# [- S: J$ J% j- o. p2 \/ J2 Y
  Uint32 sample;, D4 u, ~0 `, k3 o% |
' j7 E/ I; ^% p) [7 |4 t
  sample = input_sample(); // read L + R samples from ADC
- d9 C6 Y+ R/ Z, d$ L0 I. A1 \. G" a2 Z  output_sample(sample);   // write L + R samples to DAC * J0 `* u' x) j" K* t- Z" w7 U
  return;# }' d$ i& @2 i! l  c: k
}; W% _; f7 f; k  J% B1 N

' f+ P% R+ B' H* g2 U6 ?int main( void )0 v& b4 L3 m  c7 N
{
! }" W! ?7 }) _7 q+ H$ U' Y  l4 V1 i% @! V, Q
    /* Initialize BSL */
+ h- `7 i/ t4 q, J    EVMC6747_init( );. ]4 |; B, {9 U: [
        /* Call evmc6747_intr function */
  N( k9 `! J; [+ L# B: ^" M    aic3106_init( );
/ d0 R/ D: T; @, |/ C4 L2 E$ i/ p        while(1);
# P$ |2 N/ @; g2 R6 o. p# G}/ R7 L3 C7 J$ T) X5 O
' N% B% _- r6 m

5 D' o) s5 {# z$ K5 y$ zaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题1 R( s. L7 B+ d* ~* m4 v
/* Initialize MCASP1 */
  x! l1 [2 K0 O/ G' Q    mcasp = &MCASP_MODULE_1;5 u7 e( T% W. R  o5 R- m: d
    mcasp->regs->GBLCTL  = 0;       // Reset' O: |! s' `, q' n/ N& d+ E
    mcasp->regs->RGBLCTL = 0;       // Reset RX
7 ^2 f- q8 o# \% g8 h2 ~    mcasp->regs->XGBLCTL = 0;       // Reset TX
) e& G6 e- I6 N+ g( `$ k$ Y, F    mcasp->regs->PWRDEMU = 1;       // Free-running
) O8 D1 O) h4 e+ y" b   // configure McASP0 receive registers* H6 i6 \  Z+ O8 t
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used5 i' |, R) r' `9 Y
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: _3 D# e3 B7 a    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 u6 b' r( W4 a; U) V- u9 Y    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ i* \7 b( x8 Y3 P0 b( n    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)( A: f! b* D4 e
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1+ ~' w8 `5 T4 L6 W1 y) o2 }  Q
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
; W: H) G- \( Q" f  j    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 i; h( Y7 Z) W/ l- C# u* R) L, ]7 E8 O+ k
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used8 o4 w  a# h# K- z, n
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* [. i- h/ ]" w% c  n    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ e: G* W1 N% e+ ]5 I2 I( S    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16+ W8 n, Z- _% o  H4 K" E9 B! Q% e
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
9 B; Q" l4 o0 u# v; A, Z. ^- ~2 r    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
" B5 r6 m5 \) W+ b! P3 @: B    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit$ \5 j8 s) l1 a
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 o. P, @' i: b# K! R3 _. o/ B( T0 h/ c& w
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
) R8 {+ T+ T5 ~+ x* x* g    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT0 }& r0 P# M3 ~+ G% v; u
    mcasp->regs->PFUNC      = 0;          // All MCASPs' t- E/ K$ ^- u) o* S$ J+ }% W
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 g- b/ n( L% L& v; N. [
5 P# j  L! T, G
    mcasp->regs->DITCTL     = 0x00000000; // Not used
) a0 r9 }8 B# H5 S# c" {* u" V    mcasp->regs->DLBCTL     = 0x00000000; // Not used
% ]4 v4 q/ w. m9 D" {9 h+ A& _    mcasp->regs->AMUTE      = 0x00000000; // Not used( u- u5 y1 N5 v/ s& h2 d

% O# g3 z' N# K$ f: C! i7 k/* Starting sections of the McASP*/2 Q$ M9 z: k) o2 Z) r$ @) y0 |
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% _# s& @& p6 i$ n9 i- \* B    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  7 h, R* u3 Y. _" T. Z; L6 I
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ ?7 Y  x3 `" h    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 g8 ?, d- g1 E, S6 p& s5 t
; Y& j7 X" V! n" l4 P2 L
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 Y' ^1 K( ?. \+ w( h    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 C  Y  k* e2 D* {, g; f    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- |  o# W" y' `7 v, X    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# G" c/ t5 l9 K& X( e$ o1 e- c6 |: x! _# c& i
    mcasp->regs->XSTAT = 0x0000ffff;
% E- K2 ?* O  H# U    mcasp->regs->RSTAT = 0x0000ffff;
) P0 h; ?: m3 c* Y6 ?9 Y5 Q  j) Y" b- Z9 p1 j% t
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;- L) k6 Y9 h$ O6 z  W: n
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );9 h' E4 S! N" c" a0 n: h; h
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; . v( W6 ^+ C; p$ i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );  C. t8 ~7 P% r, b* r  B- f

* w$ Z; `& c; h, X- E    /* Write a 0, so that no underrun occurs after releasing the state machine */2 m/ k: E- G& F: a  N0 w) x& X& w
    mcasp->regs->XBUF5 = 0;
  M2 p6 G" I: O) l; E    mcasp->regs->RBUF0 = 0;0 I8 P" B: N3 _8 l: W) O) [/ e+ }6 {

8 P6 s4 v1 o1 t2 M, k1 [    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! n( t0 [5 _" b5 r) _5 I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) |0 y5 n; q: @, C( l    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ s1 a+ i. N2 [9 ?  W$ p0 y7 G  O: x
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );, {; @2 X( Z: e
: n: l3 O6 B2 P# c
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! ~0 N5 C# C2 P- }8 O6 a/ _
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ Q7 Z# x# m% }- f    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) \9 \* H. J& |4 W  ]
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. U( z1 N5 c6 f
) v7 t" O. V6 [5 P( C! v
    CSR = 0x0000;  H. O; B8 v, u, O4 u
    INTC_INTMUX1 = 0x3d;8 ^2 b9 B. ]7 a2 ?
    ISTP = (unsigned int)vectors;
3 K, F& t% T) W/ y# Y. s+ F    ICR = 0xFFF0;  0 b6 S1 h& `- K7 _
    IER |= 0x12;  
' V% K0 O  j4 {0 |  O) r4 f    CSR |= 0x01;  
  w8 [. D# f5 s2 _  C! |: q; g. V) d# R! E6 ]7 U% n
5 Y& X+ E( F9 c, ~+ o  e

) B1 S" g9 w4 d" `. F还有就是两个输入输出函数:% S( U  _+ j7 F& I) U0 p2 I+ |
void output_sample(Int32 out_data)7 u* B" w  Y, {) Q, Y
{
+ R* Y  P5 v7 H- s2 q  AIC31_data.uint = out_data;  2 C" o1 G0 |6 m! ]0 B
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
# |$ L- ^7 ]$ [}
4 ?2 c0 S  `- e; t6 q8 A# }. z% w" Q: ~/ U
Int32 input_sample(void)
* p) H, E2 M2 k' g: t& t8 x{  . e0 P) j& g$ c, D3 M/ j' L
  AIC31_data.uint = MCASP1_RBUF0_32BIT;  O) M# q; X' ~, Q
  return (AIC31_data.uint);& {$ o* n; ^$ _4 y
}* K0 Z! ?1 D/ }2 I& a$ ~

% a) B, @- I7 H" C/ S- P( G
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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