|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:0 P ?0 c9 Y* e0 w7 q3 t
main文件:
$ e. E1 V3 V. ? O$ ]interrupt void interrupt4(void) ( n* Y# q8 ~& s8 E+ s, m4 A. i
{1 u3 ^! ?' P' x. F: @- W3 S
Uint32 sample;
; e6 R, _7 S$ \ }- [4 g2 t8 U% z% J
sample = input_sample(); // read L + R samples from ADC8 G8 A$ l0 ]- v/ b4 z: e2 ]5 D
output_sample(sample); // write L + R samples to DAC ( w- }: Z; p+ ]) ?2 t! m
return;
( N4 L. m& D* ~8 d" C O+ O}
1 t8 E+ V: }/ q! z
; M2 _+ e# o" ]- Qint main( void )) `1 H7 \1 H5 s! l( f
{
& r3 s( i% Z" V- D+ s/ c: Z5 u) M
1 {+ s& x( T- M& D. n. N /* Initialize BSL */
* N6 R1 T' _0 T3 u EVMC6747_init( );* |( o0 K: ] V1 _$ o7 p; u& D
/* Call evmc6747_intr function */
5 O2 o1 `" }( w& u f& U% u: v. G aic3106_init( );
7 h$ `+ {( f4 t% A$ ~3 A while(1);
: k% ~$ n& N3 F) g3 g4 M}6 R( e" D+ {: e; `7 R Z# I
$ P& P3 [7 y% A' ~( P& e
3 q: a. o) a% _7 s6 k( K+ `$ ?
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& n2 p" }% v, q8 C, X- m/* Initialize MCASP1 */
: k' d; C/ f3 g mcasp = &MCASP_MODULE_1;, c" q3 q" d9 p% t8 q
mcasp->regs->GBLCTL = 0; // Reset
+ T, X% t- D! X mcasp->regs->RGBLCTL = 0; // Reset RX* y$ k4 L- {6 X+ W& f
mcasp->regs->XGBLCTL = 0; // Reset TX/ q& K& Y" k4 r# Z; p6 x
mcasp->regs->PWRDEMU = 1; // Free-running
) q, J5 _: W! b // configure McASP0 receive registers4 C0 N8 K4 P. S! f
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 f* ~, N& X# y mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 N3 r3 W6 G$ d! ?+ X' Q; Y mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% ?4 B- K* J6 n& T' i9 `; @5 M* S mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side); |% o k) `0 R# v
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 l/ H/ W. _8 I' e3 u) s mcasp->regs->RTDM = 0x00000003; // Slots 0,1
6 Z! o1 S6 x' W5 e6 a mcasp->regs->RINTCTL = 0x00000000; // Not used8 P5 {4 g, ^ I' Q1 y" g. ~* [
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. H1 B( G5 m" b5 b
( A7 v7 `) T5 j) d* a mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used/ i- k- }$ s9 e* }) s: U
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
n: |" P4 `1 w! }+ B- A7 J8 v mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word y1 w9 V3 ~0 k
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16. v* j# c Z' k$ v; T! E
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
/ a' E0 u) P3 @4 z mcasp->regs->XTDM = 0x00000003; // Slots 0,1
% f. i+ ^2 p) |+ r+ W: U8 V mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ u8 e& E* T Z9 l" F mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. X3 G5 n% w. b$ Q
; H+ u+ b$ z; @" s
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; T2 p4 ?9 j: f1 u# { mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT5 r/ O4 l3 t4 M
mcasp->regs->PFUNC = 0; // All MCASPs
8 P8 [) `/ @& i; A mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* [; U8 R& F$ w3 }& q$ B
, o9 M9 \+ |6 a/ D mcasp->regs->DITCTL = 0x00000000; // Not used
' k8 c+ |. f; U2 | mcasp->regs->DLBCTL = 0x00000000; // Not used. P& v* m9 k, m3 l& I1 E$ D
mcasp->regs->AMUTE = 0x00000000; // Not used
8 R2 f) Y. G" D1 u% n- }! c5 w7 n: }. x" E
/* Starting sections of the McASP*// ^) g/ f. F8 w }6 Y% R* [4 b: E7 O/ @
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 {* I4 K) }, n6 W7 N- R! f1 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 7 @# V( T4 t! N: d
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 8 |- Q9 B' I8 c3 n' }" Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );# E, _2 L' g. o; Y3 z7 R( {2 z) `
* o0 k+ y. v6 e" J mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ @$ ]( ?) o9 A. a! A9 J while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
) I; e& `- I: e& _* { mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% l' {- \% r: C- u# `/ ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );; I& m, g. h0 a8 y
3 V1 M6 Q q4 t9 t) W) d mcasp->regs->XSTAT = 0x0000ffff;
) ^4 F# Q/ ?* _ mcasp->regs->RSTAT = 0x0000ffff; a( E: X+ M7 \ Z
3 w @2 B+ e6 Z
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* s* @6 ?. s- q" O) x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );% T# Z4 B! y: t$ I Z' ^/ K4 f; S
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 c" b: U1 Y( n5 H |4 w$ A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 `/ m1 c5 [/ Z
% i3 H2 y/ P' G
/* Write a 0, so that no underrun occurs after releasing the state machine */4 i) o& d) H+ f. E- v& T
mcasp->regs->XBUF5 = 0;
$ ?' u% M+ {4 Z5 S0 c# b" P9 [+ K mcasp->regs->RBUF0 = 0;
5 j$ {. u: J3 S# K, U6 ^: g
H/ |8 t6 E# D( _- ^( J3 E1 d mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " x: v7 Z7 |3 w" m! y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ i) Z' _: N; [ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' n; ~ F: q/ |0 I1 `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' ~7 [1 T" { X D
$ |. Q4 B6 V' I$ U, _ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( C% g- O+ ~0 c, }3 j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( y) T/ E& t% C! H0 \: T mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
7 R. s' ^9 y! P: n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );( L- E" s; B4 _4 a. Z8 d
7 i( [' [& a, ?5 U. K1 M
CSR = 0x0000;& W) t+ \9 v& M {
INTC_INTMUX1 = 0x3d;+ p r' K$ ?9 d" w# o5 V/ C
ISTP = (unsigned int)vectors;( _* k" ^% _, ~* M
ICR = 0xFFF0;
8 z6 [- D* E6 R1 h: t, D" a6 j IER |= 0x12; * m8 h8 |6 V& _' q
CSR |= 0x01; 5 _: L! A) E% [) @& T
/ s$ z) B7 G' ~4 e/ V/ ]+ x7 x$ u; _" Z& i: j
5 m. c) O* m F5 E5 h
还有就是两个输入输出函数:
: W$ f( t* d2 `. q( D$ Avoid output_sample(Int32 out_data)' g) K- k) g" u+ l& P$ U- P* }5 I& j
{
& t2 ]1 j( @8 U& ~3 e! _& E6 ]( ] AIC31_data.uint = out_data; ) g- Y- w" s, Y* G M
MCASP1_XBUF5_32BIT = AIC31_data.uint;
. [& w( h4 N) l5 u9 i: ~' x. _( [}
& M, H. ~) ?2 D% b& P8 U/ p
$ a$ e3 g4 R/ f& Y& V* SInt32 input_sample(void)
$ W& y! _* `6 k! u( o$ `{
4 j; r t% B* Z- S8 u# { AIC31_data.uint = MCASP1_RBUF0_32BIT;: E. o% H/ K4 ]' p
return (AIC31_data.uint);# n+ W" N _, s6 I+ A$ k; h! E
}
7 O B2 o3 B: a$ C, Y1 I4 F. R4 Q8 x7 A8 S* W0 h; L
|
|