嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* W) t/ S( U( K
main文件:
3 {8 m2 H2 s9 G* G6 {interrupt void interrupt4(void)  
. z: U4 w# M) U, }. L0 g{
' |6 V6 Q8 B/ Y! ?2 m  Uint32 sample;: {4 O! T0 \* X

+ a& g; }/ S: H' }4 t! y. v& ]3 h9 x; o  sample = input_sample(); // read L + R samples from ADC
, r! \) z2 h7 V$ v6 r, Z0 F  output_sample(sample);   // write L + R samples to DAC   ?' ^! C- e0 P9 G2 q
  return;
4 c" o+ c8 S" T* H}' y  w% ^& @, x0 w" l) ^2 k6 n

1 ]- \' n/ `/ M. Y, a8 z+ Bint main( void )
7 Q# F9 A. r8 R2 R  {1 q3 f! o) t  t{4 _& M* O  H. ^: q

6 c* a0 F2 y" K: k) D    /* Initialize BSL */
0 Q/ D  Y; j' L: u    EVMC6747_init( );
; e& Z0 _+ |/ H& }; Z3 U. }2 Y        /* Call evmc6747_intr function */6 r( S! \- a$ A, }, m
    aic3106_init( );
2 A6 C. ~6 _5 u6 S- o        while(1);
; G8 |* p4 D/ @# q5 D5 L8 V}- c, h% `$ `0 Z% |0 v4 c4 l
9 O; K6 l9 B& _9 ?! q7 h; }3 Z

" d. M8 O5 Z7 _6 q. Raic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' X5 {" i# v* w! t* y3 q/* Initialize MCASP1 */
1 w/ Y  u) }$ a  a+ J) x: T    mcasp = &MCASP_MODULE_1;
- S- L- Q" @( h# K. O6 |. Y    mcasp->regs->GBLCTL  = 0;       // Reset
( L4 B, `, u  O  i" z2 U    mcasp->regs->RGBLCTL = 0;       // Reset RX
$ |  r& m! p* \( Y  h% Q' R( m" G    mcasp->regs->XGBLCTL = 0;       // Reset TX' A" F& y( C; z1 M4 ?
    mcasp->regs->PWRDEMU = 1;       // Free-running4 ?% w4 W4 A+ `' w6 b9 D7 b
   // configure McASP0 receive registers0 h' Q! U% \5 o" ?/ x/ P3 P) i
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
7 t5 O. p# v6 y) Q, L' d    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 S: e  s% K% Q7 `( i0 E
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word% Q* S* h8 O. O- O5 E# ]
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 q; n% {! n* M9 t
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
( V8 o8 U# s# |% t; R/ w! @1 r    mcasp->regs->RTDM       = 0x00000003; // Slots 0,13 |+ J# V- J: q- B4 Y  O) k8 R
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
# A  R" d6 |% J    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ n3 N8 V+ r9 ]% I* Z" y) ^) w+ D3 {/ k: V2 g
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used  g  a" q" ?% m0 O* _# `9 L8 O
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 a# C, b1 o0 G# F) X
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word0 t1 }" j' D3 o, L2 S* h
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16) B# A* h: Y( c, c4 j& M- O
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK/ o! }  H# ?# x( R! B- H9 D
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,10 m! P8 G" \% e* a  `: A+ Y, W" m
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
, T; c& _- e7 W7 R7 S0 }+ v5 [$ d$ b    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( [( Q9 N7 t$ h2 X
/ Q# O7 v: q+ z/ x
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
9 L) j. H- y1 y+ a/ ^& P    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
3 X( B! d' J/ W$ k# n    mcasp->regs->PFUNC      = 0;          // All MCASPs* s! k0 \1 X8 r6 c. @
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX13 k" l2 y! x& ?0 b. J1 i2 Z) Y  R

! F: F! k7 ]  y. ]    mcasp->regs->DITCTL     = 0x00000000; // Not used# N& `8 d- T# z: I0 I8 u
    mcasp->regs->DLBCTL     = 0x00000000; // Not used, X9 g( }. s# Z, g' ~3 a
    mcasp->regs->AMUTE      = 0x00000000; // Not used" W( p  k; z2 I6 a0 z
6 A2 e  N: w& }- r) `% ]5 ^1 }4 g
/* Starting sections of the McASP*/
/ P5 F* a& f1 I4 A4 [0 z& G" t: e    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 L, {+ ^; J  m" R1 ^    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  & I8 K. C3 z4 X( r
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * A% k& R4 U' s- P. @  G
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# i/ I* z4 u, |) [8 S1 @* S3 W# }9 N: y; a. e
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , u4 `% p/ F5 K+ q& Z3 L
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" U$ C9 \) w  r3 `2 L# m! m    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' z; \8 ~' c. f    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );  Q, E7 B8 K/ g! D& B

