|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:! ^& ^8 l, L; x* b2 E* J# H4 X5 i& \9 N
main文件:
0 I( q a0 `) C: Jinterrupt void interrupt4(void)
" E S6 A1 o8 U" f. q. ?. {{2 |) g2 R* C7 Q, j
Uint32 sample;
2 j7 C4 C" ]9 e% e
; ^6 I; K H) K8 E4 s0 m/ c sample = input_sample(); // read L + R samples from ADC
! M5 z# E/ L) X8 S& V output_sample(sample); // write L + R samples to DAC x" ?- a, R+ C: d. v/ A
return;
% E V2 f+ i$ U}2 {) t% ^$ u& l3 |. e
5 R; d2 o; w" {+ m6 Kint main( void )
/ Q3 X# I( {- A J{
5 d, V0 n9 A) P7 {
, n; }+ |' T7 S z" I /* Initialize BSL */( Q7 t$ o& b5 X5 y1 J
EVMC6747_init( );
" X! p) `, f: u [( B) N /* Call evmc6747_intr function */
7 d4 g1 w$ C/ H7 \) x+ _ aic3106_init( );
& w( c2 u+ ]9 _ while(1);; \# L; G: k, _2 U
}
: y6 _: s- v. B) i5 l0 q% M; i/ J
* ~. ^5 e+ J% A: r2 } Q
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" i6 d4 L4 W5 y, {1 U
/* Initialize MCASP1 */
$ r% b$ a# L: z. q mcasp = &MCASP_MODULE_1;# c- k; \+ K- } N8 O# p4 W
mcasp->regs->GBLCTL = 0; // Reset
" Y0 P- A& \ g! u9 K1 c mcasp->regs->RGBLCTL = 0; // Reset RX/ @+ w o* o: X8 i; K
mcasp->regs->XGBLCTL = 0; // Reset TX
u, o- E& v* Q mcasp->regs->PWRDEMU = 1; // Free-running
: H9 X" r5 P7 a+ [8 B. d // configure McASP0 receive registers
! r; P8 i! Q0 i6 y8 m: b5 n mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( r" c2 `' b/ R% Z& q0 b$ x% l mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 {; Q0 _' g+ G2 {1 O
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word, N7 N9 m2 i; z' h$ }- U
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
- V7 \; d0 L' w! ?7 [6 X mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 A" P" }' a* A- j4 S8 V3 k mcasp->regs->RTDM = 0x00000003; // Slots 0,1 N0 M. Z" p0 h8 o: D( M
mcasp->regs->RINTCTL = 0x00000000; // Not used
& E8 p; ?5 o; m( f) S6 s0 ] mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, `3 q' G" @; h9 c4 i
| I! {; z6 {3 d9 r/ H mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 n5 M5 Y, ?* X2 E9 `& { G mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) F- g( O. {+ ]- h3 c2 g mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' g" ~2 A0 u* p/ O5 k mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 Z( B& G+ A- `
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK9 w% A) i& T* L+ Z+ w
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* ?& |! Q3 w- W( v, N9 Y# b" D mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ E4 V# r3 r: [* E6 _. S- N' R mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& t8 w9 N% C5 A- j9 i# s% }7 J
6 x0 a. O2 J2 z8 G) u) O+ z) H( B
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
' C! \7 X2 `$ ^1 {- _' u$ N" p mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
! c% P0 S3 N6 l+ Q. `. N- Z mcasp->regs->PFUNC = 0; // All MCASPs
# I' Y7 |( U% r: r- b1 ] mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* G/ A, c& n% H! m* [
: Z6 Z8 a" ?4 Q; d! w mcasp->regs->DITCTL = 0x00000000; // Not used1 g% ?3 G+ m2 H& \8 F* {
mcasp->regs->DLBCTL = 0x00000000; // Not used
5 g, }- h; [, m( x# U+ a( G mcasp->regs->AMUTE = 0x00000000; // Not used6 g. d0 \ y, L0 \8 G
- |3 ?8 u( D" t5 g2 x* M/* Starting sections of the McASP*/
2 m( p- O. `$ t. u mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 3 A) }2 p: { d" T$ ~( s. k% P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
) r2 `8 h8 ~9 K1 n9 s X6 s mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; , A6 ]2 v' y8 X3 O. L' X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );" B) P/ C6 O; M, T% i
2 U4 \' \7 e( I2 G8 ]+ { ` mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 K3 R# {' b; g/ } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );" \0 ~. ?* o: N! t9 d
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 1 E5 w* _; H3 P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ I9 l. M+ Q; S( [
$ p0 j5 [% W, n! k8 q) z
mcasp->regs->XSTAT = 0x0000ffff;
, g) T, \9 I. u mcasp->regs->RSTAT = 0x0000ffff;
1 d$ j) K: B. Z( x2 ^# N6 t c5 d! P1 x% s, Y$ X0 Y( l
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 Y9 ]2 F+ l* \& x5 R while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. v1 [! q p0 J: F% X9 @0 u5 w mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ' s6 w% z: X. k. m5 B+ ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );" Y4 ]3 n9 `1 h/ @7 h+ c
6 I$ {: D3 T5 X3 \; {" Y) Q /* Write a 0, so that no underrun occurs after releasing the state machine */
5 S& c* k1 w. T: M. b- N% _ mcasp->regs->XBUF5 = 0;' P# u. i. K& W+ ?) @
mcasp->regs->RBUF0 = 0;! U# E4 E, x% A: m
! X$ @1 I' G, C- P" ^6 l i% ^
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 |: }3 C' }" ?9 D, U: _1 H B6 \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );7 \. q( ^8 y$ A5 @) K9 ~ y
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' @% S* \4 S9 W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );& @/ g: c5 h' C8 Q6 c
l7 U M; d- T, \; t
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 |9 P4 d2 A! k$ c; c# t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );" d6 S8 x/ R3 g/ {$ {
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; . e1 N8 N9 j; A! [) t( K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 y T# K7 ?6 P6 W1 J( ?: l6 m4 L- t: F4 X2 v+ ?1 _. t
CSR = 0x0000;
1 U `: X& w; e! e" N" y INTC_INTMUX1 = 0x3d;
* P& H- ^9 u" C* P. T0 D, @1 [ ISTP = (unsigned int)vectors;8 V0 n4 _/ T/ D' h1 q# E1 A
ICR = 0xFFF0;
$ V+ }3 H) B4 `3 v2 L5 A IER |= 0x12;
0 w' a% p! E% _/ O! O& ] CSR |= 0x01; * U! k2 U8 y6 x' d3 s1 @# }
/ L* s% P% Q& N3 i; ]9 S. L
3 Y5 b3 p/ i. Z- W0 d2 `' N; x2 @. v7 Q
还有就是两个输入输出函数:4 C: e+ O! N8 f
void output_sample(Int32 out_data)
7 U: B9 i) l, w" b7 B{
% v" h3 @6 ^/ ?! _ AIC31_data.uint = out_data;
; F. Y/ h7 K4 V: h7 V MCASP1_XBUF5_32BIT = AIC31_data.uint;5 k! h/ L4 w& c
}
$ R& n3 C- f7 \8 D! W4 h3 ^
& M0 i- U! N" i; j1 Q0 mInt32 input_sample(void)5 O, \0 U- ~) A7 K! K3 N
{
{3 C, Y) T0 U5 H4 t AIC31_data.uint = MCASP1_RBUF0_32BIT;
4 F( Z! F5 Y+ D5 [4 F+ u2 @ return (AIC31_data.uint); L8 o/ k' _/ c7 R( S* u' R N( I
}) }9 P$ j+ w0 ^4 \
# i& i4 G; ]5 Y- @ Q" A5 ?4 \" I |
|