嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! `+ L1 H9 ]' A9 B4 |main文件:
8 A5 j4 m9 E) f* [interrupt void interrupt4(void)  
# E, ?6 G2 f% Y" S+ k{
% m: O4 V6 d. Z' @9 T  Uint32 sample;
9 O+ r4 \3 ~% a& b* e+ o& e7 H' J) L- l
  sample = input_sample(); // read L + R samples from ADC
1 P$ E4 ^4 ^' ~  output_sample(sample);   // write L + R samples to DAC 7 j$ E8 {5 X( ^- i" P6 M, {) ]
  return;8 P, w% _0 [7 Y* F
}; F2 h8 Y0 h; P+ ]8 z
! J  P; r9 A9 a/ Z  S2 k' K* f- r
int main( void )  H% z2 C1 v, F/ d" `" K# K* i
{6 j3 P8 p6 q' N) {5 J; q& D
: A' f2 M9 k  W( O
    /* Initialize BSL */
; y) T9 x4 X; o" o& W4 ^( o* [    EVMC6747_init( );
1 g+ U' @5 o, @: g        /* Call evmc6747_intr function */
2 z7 x( C; Q: V5 `% t+ ]& o1 W    aic3106_init( );
( P+ G  Q" K, F$ _2 n# m/ H        while(1);
& L0 T* A; c4 f( J  E- g+ D% q: B+ l2 L}
) D8 ?: t  G$ ^) d0 U4 {! n) }% B9 Q3 C( ~. W! Q

3 z7 J" N* r' @: z( saic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- B# t4 O8 \3 q* l# f$ C
/* Initialize MCASP1 */
6 k% o' b+ O: {    mcasp = &MCASP_MODULE_1;9 c0 Y+ W$ P5 H* [
    mcasp->regs->GBLCTL  = 0;       // Reset
6 b( F9 k* T3 O5 c+ w2 H    mcasp->regs->RGBLCTL = 0;       // Reset RX
' B( v. u, ]+ u: L    mcasp->regs->XGBLCTL = 0;       // Reset TX+ S- z, J$ y0 b+ m  F2 C
    mcasp->regs->PWRDEMU = 1;       // Free-running# u% _* @  X& W, _) X# A) h
   // configure McASP0 receive registers
2 l% b( I/ c# H4 `& v# M* M    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used2 r% l; c% V6 m6 S5 G+ J1 B
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; O' I1 {( t# R; j    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word: Z5 N3 f- T- T: ^! W
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ q# C! W0 {- B' S
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)$ \$ ]& t1 d+ T4 J5 ~
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1! |- P% a% E  t' _1 }# Z
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
9 G- R$ g. o6 ^; P, X( X  b    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! F2 W' \) s* w7 @
( B' @* I' z- R6 L4 v" @9 {    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
, p: ?* {6 I" U9 {8 I8 ]    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 s5 N0 F' [% O3 s. M
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word% W8 V5 E$ Y* }) e  W
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 G% d* a, I0 `" X    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK1 \) \7 O1 k2 F" }
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,11 p/ e6 r9 @. S
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit7 L, z# D7 X' ?/ r. {! |
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, T% x4 a( G& M4 r
+ ?( j7 s. T# J; a  d' t& I    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN3 _* Z7 E- H, C* m
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT4 M! E( x3 T$ p9 c5 z0 z/ R4 ^$ j
    mcasp->regs->PFUNC      = 0;          // All MCASPs' E0 `* [8 g2 ~, H$ J- u; V( S
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ v# |! e1 B* l- t0 A' ?) l8 ?
. y3 V9 i+ f6 Y, G4 Y3 q  {: s8 h2 j    mcasp->regs->DITCTL     = 0x00000000; // Not used
7 z0 d0 e/ ?4 a! h    mcasp->regs->DLBCTL     = 0x00000000; // Not used/ i: }: g6 Q, m/ B  p9 q
    mcasp->regs->AMUTE      = 0x00000000; // Not used
# @7 {% p% E' r2 Q9 _" F( s3 g& ^
) C* T! E# P1 E8 M  C1 M- m/ z7 S: l/* Starting sections of the McASP*/
% L9 u5 g0 U! A0 v( Y' o% _$ ?    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; # f+ F/ C( _* C
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  & B% s0 h. @: `* d- R+ N. I& s
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
: l6 O( V' l) g8 n  d    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 h/ N) o) x3 \4 ~6 c# A& H% K% I
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
  n7 F* _7 ]& @7 }. Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 a; e, W5 u% _, @7 Q
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # R; R$ M6 l, O1 i9 z. o& u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 j" F/ K/ k- y* D% y. D* U8 |4 \% L% {
    mcasp->regs->XSTAT = 0x0000ffff;
% O4 Q- |) Y- {! {4 Z6 d  f9 ~+ r    mcasp->regs->RSTAT = 0x0000ffff;
- C9 E: g% ]: ~8 P/ Q4 \
8 @" b5 k6 j) g9 `5 U) q7 D  i    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;$ a3 f9 z" I4 R3 R4 ^
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
' H' ~3 p/ I4 A0 U) O    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & i# J0 b5 z$ R) w( k
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) i& [9 k8 O; u- q7 k
+ s& v- z: k8 ?' f/ A7 S    /* Write a 0, so that no underrun occurs after releasing the state machine */
; q* L  T' K7 E) C    mcasp->regs->XBUF5 = 0;
9 K$ h: m! _5 C8 K% M* u    mcasp->regs->RBUF0 = 0;
4 ~! Y5 j) ?- ~9 M7 B% @1 P7 z1 e, G& L: Y' U8 F; {
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
% V# E. R4 k. n3 l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% a' X3 X- }" {% x6 B) i
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' ^( F! p  z' O
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" }8 c; t  [% r/ D7 w
8 L8 b" d5 U6 z# z
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ; ~) u" e% [7 V0 C9 I
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. x) e8 C/ [/ X  H- K9 K6 h2 M
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 R- U, V0 Z3 D0 D
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 c3 D7 D% ]# C2 _. V- N2 u5 t5 p
- K5 w( I0 J) S/ x" h+ e: G: y" F    CSR = 0x0000;
( |3 @1 f2 u/ Z$ p" k* m; {) t' [    INTC_INTMUX1 = 0x3d;1 F, c/ Z0 u4 ~1 `- B( D" |
    ISTP = (unsigned int)vectors;4 w( Z7 y0 G+ w2 L! f
    ICR = 0xFFF0;  
4 R" x! ?* A6 O5 c5 w6 ~4 z    IER |= 0x12;  " q" Z$ T. c. M5 a4 {% S: E% ?
    CSR |= 0x01;  + O* W& s( P; r. ?2 l. N3 s
4 x4 Z+ b: `2 F1 h& S1 N/ P
) Z3 x% J! P) T6 W0 O% t3 A

' ]8 d- B( R# F2 ?- }0 m还有就是两个输入输出函数:7 A( B  W6 T1 s2 G$ O/ ]
void output_sample(Int32 out_data)- l1 k9 a$ N$ m6 n4 s* i" N9 a
{
8 b. O5 l6 b6 C' [. E  AIC31_data.uint = out_data;  
; T( M  G+ v, m6 T  MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 O3 \, A+ B* F5 i1 g8 l3 t: W}
, D2 _. H4 ^, n/ e4 s& [1 E1 Y9 n, w& G7 I
Int32 input_sample(void)
3 {  B: q* v- h! r7 O4 M{  
4 j) \* I) Q' D: _  AIC31_data.uint = MCASP1_RBUF0_32BIT;( B. r$ j4 A/ ]
  return (AIC31_data.uint);, M/ Y% w3 N) |3 M  `3 S* G8 ~
}
3 M' w- g* W6 K3 |0 Y, X& _; Z% D; M3 r, K

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




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