|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:8 S. I1 ]7 H) |% b/ n# K( x
main文件:2 |& i" k X- ?" M( c/ d
interrupt void interrupt4(void)
5 h6 _& L( b( J" b2 N9 e. v. ]+ V{
i8 V0 R+ i7 o* R Uint32 sample;3 Y. ]+ k/ S3 p4 ]
/ [- V* r8 Y: x' K! B sample = input_sample(); // read L + R samples from ADC& J0 v. Z$ V& e0 k) k& d
output_sample(sample); // write L + R samples to DAC 2 j% T; [! W4 O" ~: `
return;$ K! `3 ^8 Z# V$ Q
}
8 x: C) {% I0 v3 M( J# d! M3 t( h
. j3 Y& V" C# W9 x: [+ \6 tint main( void )
& d4 j% s: ]8 \{
$ \# t% A+ }6 @: M$ S) `2 q9 Z# C1 I# h: [( H- o- N! x3 x$ U
/* Initialize BSL */3 `$ J' K7 C3 b6 n# O
EVMC6747_init( );! s% j; [' ?9 y# {
/* Call evmc6747_intr function */
7 c# V9 ^( m1 _7 v4 A aic3106_init( );
; C) q; ]! P& {/ J- k) U while(1);
! C3 L( W4 P; g n6 z}, W5 Q! \* u( B$ {; P2 k
/ [( e0 I) `. A e3 b
$ F7 D- P: m1 k% Baic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题) U6 I4 R, T5 y5 @, I
/* Initialize MCASP1 *// e! ~2 H0 S: P \- `
mcasp = &MCASP_MODULE_1;
" `. k2 u" K& V T; @ mcasp->regs->GBLCTL = 0; // Reset
% m( [& H% z$ i( F mcasp->regs->RGBLCTL = 0; // Reset RX
* o+ E4 g8 e! f( \4 @& Q) T8 g& { mcasp->regs->XGBLCTL = 0; // Reset TX
I$ o ?5 Z4 B5 U mcasp->regs->PWRDEMU = 1; // Free-running- `0 q. x5 a j6 ^* w( J* [- Z
// configure McASP0 receive registers+ t7 O% R8 a, w9 X& I# V0 z. ~
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* u. G# Z: q' b, k# l% w
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ j3 i+ ^$ k; O8 P3 u5 ^8 x
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word( a* h `0 b! `$ _3 N- i
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
4 K9 f9 P7 k; F; E$ m mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
0 ?+ [& O; K' ^9 M! w* a mcasp->regs->RTDM = 0x00000003; // Slots 0,1' R" z4 A: Y; G
mcasp->regs->RINTCTL = 0x00000000; // Not used; w8 n( _8 J# u
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 h+ k( q; G: O) N7 Q2 f
/ r! V+ t( r: N; P" G# b0 i f) L, l mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
4 ?$ H: [- F9 A w; x mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& I7 v) V5 ^$ F8 g2 ~ mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 N# z/ K& H4 p2 h mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ n: v. U. \6 `' Y0 s5 E* b mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
9 T _3 a$ D- O: K mcasp->regs->XTDM = 0x00000003; // Slots 0,1
6 l( G' ^' K9 ^ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
" P9 K, V4 D3 e# s) M mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 {4 W4 q: d6 w% r
5 g) Y% g# I/ b mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN/ g8 K) ], z+ s2 {* S
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT! X& p* a; e L7 b/ @
mcasp->regs->PFUNC = 0; // All MCASPs
+ C4 X6 {0 P5 w1 ~ mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX13 L0 c/ M* j! d" s* D, W
}8 ^6 X; J1 Q5 [: W. q- `
mcasp->regs->DITCTL = 0x00000000; // Not used n7 {- t$ \9 V; i/ f; d, j4 H
mcasp->regs->DLBCTL = 0x00000000; // Not used
0 m& S2 A1 y" ]+ ^5 Z8 Z4 m2 Q6 u mcasp->regs->AMUTE = 0x00000000; // Not used
: A9 g8 M- ^# p8 d/ j. [4 b" u; R% p( Y: Y
/* Starting sections of the McASP*/
* s( e! P* Q. e2 _1 n0 e! S7 m mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 V( D. J9 _7 m4 w: d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); - ^2 a6 Q' \4 Q# \
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! H3 l% G2 B- _* k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ h- r) p8 D" }0 p) J% t& T! y# {( D( }' W7 l
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ' Z3 T6 t5 F. o' m- j7 F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- H5 K7 l8 B. c2 W. c/ I, L mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # Z1 E* b& N! s7 g' j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) X4 n2 q& B2 U+ Q7 d" ~$ X. }5 g/ e4 Y8 k) {9 }- T$ j) @
mcasp->regs->XSTAT = 0x0000ffff;
" H! \: v7 ?" L, U5 p" B, b mcasp->regs->RSTAT = 0x0000ffff; 0 U4 y3 l6 Z- f, {2 f
0 b9 S/ M" _% C mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; ~- s& B3 W! w0 j8 [, P& l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );8 ^1 R7 T; S( a1 x
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; E$ i7 d. k; Z% f while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) v2 w' B7 ]) Y# H! j; \( J/ }: o, ~5 k6 P3 o
/* Write a 0, so that no underrun occurs after releasing the state machine */# i! M& V2 ~5 r( Q* t$ a' m
mcasp->regs->XBUF5 = 0;
0 i$ h( T# v7 h( i9 F mcasp->regs->RBUF0 = 0;9 `* L5 B, a y0 [; h
. N! W4 A1 [: c/ ]- ~/ l- j: B
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 1 h6 l" W: ?4 ?0 p# H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 s! E& w2 }+ `0 ] mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 W' ^; a. G' P- k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );, J; ~6 ?5 @' ?2 t* E
; F/ w: ?2 C( x2 Z8 W: K* [% X mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; " q: o. \8 o$ q+ C1 J, p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) J: r+ Z1 g( m4 _ U- U mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; " J" k# p- U$ c4 ~8 s) O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );7 v$ t/ z$ {9 q4 ~( _3 U
0 W, M0 E" ?% ?1 R7 C9 h CSR = 0x0000;
( ^! w6 f5 v4 l9 w- {0 g$ l, a INTC_INTMUX1 = 0x3d;2 ~3 R) V. A' b- k
ISTP = (unsigned int)vectors;2 _- U9 i+ s- `, Q
ICR = 0xFFF0;
: a* l* I( h4 O9 z/ e! b IER |= 0x12;
/ H3 F* b5 n2 C2 U, ?8 I CSR |= 0x01; ' l" d3 `* O( T6 R- d3 V8 g! F
, Q3 N1 N- ~! R$ d7 T- R, \' T0 M$ V& ^' N
: B* y& v7 f* W4 d q$ \( E* P% o
还有就是两个输入输出函数:
: C6 {5 j9 D' s+ X5 H1 |3 K6 hvoid output_sample(Int32 out_data)' X" O2 V* w4 E; { b
{
6 Y/ {( y% W9 \* D AIC31_data.uint = out_data; # w0 G: r P/ W- Y: |% M% b
MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 S& n/ ^8 b+ [}
& c6 n( X0 Z8 h: s& z5 S% L
# K/ W0 p$ Y: e* dInt32 input_sample(void)
/ L6 @5 q Q& s+ b( R2 _, K+ [{ $ }! I. }' d! Q1 B5 D4 q* r
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ c4 j, E6 j' k" ` return (AIC31_data.uint);
5 O% x0 m% D! U" \. f}
% ?* |; c( F; W+ _4 b: L5 ]% Z3 L$ W- V% F+ Q& D
|
|