嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 h" e2 r) r4 N- bmain文件:. O' {1 D6 a- o
interrupt void interrupt4(void)  
/ r5 S; Q" R' M- j{
0 Z$ x- s6 m/ }0 k" l) U" L  Uint32 sample;
" v4 Z6 s* `6 Q/ F3 M
# {; w( U6 s/ }) I+ w1 z1 B. x# ]6 E  sample = input_sample(); // read L + R samples from ADC
: @. [) I, q5 Q6 M% W6 C0 K7 _  I  output_sample(sample);   // write L + R samples to DAC 0 _' x: q3 I; \7 U3 B3 n
  return;! }- c, g, f& |. y3 U* C" t
}
/ I& e4 s* ^& ?
, |- x# Q: ?4 ]% Q  A1 A5 pint main( void )- K  o& x9 c9 }8 e: `6 u
{
4 T( T) r4 x0 f7 {, J- I* r6 l" b8 E) {  l
    /* Initialize BSL */
/ T% Z8 S: M" `0 |) D    EVMC6747_init( );( F4 i- k5 H; X1 Y6 _( N. _% a
        /* Call evmc6747_intr function */
' z6 x4 W6 ]9 N1 c- j. \    aic3106_init( );8 }. l; m3 |+ w9 F, c$ K5 `
        while(1);
( l1 ^' k: |5 O; @; C  _}
- t0 O( V- Z' F$ O; J' R6 n1 b
( r) p3 Z% Q. @) _; I3 s: t$ x4 o& f1 Y: z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- g! U1 y9 J, u8 l! c$ n$ ^/* Initialize MCASP1 */6 f3 u0 x- j" y- H
    mcasp = &MCASP_MODULE_1;6 k2 i) X: |5 {- ^( B) h" \. @. L7 m# a4 [
    mcasp->regs->GBLCTL  = 0;       // Reset
5 \7 G* x7 ^9 \    mcasp->regs->RGBLCTL = 0;       // Reset RX9 J5 a/ F6 G$ x" y: q# K  M; x
    mcasp->regs->XGBLCTL = 0;       // Reset TX
' j: v$ c. {$ N! q    mcasp->regs->PWRDEMU = 1;       // Free-running6 Z4 n2 I/ ^* {' n2 S
   // configure McASP0 receive registers1 W  @- n. Z" |9 Z) S
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
/ _+ u2 o2 K: ?1 i% M    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 v! Z! v" g' ~( D    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
- r/ s, p) [' A    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)1 @0 U$ p: m. F7 f7 s) G
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)  `; C9 l, v: }5 @4 s) H" P4 l0 u
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
) R" k: t: o% B, o8 h    mcasp->regs->RINTCTL    = 0x00000000; // Not used) B  z  {0 J  n2 y2 F
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* N, d' I5 {! E2 ^3 W! {0 F* z( y6 t

) B: r; G  J" O+ b* s$ _5 K3 `    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used( R+ Q) Z3 @. m! S
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( e& j, w+ }9 c3 e* g" T    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word2 k' j7 T3 |" W: Z/ E/ s0 f
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 H  T7 Q1 N# J  [
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK0 y- \: S9 W" C2 {  A
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,16 j, q" s7 O: F) j7 }5 H* g7 [9 A
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
9 R5 ]; e) s3 a" d    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' H- a2 D* T0 r, c/ r
' S/ _1 F/ |5 B
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
3 F1 I* O7 P" S) ?1 v    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT$ ^1 u4 b8 W7 o( e7 l
    mcasp->regs->PFUNC      = 0;          // All MCASPs$ Q& ~. z: }  `! z; Z  v/ B
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ F2 ?# S) X; a7 l; F3 W2 w+ o8 H% d; j6 Y0 E# x- d
    mcasp->regs->DITCTL     = 0x00000000; // Not used( Y, ^1 O, y! N7 t" F2 q0 ]
    mcasp->regs->DLBCTL     = 0x00000000; // Not used( K! C- r2 l3 E- T. E% r
    mcasp->regs->AMUTE      = 0x00000000; // Not used
