|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" Q+ `5 P' A7 i0 s5 imain文件:
+ g9 P, {# p- X1 n' Sinterrupt void interrupt4(void) 6 {7 U5 |; @" M& `% r8 }) k
{
' H& v4 G9 P+ [1 v, [ Uint32 sample;5 u. F3 [0 @' K+ h$ X
3 ?. [" Y$ U7 B. O sample = input_sample(); // read L + R samples from ADC
& K( p8 G7 V) \% R7 {6 D output_sample(sample); // write L + R samples to DAC 1 i1 l5 T6 [' h; N$ _3 B6 G5 a
return;
; ?: l _8 E, Q}7 m# v; Q4 B- M L. d! Z* h
4 w' P/ F$ b: x9 b+ A- d, ?int main( void ); x& `/ ^; W0 F" g2 m* @0 E# o
{
3 `8 q. u% q: @- s+ i6 U
- d( T% K! X! v1 I /* Initialize BSL */
1 ~' W$ N) l$ P EVMC6747_init( );8 G% A* I3 k8 j7 |5 H% k
/* Call evmc6747_intr function */
7 l& m) f" T' `& G* q aic3106_init( );) h; V- Y+ {2 K. M, S7 E5 ]& A. m" \2 d
while(1);9 U! S- R# B8 q) A; H- |
}! p. [& B* V; U0 T; p
( M" y ~- I, l6 |9 ?- p& v b4 W; A
( s$ s* c& T: ]1 Uaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题& _& [3 {* l" ~
/* Initialize MCASP1 */
# r' E$ g+ r, a, k8 \ mcasp = &MCASP_MODULE_1;
- d/ P C' o' t; G( K& K mcasp->regs->GBLCTL = 0; // Reset
! K3 g4 r/ v, Q+ T mcasp->regs->RGBLCTL = 0; // Reset RX
( ^& d+ D- C2 k5 h! \6 H) I mcasp->regs->XGBLCTL = 0; // Reset TX
4 m( ` J1 ]: s9 s) T' _/ W- z- Q N mcasp->regs->PWRDEMU = 1; // Free-running% E% Q- L# ?+ ]) V
// configure McASP0 receive registers
$ W9 [7 B6 `/ T, E! b7 ^' N mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
3 H4 X+ O- i% p5 x mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; R9 P% E) }3 P- r mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word0 D* C/ x& P9 j, C) ?: I
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 x' D( o; w% Y. [2 z; J) k
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! P7 T" F: o5 Y" d6 X7 [' G$ R mcasp->regs->RTDM = 0x00000003; // Slots 0,1$ S M2 j; C2 a% e+ T- v
mcasp->regs->RINTCTL = 0x00000000; // Not used
8 E9 O. y+ \# Z' M mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- C4 z* i9 Z/ d; F0 J5 c+ F, a
+ y6 C* ~) t8 c mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used8 C$ \1 D5 c7 t
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; I, v' T7 h" X! p mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word; L; B7 \9 o6 L% Y4 z( `9 G
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 y& \& \! I% E4 x% P$ t. P0 l) R+ ` mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
5 Q2 l: P8 m+ `5 A mcasp->regs->XTDM = 0x00000003; // Slots 0,1
# r0 K# N" L# z; @ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
; _/ U/ Y- [: z/ ^# A mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 I' ]" b K) r5 @4 v
7 L( I2 t, D3 g6 c! ` e mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
, d; M. b( ?/ p- d+ Q: b mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
3 e8 Y' y, |& P' ^+ u mcasp->regs->PFUNC = 0; // All MCASPs
T" E8 Q; k8 T R* j mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ {# }3 V" z+ Y! D9 }9 g; S
& q* ?' y6 P& \
mcasp->regs->DITCTL = 0x00000000; // Not used
1 h1 M5 i) }3 D; c) X9 L( | mcasp->regs->DLBCTL = 0x00000000; // Not used1 ?/ Z# p6 W' \2 ~" n/ f9 V) {0 }9 e
mcasp->regs->AMUTE = 0x00000000; // Not used/ R# n" N8 d9 ~
|1 ]3 |- e0 Y. _/* Starting sections of the McASP*/2 `) s/ G2 L% V N/ o6 d8 h. C
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; + ], x0 \4 Z: M9 |- d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
* W1 X& O) c. s" d. P: H5 f2 j& h mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ R% U8 s- v+ O# R% \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );& O4 C, V. ]# @
6 L, m E) e t
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
- G; r5 k- t, D( u) X0 E( \3 ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ D& ^7 j( R7 |- l A% I( x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 ~! Z+ ]+ s0 K& @: L& m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 Q+ c3 R& r3 ]" @/ E8 v. k/ C" R4 _
mcasp->regs->XSTAT = 0x0000ffff; 0 G) ]0 W' f* ~" c& R7 M- T# Y6 o
mcasp->regs->RSTAT = 0x0000ffff;
1 I" F7 G3 w9 l9 R6 {9 x- x7 f% r! t' C+ c( [
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 h$ E1 H3 g6 e8 V: s while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 D; x! a: p- [( F- J) e mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# M% B' M" x1 |6 E* K1 s v/ J while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 E1 f! s; `. {4 P$ d/ i3 {# Z' t! ~/ p" U+ E0 }8 u7 M
/* Write a 0, so that no underrun occurs after releasing the state machine */3 y/ U1 O, z4 ?; `/ J
mcasp->regs->XBUF5 = 0;
# B+ h0 k/ d9 d& ] mcasp->regs->RBUF0 = 0;
1 M+ }5 R; ]$ P1 W. g( T6 F1 T; c& S1 r; L+ _) `! {
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + `. ]% \) `7 z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) K4 t) M0 I5 f/ v) t mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ i) {# N! s( G3 I6 H/ Q3 ?/ @# L7 y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 m5 u, H0 p, C0 g$ I" z8 w4 Z% g! t- F5 k
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' ]' Z% d. O( s& H7 ?# P( N while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 I2 }/ m# Z; F. h4 g: ?9 s' Y% i8 w mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* g7 `0 J+ P/ g: i+ i+ n$ | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% e2 C' }2 t5 L
* [% q) r. S0 h5 v CSR = 0x0000;. A! \5 ^: M) k: k
INTC_INTMUX1 = 0x3d;
, ~& `$ {2 Z/ ^+ Q6 E ISTP = (unsigned int)vectors;. l% z" n# ]1 M- }1 x& V
ICR = 0xFFF0; . u( h0 C6 T$ p
IER |= 0x12;
# j l% W! m, d CSR |= 0x01;
5 g- y0 ?+ n) {: p* D i, W8 w3 Q* i- s; n
i: Z2 Z* m, ^+ {. p6 \1 G; {% v: i! t6 y7 U. P! R
还有就是两个输入输出函数:
- F9 W/ F* u7 J* H3 i( i+ h2 S$ gvoid output_sample(Int32 out_data)% G1 i$ b, Q1 T5 o) Y/ X
{) s& i! B' H2 r! A0 F" m3 G
AIC31_data.uint = out_data; + ~# m; \' a0 F( U2 x* l. c, L
MCASP1_XBUF5_32BIT = AIC31_data.uint;# _( ~/ d, y8 X: Y$ R& ~. Y6 v
}
: S5 k0 B2 Y R! U7 O Y6 D/ N1 H# Y( i6 h
Int32 input_sample(void)
/ k8 i. ]' D! |& f6 H{
* v8 S' A6 L. z7 M1 { AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 X% _! P1 { ]% g$ I return (AIC31_data.uint);
6 Y: S6 P* y6 u$ w; }5 w}2 g& r+ n2 n1 _! [) K( O9 T1 o, y( L
) V7 r8 ^& X. c8 {
|
|