嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:' G6 f) T! @: x6 ~( q, j
main文件:( W2 U! Y# ?0 d! J
interrupt void interrupt4(void)  % n/ ]" ~3 v( A. K8 {, m) C
{
5 F5 }' z4 U+ c% z5 I  Uint32 sample;
, d" i! r. T: e- W3 [, e3 Q4 ?; N% j5 G
  sample = input_sample(); // read L + R samples from ADC, D" a  \. U) k9 F1 @
  output_sample(sample);   // write L + R samples to DAC
0 ]* c7 I9 K3 K# e" c3 \, g  return;
% ^$ s. X8 _$ H8 h1 W! `0 R}
' ^6 W6 J1 j8 ~8 S5 W1 ~3 S9 a) k* k2 U* G
int main( void )8 v# k7 Y3 B, D- N* S4 {0 p
{0 _$ x7 ?3 ^, W$ b' n* N* ?  e

2 o$ C( U, z$ H& B    /* Initialize BSL */
% [! ~& @% V* }# ^  e4 L    EVMC6747_init( );6 s9 x$ n+ v3 m& x, l
        /* Call evmc6747_intr function */
4 k+ P8 i, X* i1 J0 z    aic3106_init( );8 G" O0 d3 V( X
        while(1);/ b( B6 x5 w5 Z
}
2 b; Q1 ?+ B7 S( q- H  `  E
9 a! s* o; }' v' Q9 W6 {2 @& c2 o- G) A# m) ~# \
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 D& a9 E2 q/ H" W3 R/ _4 |
/* Initialize MCASP1 */
2 W# r' y+ d1 X5 W0 Z' i# z1 {    mcasp = &MCASP_MODULE_1;9 o9 v5 W& t6 E9 R) D" L
    mcasp->regs->GBLCTL  = 0;       // Reset+ V" P7 H5 C1 p' r& s
    mcasp->regs->RGBLCTL = 0;       // Reset RX4 A! b: @8 B& g; }& u
    mcasp->regs->XGBLCTL = 0;       // Reset TX
* U! O) e0 S; l9 g/ ?# ^1 h0 Q    mcasp->regs->PWRDEMU = 1;       // Free-running! H( M8 W' {% k/ x7 q2 J0 {
   // configure McASP0 receive registers
. |& y6 _" f  M( k3 C    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
1 ]; _4 @) d, @' _    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' @( \2 P# v. w( U$ M, p( w$ W) Z    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
! i/ I- m. r  I  E' S/ e1 [    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 |+ `$ R4 v5 K& h, N
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)  L& k0 `5 i5 e7 {. ^3 f
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
7 {: b( {/ J, j7 b& U$ W    mcasp->regs->RINTCTL    = 0x00000000; // Not used
, a% [$ ?" _- }" M0 t0 l1 ]  L    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 m' \1 U" R; H

2 ~& Z" ^" p2 l    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
# D9 ?" P% g7 M, H    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus+ u: V9 l) X, T! x* X
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- g* l9 t- {3 ]3 B, D, a, N    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 [. ]" ?" k5 b, J3 d+ D  s    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK1 o( k8 V3 k' l4 B# T, n1 U
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,10 H2 ?3 T; q7 j" U+ e
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
9 V' M- m: G* ^/ K, W6 b% j    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 y2 I) G4 J+ k' Y  D* ?" p
8 E" t4 g5 K+ _# ?/ O( ]
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN) Y/ w/ {1 m/ j' h) B" P0 v5 \
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT- w. B$ h. U7 g2 w# Z# k6 F) Y. Y
    mcasp->regs->PFUNC      = 0;          // All MCASPs1 n; a' X; u$ B0 L+ ^" y7 V7 w6 ]  }
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 X4 O; m! U5 T( V9 H& u! n8 v- [! i) [: m0 o" F
    mcasp->regs->DITCTL     = 0x00000000; // Not used4 r( v$ |$ p7 y- G
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
! a5 K( G9 l. `% D    mcasp->regs->AMUTE      = 0x00000000; // Not used0 p$ n: _+ W& Y' W
9 d( r0 [' \# `  W# q: c$ _! A
/* Starting sections of the McASP*/
! j1 y& Y" w7 ~" ^) v3 e9 J: E# a    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ d& `, w0 p# H    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
6 F  F5 a: R0 z7 V# e+ {    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 p4 e$ C# B7 p: U, m/ p- [    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! S/ u, y  `5 b. q6 l  P' `1 ?! o
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( B2 l0 U. G: I( K) p    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" Z. b6 b7 ~( h; L+ g# z6 W    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ A% O# t# L9 ]' P/ L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* }# \. @" I! ?7 f* ]) F
5 s9 m' M; V, @& {. }; H- i3 W; B    mcasp->regs->XSTAT = 0x0000ffff; ) P$ ?8 v: A1 W, }. X3 T
    mcasp->regs->RSTAT = 0x0000ffff; # |3 |) e: d- I2 n

