|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 Y5 E" f2 `3 Z' ]% Tmain文件:, `# S; R o3 {
interrupt void interrupt4(void) 3 m& Y+ k6 V# q. K$ ?/ `
{$ r' U- b& r, g* P0 a+ v4 \
Uint32 sample;( }' J; c: g3 i f
( t5 h* Y0 i. P9 u M* x
sample = input_sample(); // read L + R samples from ADC( K& w% {* m. S3 N i* q- o6 k! m
output_sample(sample); // write L + R samples to DAC
; i: i! M% q: N return;
7 A* z" ` l- t$ P+ j}4 w3 B: s( I; J
$ Z# F1 x# F1 w% V ~) u b( u* \int main( void )8 ^2 l; q4 x, @+ I0 C, B5 I8 M6 w8 i
{
: G5 a2 ~0 v! P! N
4 A7 Z$ u: D( `, n" l1 m& H& K /* Initialize BSL */
; g0 K* I* ^2 H. u' u EVMC6747_init( );1 g# l p( ~9 P* v
/* Call evmc6747_intr function */
7 u$ x: g8 S1 ^( C/ a: b: _7 u aic3106_init( );
1 }7 @8 k& I8 H! R- n) q while(1);7 |& e/ \" v6 Z! H4 B* S
}
, ~3 k1 e7 d2 }
, O- | }5 X5 p: ~# n* r/ Q, r$ }9 f4 q8 u
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 j# q! o6 o9 }) a/* Initialize MCASP1 */
5 o& }, Q, W8 J/ x mcasp = &MCASP_MODULE_1;
! _7 J* P! E! H! Z6 @; E# r mcasp->regs->GBLCTL = 0; // Reset
* @" r5 [% h. [2 T! w& ~ mcasp->regs->RGBLCTL = 0; // Reset RX7 P+ W9 s/ v/ @7 i7 N5 x
mcasp->regs->XGBLCTL = 0; // Reset TX2 c5 m2 S: x% b
mcasp->regs->PWRDEMU = 1; // Free-running
: A) l& b) e/ z' c1 i; I3 A // configure McASP0 receive registers
5 X+ m/ ~4 _6 x0 }; B mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used$ t& O6 e0 U3 ?& z: P: p9 U
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 j. u7 t7 W+ ~) r8 y mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
& T8 X- L1 B5 }( ~0 @! C mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' f( q0 v, l7 x+ \4 T, V mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
8 F+ H7 l6 h9 C4 s5 y( N. R# S mcasp->regs->RTDM = 0x00000003; // Slots 0,12 x( h" u9 E: m' M' @
mcasp->regs->RINTCTL = 0x00000000; // Not used
: i0 G' [4 I! j, o, m mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ P( f/ ]; i/ \0 Z) r0 q
* O" \* p: u1 D: q. L mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used9 [6 V% j1 [: i J! r- z; T
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 ]6 N' m* O* N& S- e6 [
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* Z4 |. h5 J% h0 o: a: S, m
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16. Z+ Y% ]$ o& V( S2 L1 n
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK0 B" V5 l& e* F+ h; L( h- Z' |
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. r, _9 J' |3 q/ G mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, m& s! |9 m3 P" }5 `8 w8 |2 ] mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 {' I$ A1 L( z4 k/ w, ~, f- m
1 E$ a! p" B! d- q' I2 o mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 h' ]1 k1 B+ k8 N2 a- {5 ?# n mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT& w! K6 ~* }0 s
mcasp->regs->PFUNC = 0; // All MCASPs: k5 x f, w/ B0 ?5 d
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 u4 i0 q! Q4 u- g h
" l, F6 n+ L( c& t0 ] mcasp->regs->DITCTL = 0x00000000; // Not used
k3 `. n, t7 Y3 c0 ]* Q; r mcasp->regs->DLBCTL = 0x00000000; // Not used# ?2 }0 ~" V1 {3 A
mcasp->regs->AMUTE = 0x00000000; // Not used( l. Q, q' L- y7 t- {, q) O
0 d. T& }8 W* q& S7 x
/* Starting sections of the McASP*/+ ?6 o0 m4 z$ u, ]
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# ^& u$ F6 p7 S1 C while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 6 o8 F4 Q. \4 w# K6 w
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( k u0 [1 F9 _* J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
M+ f3 c3 X9 m* _, q, W+ ?6 f/ l @3 ^' p6 J5 G
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. |3 U% o) C9 w6 s/ p2 V# u while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 k! P/ A. ^/ y* ^+ ~ mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- u! w: y+ V; y6 C' }. M2 q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
2 Q7 k/ r% V- z( m, h( T8 G! M2 J$ q$ p$ N
mcasp->regs->XSTAT = 0x0000ffff; 6 V! q" c K+ i
mcasp->regs->RSTAT = 0x0000ffff; 9 N3 @$ w- @: }0 [% f
( f2 b% U$ ^/ l8 W @% A& ~. J; _9 B mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 O" P( Y" {% A, k+ X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );# \" ]/ O$ b' o/ o
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ c Y8 \$ P0 m' h/ s2 { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 G$ z; q/ I& L! @
. C6 R _) K) p1 I6 _ /* Write a 0, so that no underrun occurs after releasing the state machine */! e- |9 X1 |/ b o* i7 o; C4 ]+ H
mcasp->regs->XBUF5 = 0;+ t% g. a# e8 f0 ?; J2 h
mcasp->regs->RBUF0 = 0;7 o: w5 w. x, u0 g
7 _# S: B# |, A- B( R- j: a
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 U& m0 p5 W' B8 [5 A/ N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 x2 I7 w; v$ [. L' A( | mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; + V1 u. N1 c5 ? e$ L! T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( h' ?# G- W9 W. Q" m, K
8 O' h5 G3 g, x" N mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
B. c- t) i8 x5 Y3 f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 b: s' `4 z' e$ S mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 5 c" C0 B7 D9 z0 y) R& U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );! S$ o5 v1 `8 `. C8 |
7 n0 H* I/ R8 |. P n$ P) a CSR = 0x0000;
' r; e. l3 ^9 o! m INTC_INTMUX1 = 0x3d;
^+ E c* F! v1 R ISTP = (unsigned int)vectors;
9 ~: Y3 H) L" ^/ ?. G$ Q1 C ICR = 0xFFF0; 5 c8 b# }: o8 V3 w; k" l! {
IER |= 0x12;
/ h, a, f+ s g; ]' Y F7 U# G& h/ _ CSR |= 0x01;
* t' C7 ~: o0 X9 k8 E& a; n9 s% x
0 _% w7 L1 t' U, |, `4 i4 u( O# h7 Q+ A6 i U
# l! b0 o( D" e7 s* @. K
还有就是两个输入输出函数:( Z2 l9 \9 W0 n0 z3 L. d# i+ G, |. p3 X
void output_sample(Int32 out_data): J* Q2 V4 p) A( U: j
{
- x8 [% N1 e& _6 b1 Z* @ AIC31_data.uint = out_data; ! U* v9 T' ]( B1 E* b1 C
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) [( F) {7 N, z* ?! c% g S}# [, ]! t2 B, f: I
: f5 y7 o: ~) x4 L# {0 r/ @6 u
Int32 input_sample(void)0 v1 O* b2 `" r9 R \
{
3 ^, q: A. q: D6 G, B! K0 y AIC31_data.uint = MCASP1_RBUF0_32BIT;
: Q- V5 d) u8 D% C, K N6 Q return (AIC31_data.uint);
8 ~; i9 ^% A# q7 Z) n( L0 e}
0 J0 Z* q4 n z- z* [6 F4 E J- Z- z M; I% n) }
|
|