' X1 H  v* z9 t0 h    mcasp->regs->XSTAT = 0x0000ffff; 1 p. G) `6 t! W9 V5 \+ v* u
    mcasp->regs->RSTAT = 0x0000ffff; ) T, @2 I2 h  p+ J7 d1 `
5 `2 q( G$ N! p$ X$ q
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;6 T4 i0 r9 s' A/ k& |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" ?! l9 k% {+ |! L& z    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" ]- h  d5 r' d$ {    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );: U# r: R! t, [2 K" j0 ]
2 V9 P$ f8 @, R) H
    /* Write a 0, so that no underrun occurs after releasing the state machine */
; u7 I9 C1 ~9 I2 ]. A% ?& @    mcasp->regs->XBUF5 = 0;
$ k6 ?8 N2 X# P1 \    mcasp->regs->RBUF0 = 0;
3 R' R9 X) I2 m- c5 r% L- A8 \9 }- R2 L% M
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" X- c' W; S5 c# J( {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# X1 x6 j& F  D; z3 |    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% L/ D& y) f0 k; i  a+ _" j    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, e9 f8 D+ n# d) J# L0 o
4 E+ h: \$ e* I+ `* t    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 7 T+ Q- x3 Q0 z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* N0 d& s. n) A. }6 v3 K, A* N    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 p# u9 g; F2 k! A
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );$ v) ], Z$ g2 K4 @+ G- i

2 N0 \: m; t8 ~* A) c  N    CSR = 0x0000;
8 r* X; J# P' c# E6 \4 d8 r    INTC_INTMUX1 = 0x3d;
& _! U; G$ F: x; N# [    ISTP = (unsigned int)vectors;7 n  p' L+ y  U: h4 d  ^
    ICR = 0xFFF0;  0 x+ a$ P5 Q+ }0 T
    IER |= 0x12;  
# E2 ]2 z( m" c3 D    CSR |= 0x01;  
4 |! T2 D! w: V5 U+ w0 W2 E6 b+ C7 K, @5 P
5 I7 P2 R: c3 _/ F% y% e7 Q3 ?& d" n

4 I- z" u, s/ w4 z: N# b' E还有就是两个输入输出函数:" ]4 i3 s- `: E9 C0 z7 }6 ?2 g% ~# r
void output_sample(Int32 out_data)  t' V3 F- p/ k+ ]+ T2 l
{
9 {0 g% \1 i7 t* E4 _( e: U/ d: H  AIC31_data.uint = out_data;  " B$ ^& v) W* a/ Q: F
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 v/ ~7 g) c9 G6 G. ]# q}  U9 k0 z1 ~  a$ L5 z# s
' n% U8 @) a' T( j
Int32 input_sample(void)
( ^, q. D- ]+ T* W) F{  2 [9 j$ D& X+ t% T
  AIC31_data.uint = MCASP1_RBUF0_32BIT;6 ^1 C# m/ p6 \. ^" g
  return (AIC31_data.uint);
# L1 _% H5 q6 ?* x8 _- e/ o}
) O! n4 o3 t: E# |" d/ G
4 X! ?/ |8 Q% r9 v
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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