! P5 ]0 q! i; E1 t, E$ q    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;1 {2 f& j3 x* [- r* v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 i% o% w) c& M/ W# L
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; # {3 T% Z' o1 q5 L# _% C! I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ m# h; ^* S2 |" h, ^4 P
0 K* T8 }% s  `8 _1 |
    /* Write a 0, so that no underrun occurs after releasing the state machine */: @& Q# ^  n. ~  @* ]+ Y% }
    mcasp->regs->XBUF5 = 0;
2 \6 D2 e! Z3 Z' P" v2 A    mcasp->regs->RBUF0 = 0;1 Z4 r( H2 Z7 O! `4 d
: F) q7 B4 m; ]3 O5 K2 \8 O9 U* |) ?
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; & ]! B" j+ Z3 e6 J- g6 n0 L/ g" c
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );  M! \: Y0 {0 Z
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 @; R7 T, U: L1 ]& g# k' R$ c9 `5 `7 w    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 d6 v- t; X$ z; N6 `( W
( N3 T3 R1 F6 D0 M) D    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 u- z* V0 @  d, ~) P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ @& L  ~; R7 u7 h  U8 k    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 m) r' j8 x* z- F  s' ^- m! b    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* |" [6 b- f/ \5 F
6 L; j: k% ]4 ?; m1 o2 z    CSR = 0x0000;/ X7 [9 u7 S. W, v8 P
    INTC_INTMUX1 = 0x3d;( ]8 h* o8 }/ y/ O
    ISTP = (unsigned int)vectors;
! {* K  t. r0 `2 Q/ g# P    ICR = 0xFFF0;  
3 ?( b% j& F! Z8 m6 p    IER |= 0x12;  
4 h. i+ F$ Q: l% ]8 n    CSR |= 0x01;  
8 J7 Z0 x7 g9 @2 g9 `: U1 k+ ?# T; ]# Z
. X0 E( a, k6 q" V9 w# z9 [4 l

6 S) e0 A6 x0 ?还有就是两个输入输出函数:. V/ S* n2 p! _
void output_sample(Int32 out_data)
# l& F: |+ t; u{0 T% b( m9 ?- D5 K  @: i  V
  AIC31_data.uint = out_data;  ; [6 P% z* X9 U% O
  MCASP1_XBUF5_32BIT = AIC31_data.uint;# V  g# K4 W+ W% p/ z0 b1 u# L
}
  V4 p/ u% L! i( \& T, j
' {' }( p$ c* |5 R" h/ d" w: bInt32 input_sample(void)
7 G! V) m- |( C  ~4 n4 M{  
. ^7 g7 s1 s' R# }3 r7 e  AIC31_data.uint = MCASP1_RBUF0_32BIT;
; p4 g' w4 Z/ T0 i7 w  return (AIC31_data.uint);
* S9 D$ ]6 M0 z- V& q}! Z) }, ~5 q. x4 R
' I+ S5 I% y" H  A

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




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