嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:( R4 Z- E& @& f5 B1 W. V
main文件:
2 T$ x# R) X* F# }& dinterrupt void interrupt4(void)  
5 Z1 [6 [. ^9 l8 I- V& v{
* w7 K* S8 q) z9 C: h1 ?% m  Uint32 sample;$ T5 ]+ |& ~& |
% O8 S, d9 K& E0 ~' h& L
  sample = input_sample(); // read L + R samples from ADC+ P  E% \4 f( `; ~" H1 |
  output_sample(sample);   // write L + R samples to DAC ! j- L# \& S# ^; Y  |
  return;' @  q% C/ K8 ]' t
}
4 v- V( Z' \- G) }. E( L' `2 @8 ^" H3 X0 W) D% c$ u- y
int main( void )# C: V6 b$ |: V- x8 U' ?. C
{
7 ]% ~8 ~9 q& Q5 {3 r8 V
# C+ H9 }4 q$ M) b    /* Initialize BSL */
$ F' r3 F1 V4 k7 ^  \$ d    EVMC6747_init( );
9 e+ [  ]3 X! e. g# L$ z2 C3 c" w) P        /* Call evmc6747_intr function */$ O4 q1 c/ G* H$ t8 Y- ~: g
    aic3106_init( );
$ ?6 {  w% B* q+ a4 d        while(1);
) B9 T$ ~/ k% l. P}9 u2 s% J$ O7 `; o
3 e3 o3 N. d2 A# _7 K: w' p
+ J) ^" T$ |  x, O
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
4 T2 w& }3 @( Z1 B3 L/* Initialize MCASP1 */
; w7 Z. H3 ?8 [9 A5 J8 z    mcasp = &MCASP_MODULE_1;
7 I7 @% R+ F8 H' {7 h; |7 s. H    mcasp->regs->GBLCTL  = 0;       // Reset6 g  L/ _: c% D& C* K3 T
    mcasp->regs->RGBLCTL = 0;       // Reset RX( }: j8 z$ m% a4 H
    mcasp->regs->XGBLCTL = 0;       // Reset TX! k1 D0 T7 m  T& f
    mcasp->regs->PWRDEMU = 1;       // Free-running, \, r7 k: T5 R3 `
   // configure McASP0 receive registers
! O7 ~2 w3 s2 V% L, H+ w    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used' S8 a. u, F# j; C* m
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. [% J! t; Y2 j4 j; U/ l, R6 G
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 U8 S! h; ^9 ^, i3 A    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* P% [5 c6 }( ?* f( {
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
: n. }8 ]/ Q9 @3 q: U  f3 M1 q    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1' {3 {/ J, y! Q
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
& x- ^8 F! r3 Q3 p3 B! {( q* j    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ ?( s& W# P7 I' E  `' G) G4 b; d- F8 R" K; i, E) _" F9 l
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
6 {0 s; D; N" ]- b    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ r5 ?' G( j2 |/ C8 b7 t    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ q4 \' u# E9 T% v; s7 A! p$ c    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ G0 n$ m' c/ Z5 \  z1 @  `    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
- }* t- z2 }* k' P3 u. q    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
" b* S) c( N) {8 T0 z, c4 d    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
- C3 Y& S+ j' u    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 n4 x% n4 `& h/ P$ H* R1 p& C
4 h' o$ J0 U0 P$ I: ^    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
* V. |' W& h6 ~: n- t6 l/ t" G    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
! K- S9 t; @% }    mcasp->regs->PFUNC      = 0;          // All MCASPs9 R1 A7 i6 y9 G- E+ b  p
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 e# C: q. W4 D: Y/ G7 N/ T; l
) ?# _. ~6 ]! @  Z5 V) k% T
    mcasp->regs->DITCTL     = 0x00000000; // Not used/ x7 q6 X9 r9 `& }' q9 \
    mcasp->regs->DLBCTL     = 0x00000000; // Not used) z* I' Q% q+ f+ j) k
    mcasp->regs->AMUTE      = 0x00000000; // Not used
$ L4 P- s: |/ m- ~0 M
) \% Y+ Y7 D, N/* Starting sections of the McASP*/& D7 U! t% k3 b
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 {) d( W5 j* u4 ^; B% D4 j! `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
5 N4 D6 W# ^% b& M    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ R0 r* s4 v2 C/ Y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- z9 n+ i8 G" ~
9 E- ~1 J# u7 v. R$ A    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . H$ Y! Z3 t8 K
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 W1 A0 J$ ]( g; O3 E+ @    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, q  ?* ~4 ?4 U6 S    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- i; h+ r, C+ k# {) v1 c4 U+ f, e0 t1 m5 J1 k
    mcasp->regs->XSTAT = 0x0000ffff;
5 Y% o: N+ d; K# R0 K2 H, d    mcasp->regs->RSTAT = 0x0000ffff;
& Y" i+ W2 q- c2 k1 C) ^4 R0 B( U) B& T6 D
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! H. ?- C8 q0 z& \! M% W7 Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 L0 V( E3 r) O8 L! z$ t. ^/ C! L    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 _; o6 ^* D: s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );: |, t% b( d: G7 c: f3 f7 h  V

3 z% c3 [$ S2 P2 M- K# o    /* Write a 0, so that no underrun occurs after releasing the state machine */- E' L8 G- K$ _: O3 k8 r" ?
    mcasp->regs->XBUF5 = 0;
1 ?: k7 y( H; I/ Y: a5 `    mcasp->regs->RBUF0 = 0;
# E+ n7 p4 {* ], p6 P$ o: q, C/ `! c3 Y
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 z" j: {) Y4 [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );$ k+ t( N: [; Y( u
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; + L  R  J( p& f7 Z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );# a( Q% M  t* v
! d5 k4 I4 P3 F/ X" x* ?% Q6 [$ ]' W
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 [7 p0 G2 q1 `# K, p2 ?+ O0 L    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' l& @4 Q, t' u3 _
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ n7 ^& B. a, ~( |5 V5 G    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, _! Y& N- Q1 f/ i
. s- L' `  {* N; `& b
    CSR = 0x0000;! P+ j6 |7 Y  ?8 Y$ J$ O
    INTC_INTMUX1 = 0x3d;
3 H3 ^; x# V3 \( q5 g, @8 P" k    ISTP = (unsigned int)vectors;, X2 _9 m2 Z$ v! ~! [+ b3 [
    ICR = 0xFFF0;  ! `& `2 v+ d9 I1 ]
    IER |= 0x12;  # B" Z) m. N. A: _
    CSR |= 0x01;  % `' A7 y1 x8 j% q' h* z! T; u
3 ~! l2 l) y+ I5 E
1 w) U+ c/ t* X) F" l  E3 ]# p
  p( `+ e5 l) P3 `' s
还有就是两个输入输出函数:
3 n! g7 X  O' S! }2 Lvoid output_sample(Int32 out_data)
* [) p# [4 q# A% Y; X9 t; V" x{" N7 C' W& E0 u& [
  AIC31_data.uint = out_data;  
# N! I$ {' ]7 W+ }  D& [  MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 z# c' D5 a" Z0 b- j1 c0 o}) f& T& c8 s4 N5 s% Q/ C
5 c$ ~( R; W$ K+ g
Int32 input_sample(void)
/ M- _  T3 m7 M5 l4 F! L{  
  m, G- l7 ^$ E, u+ t  AIC31_data.uint = MCASP1_RBUF0_32BIT;
: a) S( h% M* ~0 {) _  return (AIC31_data.uint);
" p4 [% p$ g" P}
: Q9 n7 g4 Y- V6 y7 U
1 m  N% X; h, c
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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