|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 a9 p& F9 r. S: S, F$ M) J, l
main文件:: ?6 X+ C& F' j/ }0 X% s6 d/ b; L
interrupt void interrupt4(void)
/ Q1 R5 z( J- s4 S8 Q{5 ]8 u T: L. S: r% D
Uint32 sample;! z3 R& H& @4 X0 z3 c- J/ @7 m
' S) E/ }. x; k# K0 R4 D
sample = input_sample(); // read L + R samples from ADC9 A# F6 J$ q: [; I- e
output_sample(sample); // write L + R samples to DAC / L. R) A r: ~# r
return;# V+ |, }" t% v
}0 V1 e7 Q/ U" ^" r- z, h
% R4 c c+ i) k3 {! m9 {0 R4 |int main( void )
0 }1 L5 [/ P8 h# Z0 d9 H{8 U3 _" N$ a9 i# ^
& U; b( v @. e, y
/* Initialize BSL */
, O! ?- K b* F( K% w EVMC6747_init( );
% v$ x# p/ q, V$ j4 t8 G/ y /* Call evmc6747_intr function *// H( u: ~+ x) ]/ ^( C
aic3106_init( );
+ I4 L2 a- N6 O) i- T1 C8 o" P while(1);/ B# P/ |9 @/ F+ K: A! b
}
/ u, Q: c5 \( V* B4 Q t
1 _2 e' y1 e* Y% t
3 T/ G& N! k3 ^- P( r4 k: Iaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) K# ]# L/ \1 V" k9 |/* Initialize MCASP1 */
$ e9 h3 l/ f( }3 Z8 k mcasp = &MCASP_MODULE_1;6 n6 a/ n$ ?0 u" p5 ?
mcasp->regs->GBLCTL = 0; // Reset2 U2 H: W$ n, O; H1 ]4 `. r
mcasp->regs->RGBLCTL = 0; // Reset RX
/ ^1 M+ J3 _! h: _( M mcasp->regs->XGBLCTL = 0; // Reset TX) R5 H( ]" T8 W7 S4 }- z8 J) @: l
mcasp->regs->PWRDEMU = 1; // Free-running
2 h' x* ^1 v/ C) X, |4 D // configure McASP0 receive registers* h0 J/ l0 E+ ~; I$ E
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used/ N. `- J m$ [! x
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ }$ G. V' I2 z2 w/ C, f4 M6 U5 V
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 q3 w8 C4 g+ Q: E( p mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ Z J7 X7 |# c. Z8 n mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side): ]7 p2 f: f {1 h3 m* x j
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 K) Q/ c1 @9 D% o( y3 w mcasp->regs->RINTCTL = 0x00000000; // Not used
5 n8 Y6 w" Y: P/ e. l mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# R' k9 U* f7 K% {+ Z* f3 ^' y: ?4 \% u( E! Q
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
+ M/ K* J P8 V( a% I9 ] mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 l% ^* i# B& @: x, h mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ f* W" Q. o/ l3 V mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 _/ h6 ?3 K4 v1 ~/ X
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" A- B( f* O2 U/ F mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ |1 g: k# U4 G+ G$ z mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
8 \5 X2 ^4 Y0 h% `7 {! E$ E mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- }2 T* J* J+ ]- {- v' j4 g$ B9 y
! X! m, t4 \$ H" V6 u/ Z
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN/ D7 D- i7 r* [ t! x, `
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
* s# o) v: ^( l9 y* @ mcasp->regs->PFUNC = 0; // All MCASPs
/ j! \0 X% f3 i9 y0 \ mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 M7 a- a5 N8 }, U# H' m4 G+ q/ s2 B
mcasp->regs->DITCTL = 0x00000000; // Not used
6 ~' A( K% f, i mcasp->regs->DLBCTL = 0x00000000; // Not used$ o+ m8 c; F5 r m" o" v
mcasp->regs->AMUTE = 0x00000000; // Not used! ~4 }6 ^- x+ }4 J) `
4 T- k4 S$ h2 Y* w: [# }/* Starting sections of the McASP*/: P& L# v; Z$ f
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 k H( G1 O( S/ E+ a& h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); $ v" n) w$ `- N7 N; g
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 J) M: ~' ]" @( Y' g- z- c5 y0 | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 g/ [% L' O6 P8 X9 H
, ^- i( V7 a2 b/ J9 P& ?
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 T+ R3 D8 L0 g4 i* \1 _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 f# @" X, i& i$ a
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 ~$ O8 P0 H& A6 C. L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 [3 |" G; e Y$ b/ Q$ g% U& d1 J6 Y
1 s6 h7 t# E- c$ I/ I& l mcasp->regs->XSTAT = 0x0000ffff;
: Q4 L B: m# L mcasp->regs->RSTAT = 0x0000ffff; ) ?$ ^: i4 g1 \0 I6 F
, R4 {1 V9 \4 e+ | mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 [) k, M# | B& K+ m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );, [) V! I- D8 C4 n6 {1 O$ a$ Y
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; + [8 l: l8 O3 _; v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 Z2 i6 G, r* j0 l p
7 q0 n: t/ h6 |5 L# R$ L
/* Write a 0, so that no underrun occurs after releasing the state machine */
V* J! u; \& o+ V" d* R) _ mcasp->regs->XBUF5 = 0;
6 v* O; Q d0 m6 ~3 n mcasp->regs->RBUF0 = 0;$ m$ U" J+ c" I8 i9 u( m
: d- g$ D% p. r mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 L9 Z: [9 E/ ^7 l, Z! q4 Q1 W" u while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- R9 t/ d$ M( \7 @5 [% i% c mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ! E+ k9 K6 M: {/ U/ N6 k ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 B- r( Q# s$ p6 e
3 y4 r# t1 Z4 I! Z E+ [ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 n, v' r$ r: @ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );: L* b8 U0 I L2 F, k4 ]' X) x
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! f; I5 A( u0 V! n) L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );0 x6 j" A( j4 G- e. E
5 v) x6 r* D( O( } CSR = 0x0000; d2 b6 m, _5 k; e/ \
INTC_INTMUX1 = 0x3d;9 c( j1 h& h: K3 u Y, F
ISTP = (unsigned int)vectors;
6 G% X0 c9 E3 W' @! \0 E- A5 }% p ICR = 0xFFF0; ; y4 _$ Q( D ]4 _
IER |= 0x12; 3 U" P. M+ b; ~' d! @- d
CSR |= 0x01;
' l7 O9 f3 Z8 p2 ~' J6 s
& p; Q4 M3 l4 k) W3 J
% T" W+ F( Z' u$ i% W8 f$ Y
?- M# N8 {" Q) f还有就是两个输入输出函数:
( }+ g* j+ j7 _# tvoid output_sample(Int32 out_data)
, w3 E, f2 U% @* {7 G' E{
: z! c" {' u/ s( [0 j1 j AIC31_data.uint = out_data; 6 {5 i; k7 G5 S# O
MCASP1_XBUF5_32BIT = AIC31_data.uint;. ]$ {6 E0 P1 q- Z: `7 B+ w/ p, n
}( k4 e9 b8 {6 k. e
6 p) Y( L$ p6 K# V$ k) pInt32 input_sample(void)2 O9 f( y8 k% [5 |8 Y
{
& M2 V9 M7 K* j$ {/ o2 V6 x- H7 A AIC31_data.uint = MCASP1_RBUF0_32BIT;
0 v3 W9 D5 j2 K9 G8 ]9 g2 c l return (AIC31_data.uint);& z2 w& u) o- b6 P, x2 v5 p
}
# P9 k2 }/ X. `- Q1 q- C
+ j0 v! _6 |$ b" e3 X5 { |
|