嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 q  o8 {$ x0 ]5 f: rmain文件:
, _& y% @! {5 Sinterrupt void interrupt4(void)  
- h) o6 |4 H2 _% ]8 z{( N9 Z2 i  v6 U3 U, o# c) W' f5 E
  Uint32 sample;
0 r6 p& A% L$ Q: w. Q6 d
6 f& D7 D9 Z2 c0 C$ e, G7 g% x. n  sample = input_sample(); // read L + R samples from ADC
+ L( H$ y( J. Z  m5 P6 i- |  output_sample(sample);   // write L + R samples to DAC
$ j$ `' ]5 f; A/ B1 _  return;
2 k+ q0 o2 k  T+ D+ ~- @# K}
) Q9 h" F- x  H  s( f) Q: ]& n) g5 j3 h/ _! o5 D3 k" w3 y, G
int main( void )5 V9 Q/ J  Y/ }: o  _. j- O
{
  p+ [; k- L+ `) x* t
" F9 I3 @- B) M$ b& @4 \6 x1 H; ^    /* Initialize BSL */! W* c+ p% K+ M# N7 ~
    EVMC6747_init( );) @- X& l* m6 R# o/ d0 F1 J# N
        /* Call evmc6747_intr function */
; ~- {8 i% @' k    aic3106_init( );; }) @: o) U* x5 [& H
        while(1);
0 \5 x, V( z: i; m% |' X: P  e}' N+ M* p, t& t' v4 t
1 g' l2 ?1 k; T# j

/ T! v! H6 X; u  E7 Faic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 z3 W) Q) Q% w# |4 m- r/* Initialize MCASP1 */
+ B& z& D$ F% T, O+ v    mcasp = &MCASP_MODULE_1;' y$ ?' v( h! b9 Y! Z
    mcasp->regs->GBLCTL  = 0;       // Reset5 v- W3 S+ o! X
    mcasp->regs->RGBLCTL = 0;       // Reset RX$ |; j! a, T2 U
    mcasp->regs->XGBLCTL = 0;       // Reset TX
+ F3 @# ]- e& Q" _; M- P8 Z3 ^    mcasp->regs->PWRDEMU = 1;       // Free-running+ H( l% H5 _1 n1 p0 t
   // configure McASP0 receive registers
- I! A! g3 ^9 Z; Z; _  H    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used5 a, V3 p7 N1 u! e
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 i# p1 s( r; z) l$ S
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word' p0 ]! D+ I9 o/ j
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. G- `# J1 }( ]. ~0 m/ J    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
  A" l& G! Z* b# P    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1& ~9 s. x$ ^: q" r- ]: p
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
. T5 q/ Y/ k' x" b6 }* D    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: o# ]) [$ Y, ^- c1 Z
( p8 m3 Q1 _* x' {! a    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used# x( `2 g' T/ Q7 p7 d
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, ~& g3 B* q+ X/ g3 {+ c/ E" H    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word! X" J2 ]( x! c" j% A
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16# t, C& m. m  `" v
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK9 r& B) X, o8 w4 \+ u! t+ _0 q
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
0 b1 X6 i4 E' h2 D    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit# O  u# V% Z, X$ s$ a
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! V* f' w  D. g" o4 R

( G* C4 t' a$ \; D    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
, C* n( k+ p7 Q; j8 u9 i+ L! Q. z    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
) s/ H. \7 Y8 P% w( T    mcasp->regs->PFUNC      = 0;          // All MCASPs- Y/ w# o# t; n. k% x. J& \8 m
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 ?- R% S! q" J8 D! D. S2 N4 [# O0 B0 y1 M0 a- a# o- `
    mcasp->regs->DITCTL     = 0x00000000; // Not used  a* \+ Q* \- n5 I$ |& h0 Z
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
5 P* o. v5 ?0 j% f" q4 b5 h    mcasp->regs->AMUTE      = 0x00000000; // Not used4 ~- u" e' [' l4 n2 e

, c" k6 F$ v# v! T& C/* Starting sections of the McASP*/
* D$ |' ]  [2 D  b" E2 c    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" O+ w) e% r$ j6 y3 J( ~. o  P    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  # k8 C, l+ F8 Z. g# |1 g0 `
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ; }. a4 {$ I4 F9 C! N
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) C8 {2 V. h- v, k; ]* Y" |# J$ H( ~
6 B9 G2 _+ x$ O& N5 p    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; - V% Y' D- `1 h* r* w: B7 D
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );: G/ t# ^7 T2 G- S$ W
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# R$ e9 A; j1 m5 h    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );3 Z) G1 `3 Q) P- O

# B, W1 e5 v- g- c* P0 S    mcasp->regs->XSTAT = 0x0000ffff;
+ U; Z: g+ _6 Q, x0 @# P) R1 w$ J    mcasp->regs->RSTAT = 0x0000ffff; 7 ]. D3 j8 v; A: ?! @" D6 |
; X& @6 C8 \0 U. K
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;' L2 J7 ]7 W- v% N7 L& P& C; r
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. e: g2 r5 |! y7 q" |% b    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ l# ^& p# j# w; B8 L& X1 `  d* l% W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );" S) n( s  ~) u) Z0 ?/ e  D# s! V
* U! i4 b* C: [# u1 ^' D
    /* Write a 0, so that no underrun occurs after releasing the state machine */
1 K7 F% D- n9 ^0 M    mcasp->regs->XBUF5 = 0;
/ X6 v9 p8 O0 x    mcasp->regs->RBUF0 = 0;8 K, K  L6 M6 r% X/ c
; ]6 f1 S( G. L' z$ Y; l
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 7 i, k! L0 f1 ~* R
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. \4 I0 Y& N3 V, L    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 ~  O# c! _7 i7 U$ u- y7 ?
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
/ ]+ G4 F7 {: ?6 W( |7 x6 ?# x3 ^7 M4 i+ E( u
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( Q9 c  u  t; s' x; f2 w9 x/ d  G4 k    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );& X+ @$ N' ^- t4 J& b# ]
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 ^/ \9 e4 q" z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );& W+ X* i( I6 M$ q

' }  f5 G5 Y* {( Y    CSR = 0x0000;/ F$ v- f; @1 ?
    INTC_INTMUX1 = 0x3d;
5 [3 `7 T2 h* H7 C( Q: X5 D    ISTP = (unsigned int)vectors;1 i6 k# p( A' a& ^
    ICR = 0xFFF0;  
8 d3 s' t- {, ?) `    IER |= 0x12;  7 x& s0 N7 o* G/ ^1 A9 ]% Q
    CSR |= 0x01;  
" S3 ^0 @3 U- g
1 T! M. @, A4 c1 D$ e- n. T# S1 K5 |; }: M

7 e$ w/ c* I- k2 v: d( Z/ @( F还有就是两个输入输出函数:
' W4 [: z1 w- N% W! H: pvoid output_sample(Int32 out_data)
8 u' |; N: p4 v4 q: ?+ B2 M3 Y! s{6 ?9 h! m: X; @! `: y! `
  AIC31_data.uint = out_data;  
/ L7 v5 _- Q7 k. g  MCASP1_XBUF5_32BIT = AIC31_data.uint;5 G1 }# ?1 M1 a) r. S
}
' i- W/ b9 W/ j( J2 c, q
5 |8 E7 F4 |1 a0 F0 M/ FInt32 input_sample(void)
* Y+ Q- `/ V, u# b{  7 |$ J' Y" ?# A
  AIC31_data.uint = MCASP1_RBUF0_32BIT;9 O6 `3 ^- |- e% z0 [
  return (AIC31_data.uint);
. r! s; [. o; r: q  h/ q, Q2 A; t% d}8 S7 }! Q, a: u; y( {
- m. \' T, K& F7 z7 Z/ _. Y; H

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




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