嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# _# Z2 z) D  i. w
main文件:
' M! H0 `8 P4 ^. L  e* o" V  {interrupt void interrupt4(void)  
3 Z, {( W- Q$ F6 |8 M! V: W( y  P4 l$ ~{$ V: h2 r6 R( c6 D# @" U4 o6 N
  Uint32 sample;
( P& ]1 f. J# e$ j+ B+ r" g. o7 J1 E1 u) }
  sample = input_sample(); // read L + R samples from ADC. H3 r5 Z  h0 j
  output_sample(sample);   // write L + R samples to DAC 1 w$ q0 W& j" l- X3 ]
  return;( |5 M: |* y% e1 j
}* C6 e. J0 D2 o3 L; S" T8 }

/ h( h* [& ~' }/ s/ B) D* ]int main( void )0 i; @5 R4 ?4 j7 `
{
* O% ^4 i+ @- o2 u9 a: b4 t4 \1 t+ y' y% b0 P/ K5 G# p7 j8 C- Q  g3 T
    /* Initialize BSL */
, z0 n7 C& m2 ^& i, i    EVMC6747_init( );
6 r+ R' D0 c) R6 K( m        /* Call evmc6747_intr function */. g' X5 m" O, o
    aic3106_init( );
' [  z" L: Z) e: _7 ~        while(1);
& {% I) H+ a9 x: W& L  j}/ m. _* x/ e6 n/ p- S

; _" _  f3 p- W5 G% [: s$ x
' r% B# ~7 |% ]' zaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题; N3 a5 Q: U7 a% h: f/ N
/* Initialize MCASP1 */
0 a! g/ p; \% b# J6 ~    mcasp = &MCASP_MODULE_1;
' g/ N1 |! C% ?( n: e% E0 R; a    mcasp->regs->GBLCTL  = 0;       // Reset+ ~8 A) A* s! n" Q# i0 n
    mcasp->regs->RGBLCTL = 0;       // Reset RX+ S/ n1 `% X" G/ Z7 R
    mcasp->regs->XGBLCTL = 0;       // Reset TX
6 h& M+ x+ q8 L& l+ f  j    mcasp->regs->PWRDEMU = 1;       // Free-running- [  @. j0 ]; ?/ A3 A. |3 \
   // configure McASP0 receive registers
5 u5 k0 F7 d" D6 K7 e    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
" L4 i, }* L2 P/ V    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) o  R% t' J/ F7 Q2 ]! B* Y9 @0 q, l
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word  N9 ^) N! M' u8 L! s- G
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 a, a9 K' x" l  o. `2 R
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)7 A! p" z/ ]" }& W
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
/ s* e6 z7 S% ]& R" d    mcasp->regs->RINTCTL    = 0x00000000; // Not used' ^7 z# b) g5 ~* D  O) f8 N. E
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 C) b: A5 Z0 ?: P
* d# B2 M  O1 E( ^9 R5 a
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used9 P; |9 l, U. B* g# }! g3 U
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! y/ A3 Q1 J0 I! o9 }. u    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 x  ^3 h6 k* u! l4 y& A9 J: d
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16; X4 [( u" b. s3 P, {; u9 h
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK: g4 A, x$ o6 `0 z/ L8 Y& N& G
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
/ k9 p1 n! M$ `' m/ Y+ x7 [    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
: I9 _8 N5 F6 H- ^8 J' n2 K' {2 S    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 k4 M4 F1 s) A0 V% p
$ {' Y# Q4 G* _: J" I9 E% Z    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
. D) S5 I% e0 U! S; ~; d* w8 g8 K    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT3 [5 b$ {$ m/ w1 F
    mcasp->regs->PFUNC      = 0;          // All MCASPs# ^' I4 @' D! w( B, H( K+ x
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: o* H( a9 M) t& |: r7 E& m* B
* r3 R2 o, L3 c2 A9 q  j. a
    mcasp->regs->DITCTL     = 0x00000000; // Not used1 d9 N% u/ \" h4 f, |
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
: [# ]. I5 }0 A9 L, ]2 w. f    mcasp->regs->AMUTE      = 0x00000000; // Not used6 {) n4 r, r8 O. h) _& d: I

! L* c7 V- `2 n5 a7 j- h' S0 k& I/* Starting sections of the McASP*/0 R8 S- y* Z7 t! x( S
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;   B/ Q! d# E* D7 T" C. Y9 c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
. t# a, m! T$ k    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 3 i( j+ M. e1 [8 y1 d3 F$ G
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ O3 k: n# u/ Q; ]0 {, t
1 f% E( ?4 h" M1 ]/ y9 i7 R    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; i* W  T* g, Q- x$ y. @    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );# I) V- H3 V" L1 h/ H+ G+ u
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% r; F( E8 |# a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 A3 m7 v1 J: Y! _
6 R7 X2 E! h# y, g  i0 C1 R    mcasp->regs->XSTAT = 0x0000ffff;
+ L$ D8 x2 X, e, B/ ~8 L" j    mcasp->regs->RSTAT = 0x0000ffff; / n; [) R& d6 E9 D% U
8 W7 H! J+ m2 H  V4 `
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ b+ ^% s6 T, J  N8 p5 |& l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );* q( v7 L5 [3 z
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; : [; F4 T) P, }1 r) b) m, L
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
. I9 K* X, R+ m( c  C6 j+ G$ N, r" w5 ~* k5 B$ z+ [/ J
    /* Write a 0, so that no underrun occurs after releasing the state machine */
& E1 Z' }1 t) r& W3 X' M+ v+ k    mcasp->regs->XBUF5 = 0;
$ {6 A: q$ N* A" f; u% k1 i7 C    mcasp->regs->RBUF0 = 0;3 z/ f/ f% p2 N; G7 e

, A) s' U8 l& f: t    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / P7 u2 m% A$ ?: r% @* b& V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# Q8 e1 I7 s4 Z  g    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) S; t$ k& a) I, O' [" A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% L1 |# v8 K; j5 }8 Q* P. Y, O8 ?; m/ h8 n% t8 Y# L
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
6 W7 D/ N8 Z" H# z9 V    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );4 p/ m  x2 b: a: Q! d% ]
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) f6 t; l: M: t; D- l0 H+ g. W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );0 q9 {, d0 |" g7 H* _/ E' }1 C2 d, T. O
. G  d7 z+ k: r* d: l
    CSR = 0x0000;
& Y; ]1 Z, U# e, r    INTC_INTMUX1 = 0x3d;
' I2 }( b+ j$ \* Q- q' I    ISTP = (unsigned int)vectors;
" a7 |2 j0 d* q    ICR = 0xFFF0;  $ C8 Y2 c4 h( Z& ?" M: }
    IER |= 0x12;    A: `. k) A4 k1 }, O; e+ ]
    CSR |= 0x01;  0 {5 t+ V' {6 ]1 s- {
9 F" I* d, o  ?0 k
8 u7 s) X# W- h6 E
5 N+ G. P" O2 A- Q( V# r  d
还有就是两个输入输出函数:( k7 i/ j+ s* I5 G. o/ A# O
void output_sample(Int32 out_data)* d7 M5 [3 f" M, W  G
{& y  a/ ~0 {( v/ m! W$ A8 F
  AIC31_data.uint = out_data;  3 ~/ M9 V. Z/ ?* b
  MCASP1_XBUF5_32BIT = AIC31_data.uint;7 p% o" l; C( A8 V& \& z' |: w
}/ U$ M5 F2 H( |1 }3 C# b
7 ~; X8 u/ T, s
Int32 input_sample(void)
, \$ _6 t7 q6 {- L' R{  * u4 l7 Y4 P+ B1 x6 A
  AIC31_data.uint = MCASP1_RBUF0_32BIT;* R! K1 Q+ B3 r2 D6 n5 {8 U9 K
  return (AIC31_data.uint);# k0 P2 P4 e- n0 a7 {
}
1 Q1 v  p0 c4 H9 H. `$ e5 C
' w4 r! S; b+ n% k6 G! c
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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