嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:8 a+ B1 _1 D, }4 Q8 n
main文件:  |- t7 j7 ~# i" H
interrupt void interrupt4(void)  
# J+ @* x; r/ _" @3 @5 O+ _. V{
" `- W4 u6 V+ P; F- U( n. B- k  Uint32 sample;6 O" a! x  J1 L3 h6 t: W* F
% A( c& Z# N8 H/ P! C1 M) e; t/ u
  sample = input_sample(); // read L + R samples from ADC, ^  G- L6 a1 v9 L
  output_sample(sample);   // write L + R samples to DAC ( i' _3 C& Q2 F4 @9 p
  return;
0 N' S4 z" s7 t$ j}
2 c3 P( o( `# I( p& ~* X; Q
4 V7 T# ?$ B. O. W, dint main( void )
# `; h# R1 j- p1 r' A. `; [3 f{
- M0 Y* h2 z7 Z1 c8 h, Z8 q9 c' ]5 K4 S$ ]- R, ]
    /* Initialize BSL */9 I" D3 q. j. V
    EVMC6747_init( );
* E2 ^8 {+ V, p) ~, N2 R1 W$ H  o        /* Call evmc6747_intr function */5 p- d& P' L$ O* v
    aic3106_init( );: [: i" u# H5 s3 b
        while(1);
$ [! V" v% b3 b; v}
7 A/ n% G5 S0 I( o/ u+ M  `! Q5 B' n: X0 l) W' U; y' M
( x; ~1 I6 _/ C$ P. o
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ T1 y1 J$ [/ T0 i- t/* Initialize MCASP1 */
! ~: k* [! N# Q" }    mcasp = &MCASP_MODULE_1;
, N4 y2 h( _1 `9 K( V$ z) ]+ k    mcasp->regs->GBLCTL  = 0;       // Reset
0 ~% ~& K9 w/ t    mcasp->regs->RGBLCTL = 0;       // Reset RX
% g; I  \3 b0 h1 R6 ^( ^    mcasp->regs->XGBLCTL = 0;       // Reset TX
9 R' @- @$ D# U    mcasp->regs->PWRDEMU = 1;       // Free-running) n' |* g1 X5 d$ u; z, Y' `
   // configure McASP0 receive registers
5 s+ w% T- ~+ X1 n) s4 u) `    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used4 q1 Q$ y5 M! a" I5 T3 x; w4 Y
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; y, I" I: L  L' H3 b. Y8 x( t
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, W8 M4 S" A" n! N& s0 X    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# S" P& N! X# O/ P8 \: N9 F& Y3 T- W/ z* F. h    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)2 c8 \2 P' V( _
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
7 P1 O) e6 e& r4 `, X8 ]  p    mcasp->regs->RINTCTL    = 0x00000000; // Not used
0 {3 p; `( c8 ~+ D, X    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; J, M2 K# Z2 Q" ?
" {- \. J# l( R# B9 J. G
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used+ M* O5 n9 _0 Y2 u9 {/ b7 ~1 l3 V
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus  w9 P, ]2 `* y( k! c: L/ u$ x  X
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 b) {' [3 f: X    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-167 m0 k* f9 R& M" y: T6 g
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
, U, e% M9 L6 X- U$ @; X( D    mcasp->regs->XTDM       = 0x00000003; // Slots 0,10 d  f) a( [0 o0 t2 O2 @6 C
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
; B# |5 K. u1 ]: X0 f, s0 z3 [    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# k2 D. D& Z+ Y! Y  }- Q+ ^: U/ V

! Z& g4 h+ K/ V& V, {" U! |    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN1 {# q7 l+ j5 `# C8 ~
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT% ^+ |/ ?, @% A
    mcasp->regs->PFUNC      = 0;          // All MCASPs5 p; \3 l* K7 V' [
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
% T2 M, ~8 a& x; w; _# [5 n7 G+ D8 o, i7 k+ ]
    mcasp->regs->DITCTL     = 0x00000000; // Not used
8 T  g3 G7 s1 C& ~( l    mcasp->regs->DLBCTL     = 0x00000000; // Not used3 U) R* x! L. B- w
    mcasp->regs->AMUTE      = 0x00000000; // Not used  T8 ?0 V/ y1 j1 S; s# |

/ y% @' W* N) Q7 X7 v" b/* Starting sections of the McASP*/0 e' P) ^  @3 z. g- W% l  z4 C
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;   ^$ e2 b7 @9 G- `
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  : \  @. a3 L7 e% a/ ]2 |4 P5 O
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 s3 A! W) {+ C2 r0 O    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! x# `& ?3 ~2 A) j. w+ Y6 |: V& O1 Y% r- ^8 K
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* \$ M; y) C0 I! v! e" @    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- I/ S8 j' M4 z    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
0 V4 h9 f" q4 Q5 C! c4 p# e& o+ P    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* X2 Q4 M# r+ I' B# Z, k3 x- \2 U* J& j9 |3 [3 b1 Z
    mcasp->regs->XSTAT = 0x0000ffff;
$ \5 i" g4 j0 u( h    mcasp->regs->RSTAT = 0x0000ffff; & O. J& d% ^4 I9 L! X. P

) d/ U$ B( _  K    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 h4 A9 L9 I# D. I! I! h* t    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& [  T( ~8 u& ?* X/ H    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, i: [5 C# ~$ ~; |) b0 \" b3 U' U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ v" E/ f9 B/ }5 w$ L& v7 R
) q. u& r* i2 [1 ~, Q" y
    /* Write a 0, so that no underrun occurs after releasing the state machine */9 P0 o5 u) ]  j% E
    mcasp->regs->XBUF5 = 0;) ^& X( y7 l6 U& c
    mcasp->regs->RBUF0 = 0;
" _# [* f8 ]0 @3 X, d9 \
9 Q, s# ?( |$ b0 t    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, D! `1 d% Q7 I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 O0 H2 d  Y& ~+ R) m7 c* i    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ N6 A4 I$ f, D6 c2 i, y. q" x    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );0 B4 a) k# ]1 ?# h* O+ N
/ C0 B4 Y  c. V3 i- Z
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ z" J$ D" X" k+ D3 Y, a/ y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );3 s; r/ f1 e5 \' P% p
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 5 i0 K' B& N' y& t& L
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 H, p( k) R& r8 @9 S  x" o
; _5 W6 M9 X& |9 _    CSR = 0x0000;7 V/ x& m& n# Y( Q% p: `
    INTC_INTMUX1 = 0x3d;* i- {6 [/ c; Y# A
    ISTP = (unsigned int)vectors;6 i1 P+ ?+ }- ^* d0 v! x* B
    ICR = 0xFFF0;  ; t. c- d6 k  s0 x# o7 ^0 F
    IER |= 0x12;  
. M  {  ]4 M2 [; G0 ~    CSR |= 0x01;  
1 f/ r7 S" ^. m2 V7 ^! j4 V2 m8 E) S# b+ v: W1 s0 X3 Z( \
6 [, z, i! m; U* ]

$ s  W: t5 M5 m% m$ f! Q! P6 k6 e还有就是两个输入输出函数:
6 j$ B! u! m# _0 F: J% U# [8 Yvoid output_sample(Int32 out_data)
+ k: V" C" M7 D0 g: r: B4 d. U- o{
3 B* x+ U* l6 g7 S7 C6 k  AIC31_data.uint = out_data;  ! H4 Q% O6 X/ P) a2 q" o; u
  MCASP1_XBUF5_32BIT = AIC31_data.uint;7 Y- Y9 L0 D+ n4 K% R
}! r5 G: H8 `6 E) q" Q

6 g6 v0 G' y& D0 j( xInt32 input_sample(void)$ J% }( E# l( s2 \7 v% n9 t& e* l
{  
7 k& [7 F7 m+ M1 t+ B$ ]8 C" `& h0 C  AIC31_data.uint = MCASP1_RBUF0_32BIT;8 F. i4 c2 W% E2 b9 G7 d
  return (AIC31_data.uint);
/ c5 T/ l6 k6 Z" z+ |& B+ A, L* Z}5 ]3 F, H$ m# m9 M5 w0 J
! {( A/ Q0 @" |0 ~6 ~9 q

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




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