嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:( Z( N' i- e- }0 Q
main文件:
5 @" a% C6 k% _+ J3 minterrupt void interrupt4(void)  
- D; N' i; ^6 g/ B{
1 g' \( X  M+ f( \% U# [  Uint32 sample;
1 K3 A, S/ q! Z" w2 ^2 ?7 H# z$ ]. o
5 e2 N% K; }; |+ v% @* j; t  sample = input_sample(); // read L + R samples from ADC
" `. q5 b" j: d; |( w" k  output_sample(sample);   // write L + R samples to DAC , O$ P  q7 P6 [5 R, H% F
  return;
4 D- ^. L0 W; O! j1 y2 Q* Y" X4 I}8 L' U  p: k" z$ y

" v# k7 n: u: u! K8 M4 ?, }int main( void )
, O- q! F# d1 L1 }) O0 `' o  {{$ b' C7 |, D) \  ]: i1 f, h7 n7 I0 D
+ e; _- b7 }/ `
    /* Initialize BSL */& O5 o8 r3 w2 x/ ^5 E2 p
    EVMC6747_init( );
0 ?& h3 }9 ]8 i# C+ b        /* Call evmc6747_intr function */! }, ]8 @7 I3 D# g8 e9 z3 X, v% W
    aic3106_init( );
% I4 V/ g, A! a+ V* r        while(1);: F0 S2 F6 E5 b7 E0 O+ u' Q3 {
}3 b+ f% L, g% |+ d/ f

+ C0 y. ~+ h8 M+ l! D& J* \# {" z( C7 `: ~4 B) n( c
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# b! p! [7 g# l$ ^4 n9 K- A9 N/* Initialize MCASP1 */
% u$ v) Y3 k" P0 I    mcasp = &MCASP_MODULE_1;
" C! b3 A% b9 z0 ]    mcasp->regs->GBLCTL  = 0;       // Reset+ }( `4 v( W" \$ g- B3 I7 |' V6 {
    mcasp->regs->RGBLCTL = 0;       // Reset RX' K8 q1 Q7 W3 y- i1 V
    mcasp->regs->XGBLCTL = 0;       // Reset TX" [. z( q3 d$ e& G1 Q4 k
    mcasp->regs->PWRDEMU = 1;       // Free-running8 Y& U4 y# J- r  L1 C! [
   // configure McASP0 receive registers5 ~9 D% s: G9 E; N4 x& P
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
5 A$ s  U8 E" l; E    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. T6 i) ]) r; X/ I( x    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
& \4 W8 {/ d* W% |  ?" N    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)# o3 Z! q! G: y, i) J& ^6 Y! ]
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)5 f0 P" a! T- c. }1 v; h
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
6 ?& ?) V( c' U- ]. w  q8 ?    mcasp->regs->RINTCTL    = 0x00000000; // Not used
# R! N8 _7 E, U# H    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ n( O) C( W" U7 X+ E( S& I" q+ Z4 N5 Q: K2 i
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used& [& ^: ^& W" _0 y) q. L
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' I0 [" t' J) a; S# W# ]: b# n    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word# F! C# v0 F, K4 l0 n: [
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, G  m5 X  b$ c9 H3 Z# A
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
- a2 C& L2 ^. r    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1! O8 S0 _4 X0 l% m. r3 H9 u
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit4 _% v8 J* K6 c7 S+ K1 U( v
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
  @$ O" i! r7 b; s8 ]2 h" s9 {1 N- d# r# u3 d
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN6 C( ]" h/ T: A# |
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT- K$ G) [( p+ R& N- x$ w* t
    mcasp->regs->PFUNC      = 0;          // All MCASPs
1 N: V& f# p% Q. W. s3 J7 B    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 f( Q- |9 G1 t* f+ S! j! A
& e& Y( p4 h5 z; Q    mcasp->regs->DITCTL     = 0x00000000; // Not used
' G# b; z6 r! e- Z7 v( e6 ]& z    mcasp->regs->DLBCTL     = 0x00000000; // Not used
: u. n4 m- p5 z- R3 `' I4 F6 E    mcasp->regs->AMUTE      = 0x00000000; // Not used6 ~; _: j( k" q! e6 ^
6 ?$ m$ d$ @( A4 E
/* Starting sections of the McASP*/
3 x2 M0 X$ a9 D; ?    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 L) C2 @: q& z( I4 ~0 Q" S1 e    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  4 r; [8 K4 V9 c4 j( B5 v( ]/ k1 r
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 }8 O1 T# C, _9 d( X2 n( u$ ?    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
. {, {, q' B% H- h1 n% M% ^
- s) h/ `. ~  \6 E' z1 k0 c; H* G* _  r    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 f3 E4 V9 m. c5 a+ I& O* ]    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );' {. h3 Q3 G& H
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 V5 u2 b( x1 M8 V8 j& m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 z/ |* u$ U1 }& q* b+ a% Y
0 H8 g' W7 f' p4 Q5 d    mcasp->regs->XSTAT = 0x0000ffff;
3 c/ T- [8 l  ?: {8 v) ^) a    mcasp->regs->RSTAT = 0x0000ffff; ( W. N/ [% b: P  F  {

  v. ], p+ g7 ]( K    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;, W& l0 a  ~+ U7 o* D% |0 J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 ?2 H; X8 q) Y% H1 K4 L    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 e7 w* n& O* f( e2 R
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );" ^9 z2 n$ a: V5 H% w; S

/ `& R6 D" @5 ?& O; f/ E3 w    /* Write a 0, so that no underrun occurs after releasing the state machine */
' _" Y0 o. N+ X; d1 m    mcasp->regs->XBUF5 = 0;, @% k" W, G* h
    mcasp->regs->RBUF0 = 0;
2 K* A* a3 i, R$ T
2 D% a1 N& p5 @3 G  @    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; $ ]9 Q- O; z& N+ I: v8 ~
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! E' }- u; y/ G
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% n# J. W/ z, ~% p- M5 p4 x4 M    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );' L4 S, m' Y7 t& K: i3 K' v- o6 F
- I! @+ |) A4 d+ N4 p9 j/ |
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" x# k, \* L. }4 s8 [/ e* g% l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );4 w0 S& L9 t/ Z$ W" c
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! q3 W% Y6 K" k    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
/ l1 b5 B% d, ?% i" \* g7 O0 O0 D+ c1 x7 [  B
    CSR = 0x0000;: k$ F& e7 K  S  ^$ [! f' ^" m
    INTC_INTMUX1 = 0x3d;
+ l9 d2 ^$ V& d3 G0 j$ R8 P    ISTP = (unsigned int)vectors;
) |' d0 E- |( J" j" d" x, {/ G    ICR = 0xFFF0;  
! k/ W0 R7 R5 ?; o    IER |= 0x12;  
( m+ P- p* p; F" E, o" d' I    CSR |= 0x01;  
) u" A8 o) d2 l* O  G% l+ e$ g: b/ l3 n( K' R  w* z  u7 Z
' P7 Z8 ]9 A* c! f, Q, \0 t* }

/ r, L0 D! l$ l% e7 y还有就是两个输入输出函数:% O% M; K) N5 q3 P
void output_sample(Int32 out_data)
/ f( O1 p" d: z& A# V( ^- S{8 w* B) A7 Y! N  T) y
  AIC31_data.uint = out_data;  " Y# g+ ?, ~0 H1 Z* s4 \
  MCASP1_XBUF5_32BIT = AIC31_data.uint;4 T6 G8 T! l9 [5 \
}
& O2 v  t- N- C- C* F( _& {% x
" v  b. ?# r) F) r) d1 EInt32 input_sample(void)
3 p+ x$ o" G# Y5 D) w/ i- T2 z, U{  * k0 Q( Z; H* m/ |
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
5 i9 k5 P" y6 n% W: H/ I  ?" r  t" }& B  return (AIC31_data.uint);
. ]9 `( g8 n8 E! o/ u& u' r, L/ g}8 W+ i/ Q$ ~0 f' b% q

, [  m  C- v* W/ Y( ?; r
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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