嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:- H: L( D8 p1 H0 o
main文件:& ^) h, G3 }/ m* _7 v! [
interrupt void interrupt4(void)  
- \* w. D" @; q6 ^; z{
6 J& G- b2 I8 ?7 Y0 o  Uint32 sample;
* g9 o& n1 A( C8 |/ V5 g) G; j" E& E, [: N1 H1 {& J
  sample = input_sample(); // read L + R samples from ADC
6 M8 S% C7 X0 e' R! ~  output_sample(sample);   // write L + R samples to DAC - o8 V% t* ~3 V1 }$ m
  return;
7 `% N* g1 i9 q* S( R}
7 \: k2 q  m) ?7 [6 ?$ e& t. R/ f# ~1 f6 L! I" v% [% L. B
int main( void )( ]" y  C5 D3 `  |' L
{
4 ]# c% B$ V6 e) M8 c& _: I6 c$ \( }( D; q
    /* Initialize BSL */2 k0 A' [3 I+ J6 P5 F% r
    EVMC6747_init( );
, B+ v6 y; f& x6 d+ j        /* Call evmc6747_intr function */$ k. F. z4 y( n- e" ?  S
    aic3106_init( );4 n; o8 f! l/ ^: V/ d, [* ]  m; m9 u
        while(1);
1 u, D) W2 \! C! z  v3 a! x  w}
; \4 o  j9 ?2 {/ p
$ X1 @; @8 s) M4 v0 ^# e- H5 R; y3 M0 [7 @0 d% q) Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. S3 C2 L. e8 `, C- [/* Initialize MCASP1 */
! h3 R6 s. E, B  Y/ u    mcasp = &MCASP_MODULE_1;
# }9 z+ c1 X- ~( u& X8 u    mcasp->regs->GBLCTL  = 0;       // Reset% q& e% t, e, y7 u( Y& t
    mcasp->regs->RGBLCTL = 0;       // Reset RX. B5 H+ ^1 a1 C: D+ Q- Q
    mcasp->regs->XGBLCTL = 0;       // Reset TX7 K: m) L% ]+ r9 @% }
    mcasp->regs->PWRDEMU = 1;       // Free-running5 }* }; w' y6 j/ G& [9 c' j
   // configure McASP0 receive registers
  n2 V- B% H& E9 U    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used% s4 J8 {9 N7 P6 Z* d+ q6 {0 ^
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ X  q5 {: Q& Z, x7 |4 L8 _
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word. Z. l( U, z  V& f& W0 u
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
" t2 {) K7 s+ T# i    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)  `5 t3 i7 v$ h5 R# z4 Y
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
/ r2 y( k% X4 X  |. `1 z+ ^; n+ I    mcasp->regs->RINTCTL    = 0x00000000; // Not used
) n$ G3 `, p6 f7 i5 O/ R    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ U7 S# v! J, ?6 z0 X$ h1 E& |
# e: H1 \( Y6 i  `9 u2 U2 ?
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
, ~6 R% z& d4 g# |8 k    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 I4 \  a0 ^% B' v: O$ Y
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 c' j* \( ~6 h1 J! Y, ^
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 f4 h$ H1 y, W
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
. H. o. N1 u* ~& [+ O    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
1 U* ]+ r3 j. _7 M3 `, Y% X5 G    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
; X5 @0 N" ]/ [, E: u+ [% R' V' O    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" m, K* e& w4 J
& `) d# J* P: u8 E3 R% m; i$ y% ], ]
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
" W/ D. V; F% v8 b! A4 |* P1 A    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT9 N# n% I- H/ h" z5 J
    mcasp->regs->PFUNC      = 0;          // All MCASPs
3 F" l' ~5 n; s- p8 d7 y    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1) J7 E6 Y; F1 h0 @# V) H0 |& G1 h, m$ V
, ^% `( V& T# b% d; `: z9 Z, A
    mcasp->regs->DITCTL     = 0x00000000; // Not used( i+ E; c$ ?' \: V4 ^6 I
    mcasp->regs->DLBCTL     = 0x00000000; // Not used' g2 z- S% Y" l
    mcasp->regs->AMUTE      = 0x00000000; // Not used
8 C3 |) F4 d7 F$ R1 ?2 _; D& l8 G1 E
7 p) y5 ~: K* n5 a/* Starting sections of the McASP*/" Z& E! f2 T$ O
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( T# ^0 V- X' v  e6 O    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  0 g  ^+ s4 N+ M" d
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & G3 Q. V5 D9 E$ T3 t
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );1 E+ g5 c% p& d: q6 K7 d' d
3 j* T+ F+ a% x& ?( H. [6 ^
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 0 l+ N: V5 [; j
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ U  I% Z0 j( |; v# o; `; N0 C
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 3 d  r/ \; S. r9 P3 U2 Q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
% d. D: u* X. l- u* y( O& ?) U- h8 D& R1 K* d  {! W
    mcasp->regs->XSTAT = 0x0000ffff; * |& T; L: o) `6 q" {
    mcasp->regs->RSTAT = 0x0000ffff; & \4 ~4 ^0 T* ~: F
) G( E& e0 M8 a  x
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' b8 x- x2 {: x% ^$ u+ E( U    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );  t6 H, E' i% |
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. C% l5 J. k. b( D% i' c    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 I* n" k0 T+ j# ~3 U, a2 i) ]
6 e) e  z* W; M- k! y1 D; F, g    /* Write a 0, so that no underrun occurs after releasing the state machine */4 z# y7 Z( P) P* K& ~
    mcasp->regs->XBUF5 = 0;  I# T( z* A- v0 E( E
    mcasp->regs->RBUF0 = 0;
6 p3 ^0 {! t8 h( f: `; v% T# z! A2 q/ [* m
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 7 q5 p3 M  H; Q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 V5 `* W( |- _& \" ]# s+ T    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' s- F  T5 A' h+ }) V9 i3 _0 U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );4 ^7 u% r6 Q. _2 _+ |

' n+ k$ W" G: A6 f    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , r) r# H7 P9 d$ {' M( T
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ M0 ?( }, n3 _    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( ^/ h- S4 O1 m& I- K6 C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );9 R2 a" D/ p2 R$ Z* z3 [! P- d

) s" f! f. L4 S  w! @/ K    CSR = 0x0000;
5 s9 m7 V5 N; F5 P$ E    INTC_INTMUX1 = 0x3d;
' R; L4 r! t- f& L3 Y4 l6 H% L5 d0 U1 ?    ISTP = (unsigned int)vectors;
' k: q: h* r7 [: D    ICR = 0xFFF0;  % z! q5 o) {3 @7 a& H
    IER |= 0x12;  
# ]- j, _4 Q2 j/ @    CSR |= 0x01;  
1 n' [8 u) a. t2 J# `$ ~6 l, c% ?& |% y
0 S1 ?, r* p' z* s
) f) B9 ?: g, q/ Y+ b
还有就是两个输入输出函数:- i& y1 z# _: G2 ]$ N
void output_sample(Int32 out_data)& y. P. t2 G1 ~# D( \! L. E
{
  Z& F( Y  Q! }( K  AIC31_data.uint = out_data;  
% E) ]2 `8 t/ L# B9 o8 C9 B  MCASP1_XBUF5_32BIT = AIC31_data.uint;- ^4 j# A! ]* `# x
}
1 j* k4 q) c  o6 K3 H. c+ w8 K9 i' j6 g8 ]
Int32 input_sample(void)
/ O6 z, O2 M  q  ]( U- b{  
( }' @0 t9 K: `0 G  AIC31_data.uint = MCASP1_RBUF0_32BIT;# V+ e3 u+ Q; x9 x
  return (AIC31_data.uint);3 ?, _% ~3 o& @, P$ f2 b2 N7 p
}
! u  d; w( x/ W9 F) j8 r% O% B* R; K' w% A" `  U+ g  v0 d

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




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