嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:- b8 K6 T& R' F
main文件:  W% q5 ]& t9 l& W
interrupt void interrupt4(void)  ' @2 p3 t0 i+ \# y: \
{
/ B' G) X# O: e& u5 V$ ~  Uint32 sample;5 T- j. [) X& E# o- g' [
0 X7 l! P( i$ g# n  U; v- l
  sample = input_sample(); // read L + R samples from ADC* g0 ?: B, S+ p8 a3 i
  output_sample(sample);   // write L + R samples to DAC 2 f3 S. |- y/ X3 e- G3 n- V" ]
  return;
, c( k+ H3 V  I: o: K# a3 r}2 M4 k' H2 G, g

& |+ h6 k' F4 A" b/ W0 W2 ~int main( void )
" R3 i0 q9 Y1 m+ X* O# b7 T* g/ l& i{5 l; a8 [- @; q0 Y
" t5 o6 U, M0 m
    /* Initialize BSL */; m: v2 [2 S. y3 X
    EVMC6747_init( );
( i9 a/ ^5 A/ g" N* e" y7 B        /* Call evmc6747_intr function */+ P! o6 c" M$ E8 U2 c3 d, g/ P0 N4 @
    aic3106_init( );
+ q' g' E) q9 d' O        while(1);
  u! e( r7 q6 W  B: @}
, v  K/ k3 ^) W& F& B3 `3 J
5 f# u# L! V7 U/ i; c( ?1 N) w
* z$ L. x# B* o2 t) f! J5 ?aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ I0 M4 k7 _$ O* I6 {/* Initialize MCASP1 */6 |  |) U, O& e; V
    mcasp = &MCASP_MODULE_1;8 n' S. g% M( S/ {/ Q
    mcasp->regs->GBLCTL  = 0;       // Reset, e4 o5 @; v$ u+ i) M. y* a4 K
    mcasp->regs->RGBLCTL = 0;       // Reset RX
9 L5 N) y" |6 `4 N7 @    mcasp->regs->XGBLCTL = 0;       // Reset TX- r5 G- H4 o) ?' J2 i, W/ B' U
    mcasp->regs->PWRDEMU = 1;       // Free-running
7 L8 E' W; C8 ]  T  D; I   // configure McASP0 receive registers
7 [  T6 ]% i* g" w/ |. I" _    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used, a( v- E$ n0 C' M+ E
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ L5 v; f* R) @# e7 M" t    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
4 [' [: b6 Z, d3 X+ r+ \    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)) F3 i( [, K- d) E- z6 c
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side); W: u5 S1 l, u
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
3 [. y. u' a" z6 Y) q8 a) t2 w( J    mcasp->regs->RINTCTL    = 0x00000000; // Not used
( z! R7 Y9 C) A    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 b, n& ], K3 B# Z/ o
7 c# a* `: o3 A    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used# Q0 h' H/ p0 M2 \9 b; n5 v/ _
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; X+ p" |" i0 s/ F( I4 f; S    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 H: A+ O; x& {0 I2 V    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' H9 [- j+ b/ l1 f# S    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
/ ~) Q# s# n7 u: n6 q- E    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
) X* I9 X! }, ]    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
+ z" {4 k2 Y4 Z0 R    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; s; S. l( P) r; t: z2 P6 t4 d9 P/ z# d2 I- a9 T0 P& x
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN1 }) W, H3 q( U# s3 p' n
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
8 J' {* \9 T  z9 P, Z3 Q    mcasp->regs->PFUNC      = 0;          // All MCASPs( J- @3 k8 h& U
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1- @. a+ w9 G8 [6 V! ^6 M- r

1 A2 y* U5 }1 @6 o' B( p    mcasp->regs->DITCTL     = 0x00000000; // Not used
1 {& ~2 A0 v7 q% y) f/ k* D5 i* y    mcasp->regs->DLBCTL     = 0x00000000; // Not used. H+ \2 M0 |) C* f
    mcasp->regs->AMUTE      = 0x00000000; // Not used: L& H+ |# H. S4 \& y7 ~
  O: e9 `  w) t& F
/* Starting sections of the McASP*/+ e3 b5 `6 O# v1 M. A- B
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
  q- F4 T( W# L* e3 x3 K! F2 |    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
- _6 X& y( t" o- z    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 3 g: Z% B3 ~) g; E- Q. `- C" |
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );& k& ?: f9 x& p* y! H1 q8 P
' D% ~( F) _( c$ D4 X: S# W
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. b4 ]! a$ C$ `" o' }4 s0 w    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" V% }+ a8 @6 e    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 J- R  G" F, `6 A0 R1 b
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& z' a0 x) p( M7 ~- p
- d6 V" u7 {! `2 `& x( @" w    mcasp->regs->XSTAT = 0x0000ffff; # \' Z8 R/ |5 E* P
    mcasp->regs->RSTAT = 0x0000ffff; 9 `- r# z- b1 F& P7 x

  _0 S" }) p6 n2 C) \    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. t* w' I- ^$ Y/ x3 J7 i. _
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );2 n9 V* o  z+ w2 L9 e
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ) \! I  z  l/ ]' C# I. b9 P9 R
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 p/ Q" a/ H6 y7 E' L

6 i& n, c6 T# C" l1 i    /* Write a 0, so that no underrun occurs after releasing the state machine */; @+ i! y1 i# q/ F( z' R2 I) S
    mcasp->regs->XBUF5 = 0;
4 e) p) `) y& s    mcasp->regs->RBUF0 = 0;: v' l1 F. r9 ~* F2 C
9 [) `% h& j; r; d
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! X+ \& ]: c+ s3 h    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );: y  ]0 q0 [  l2 \( o! \1 y
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 Z/ q; R+ @( g& N8 x7 `    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# z# H! T, x2 s  ?  x' `( P8 j# {2 x  L2 x
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; / W- O4 K' _8 X& n7 ?$ g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 k( o" T% x+ S5 ?
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' |1 g7 b. Z+ E9 h    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );3 Y8 z* B" [, E2 K; N
  ?' w5 z& s+ Y1 \; x. P+ k, s. B5 g/ D
    CSR = 0x0000;: h- E; d4 ~% `2 M/ k% J
    INTC_INTMUX1 = 0x3d;' K8 A' m3 c9 q5 y
    ISTP = (unsigned int)vectors;
& d7 F3 \& s2 A5 V8 l0 O0 ^    ICR = 0xFFF0;  
! z' T, ?: A5 I    IER |= 0x12;  # w+ l3 s8 Z% W5 R# \+ }
    CSR |= 0x01;  
: H) M( S" A" G9 |( I" f
2 M8 }9 H; d( h' V0 m* n$ a1 b: l6 z

5 {& P0 d( u# o! R还有就是两个输入输出函数:/ d( V7 J$ k: K: _3 i
void output_sample(Int32 out_data)
) ]. q1 I  \2 `0 G# b) @% U{
8 L3 I2 p( T8 n2 e$ p7 R5 O  AIC31_data.uint = out_data;  / l, |. p; p  i. G4 S* \/ f+ a" k
  MCASP1_XBUF5_32BIT = AIC31_data.uint;+ ]# x& d6 S. G2 J6 s# d9 _, ?
}, @% S3 x" V6 e7 V$ `
% |. c: b8 r  ?2 U3 F+ s6 O
Int32 input_sample(void)0 G5 Z; x, Q8 R; K; M7 q  y
{  % N! u+ r' c% J( J9 U* H. V0 d
  AIC31_data.uint = MCASP1_RBUF0_32BIT;# x8 K2 h) L/ q9 m7 I" ^+ j# |4 h: G2 L
  return (AIC31_data.uint);
& Q) `. D# ?, E4 z7 O8 M4 Y}& x/ s) `% l% i2 U# G4 m
! N% }+ x1 P7 u, U

作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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