+ Q! i2 f$ U  d+ d: @
) ^# N3 r+ Y8 M  z: p/* Starting sections of the McASP*/- V8 R0 `. u1 `* \4 o* j: P/ d+ J! d
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 T+ P8 a& P  g9 ~% _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
+ E7 r1 X8 J1 u/ S    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : _& X- O7 k' g+ _
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
  v4 k; I0 K+ N
# C1 [: k' {8 ~) y    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 4 G5 G+ b, s* j; f& N* P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( _! X. h% o# d    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
  L. X/ P8 N$ n9 U; B, |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* O7 D0 K$ {& o
4 y/ _- r0 b  F6 E5 U& Y7 t4 b2 H    mcasp->regs->XSTAT = 0x0000ffff; 3 F& V$ t' o: {
    mcasp->regs->RSTAT = 0x0000ffff; - \5 a( n- G% X7 b, v, n4 n* {
- c+ L9 [  K/ c0 d7 o
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;* a/ M5 F! i/ |8 Q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 L! r( V; w8 a: o6 V    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' Y$ ?* l6 t) D) H2 Z8 T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 S8 Z: X$ R. s- W4 T8 I
- N7 Y2 e: k" M. ~5 ?$ L6 ?3 B& @
    /* Write a 0, so that no underrun occurs after releasing the state machine */( H; q4 _0 X9 i6 z% V
    mcasp->regs->XBUF5 = 0;
" i* _% z* v' O' Z4 P) Y# l    mcasp->regs->RBUF0 = 0;
- T- v# f2 W( Y: ?; t" ^- b
2 A& {) t4 U$ ^; ^: ]8 ~. M    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
$ H$ y% a$ a" Q$ r$ q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );) k- ^5 R- s) M& }, q( P, c: i
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 9 c' L0 f$ a# c- Q: _
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. y, y3 D. a' _2 H9 f/ _8 T4 z; h$ J$ C" X7 B, Y6 D
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' O1 `0 |$ s# s; w, B7 W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. X8 G  L6 L" H; j2 u- a# B$ |, [4 _: b    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 k7 V, N; y2 ^: ]& C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );/ O* h& Q6 G2 O% `; b; J/ \

  l" J/ d6 i0 @2 y, ^    CSR = 0x0000;
5 T- f% m) u, K$ h' Q* h, k" s    INTC_INTMUX1 = 0x3d;! v2 L; i( V8 N( |8 G: {
    ISTP = (unsigned int)vectors;5 B- o! G3 G; t) s/ z5 x
    ICR = 0xFFF0;  ! }2 n8 {7 y( X3 P
    IER |= 0x12;  
0 G/ V1 x: z3 R+ }    CSR |= 0x01;  
1 \" I; ^9 ~9 h& r, w: w; N2 ?8 |' `7 {( w( Y# E. N- k
; `5 U3 y- \  p

9 k! C# q) D4 l) B还有就是两个输入输出函数:
' E$ ?) `: f6 Y$ l# Y9 N" |, C. Jvoid output_sample(Int32 out_data); ^7 O( f2 k7 y; O
{
# Y3 `4 H4 W' j+ V  AIC31_data.uint = out_data;  0 ^7 ~8 o$ }" \. U; s  N, o
  MCASP1_XBUF5_32BIT = AIC31_data.uint;9 Y  ~, w3 z7 ?  c. A; k
}7 g  Z1 ^1 F" ^# l* I- t

# z9 t$ p! g# O/ k9 Y9 @  |* NInt32 input_sample(void)  W; D. B4 ~( `9 V
{  6 t4 ?6 L" p: S5 h; p% W3 f% J7 E
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
) E, i- ?" z- I8 |/ A! E$ e  return (AIC31_data.uint);
5 }& T2 {6 m! c. F, c; Y" D9 f( u}( {; @- d/ {) [; s4 t9 t3 a& U7 P; `

- b$ V) F8 I. T1 p8 ]  u' L$ c
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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