嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
) q4 |: m. b5 x: U7 cmain文件:
! @. D3 d/ \2 b7 I! I% Kinterrupt void interrupt4(void)  3 O9 X. c7 L: l0 H+ l
{
+ P! w5 b- _. `0 W  Uint32 sample;5 Q, |/ F+ P0 W% Z

& c! S# n. M5 L5 {  sample = input_sample(); // read L + R samples from ADC
! k, P( B$ G5 d' }  output_sample(sample);   // write L + R samples to DAC
5 B* e& S5 A! F& s9 B8 q6 C  return;
7 g! `5 O8 f  H2 R9 i" N. U$ J}
3 o# G& O! x7 n8 b
6 g: V$ C. T& C  K4 \int main( void )
  n8 I( n4 m7 O) [% @{% O0 k* h* w5 e- j2 o

$ D! o: e! k, E% B9 P, j* [# K, q    /* Initialize BSL */
+ I/ C2 G6 \! o9 K' L    EVMC6747_init( );3 Y; p5 B  o% L! p/ q
        /* Call evmc6747_intr function */, n2 e9 n2 E1 [/ X
    aic3106_init( );
* A: G! {, {( ^  E3 W( T1 u        while(1);
7 z# X$ Y" Z( F$ i& _8 U}0 W6 s6 K2 ]3 [9 @5 w  G1 M4 |
& }4 |) h, B( D( K; e; d* q, T/ T

& _3 O6 l* |% h) m! g5 qaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* L' }- A1 g5 s' p6 O' V: |+ L/* Initialize MCASP1 */
7 H! ?+ ]! Z  m( J& H" t7 Q. Y: n4 t    mcasp = &MCASP_MODULE_1;
4 d0 B# L& S2 E: W    mcasp->regs->GBLCTL  = 0;       // Reset
2 n& n' l& z6 t/ B- A9 m    mcasp->regs->RGBLCTL = 0;       // Reset RX$ D! K8 a0 [6 N; t
    mcasp->regs->XGBLCTL = 0;       // Reset TX
, Q& R& ^! q. E+ S: ~$ A: S. g    mcasp->regs->PWRDEMU = 1;       // Free-running
' d/ E1 j; f' W; ~0 N6 L   // configure McASP0 receive registers
3 J: B/ L8 H. b* S3 m) T    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
8 ^4 j- g" m6 j8 ]1 p    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: J2 w4 W: Z- p' U
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* U& p- n7 X" a% [    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)& k# L- y3 m0 ~7 q& [
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
/ F3 C0 B- H% ^# R    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
+ a+ c8 C8 y# _* H. v1 _7 k" ^9 Y    mcasp->regs->RINTCTL    = 0x00000000; // Not used1 Q5 ^# n0 p2 W* ~( @/ n
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ B- R6 T8 I$ f0 y% n# A1 H& v$ x$ ]
$ P- j9 ~9 w1 w* t2 t- i8 o  h* ~    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used' p) I% l% L/ i" I7 k
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ K7 d1 o6 W' o2 n- w5 ^( m/ m4 X; p    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word0 b( x6 b0 D/ }% J4 a
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, i8 q( y* c+ p
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
1 |3 h; T4 N* Q* w! m    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
, C* _" l  U6 Z0 k    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit: T# X: d9 S& i4 e/ H; B  {
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: q+ V. E9 w. N8 _8 m3 p& a% x5 G: e: r- H/ l8 d
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN5 q2 ?/ Z2 [+ ^- {3 A3 @
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT7 d; I! e! [+ ]0 D
    mcasp->regs->PFUNC      = 0;          // All MCASPs
: F/ ]% t9 `! Q- d' ^: A    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 |( N; z& _# H" Y+ C7 b
4 d+ ^& D0 f3 l9 j; Y' P9 O    mcasp->regs->DITCTL     = 0x00000000; // Not used$ \& ~' L. M' B' Z& P" r! C* N+ i6 _
    mcasp->regs->DLBCTL     = 0x00000000; // Not used% _* y: w$ i6 O. @* U9 T
    mcasp->regs->AMUTE      = 0x00000000; // Not used& z7 K+ r4 j+ f3 E
/ F6 I' x6 [1 x: X# B
/* Starting sections of the McASP*/
/ q* s6 b) y- s. Y    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; + ^( f/ |# c; N9 @! T6 c& ?6 o
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  # n& B, y+ j' b0 q( U7 N- R4 A
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : C# Z0 W( u# n8 T
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- Q" M1 C, o. b! K% j5 S  \4 B7 X/ o3 j
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 b5 W% R) [! ^0 ?! D! K/ f. ^    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );4 |4 B4 p, f  E8 y& ~
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; & H& Y8 n( V! W: ^% F) _; e
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
% [+ v; L; a' t- d9 i
4 d9 A, a" e$ E8 j$ T    mcasp->regs->XSTAT = 0x0000ffff; ( d/ f8 ]' g) k: ^- Y% L! `# Y
    mcasp->regs->RSTAT = 0x0000ffff; - b! Z/ k6 w% ^* }5 W; h0 O

$ W1 X! z+ v" M/ w, a. m    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( i, m. A+ n/ r1 O: f% @9 S    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );& F& D5 J, X9 k% z
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & x5 O/ S" f( j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );. R+ B' C' l& R5 M
& _+ d. h. w" X9 M+ f7 L# Z
    /* Write a 0, so that no underrun occurs after releasing the state machine */+ b/ N/ T' d" M6 a9 x% _6 l
    mcasp->regs->XBUF5 = 0;7 `, V( Z( h) s1 i
    mcasp->regs->RBUF0 = 0;4 W  K5 v, q5 x, r, Z
' Y5 f1 _, ~2 D/ ~2 V
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 G( `2 v& M; [9 @
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) _* O- \: M8 T! z    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; % w  ?6 {- i: o% p: r
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );8 h, b9 d3 @" P5 R7 L
; y6 r: h7 W' ~# q7 ]
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ {6 Q- g0 D+ d* k$ B    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 h. U7 O: |- V& P    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 E& D! D7 c2 m& I    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
) t7 w; x9 E9 T8 q6 f- x+ l# R+ ]
+ @7 x2 L* O: o' p# e    CSR = 0x0000;
5 ?' B2 q8 n* Z* e1 N# i    INTC_INTMUX1 = 0x3d;
* {6 x7 r! Q7 Z7 b$ {( b+ Y' g, V8 P    ISTP = (unsigned int)vectors;
9 m* B. f$ H5 F    ICR = 0xFFF0;  
; g/ d$ d, Z* Z# R& H* v  `    IER |= 0x12;  
" ]. V, l6 Y7 ~/ s# A0 j3 B3 q    CSR |= 0x01;  
" x7 F2 A+ R0 `
* `& L$ |) a/ R3 @. {9 |2 a- {. U9 g
0 l% s+ z3 M# i: f2 [' n( m2 A
还有就是两个输入输出函数:
6 G/ Q3 y7 o% M/ l  P) Xvoid output_sample(Int32 out_data)2 `7 i) \) K( j" `/ |& x5 e
{
# K* ?* O" z+ |# c; f  AIC31_data.uint = out_data;  
# K8 u/ G0 Y/ \! S  MCASP1_XBUF5_32BIT = AIC31_data.uint;
+ @& r( K7 o. o4 T% w4 n3 q: G}
/ Z6 A( _+ ?6 h( q% s$ B
5 ]+ v. v: i" P  p0 c" gInt32 input_sample(void); ]& J) A9 D- x( d! v1 Z
{  
( d* @; Y+ z9 x! |, O4 F  AIC31_data.uint = MCASP1_RBUF0_32BIT;
0 E  `/ d- w2 g' o- ~$ |  return (AIC31_data.uint);) x0 V% W5 w& U/ ]
}
2 V: N; k6 ^+ A' ~4 ^4 M& L9 V3 `0 ~% g1 l1 v2 e7 O; \. L6 u1 J

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




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