|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
) \; O* {( l% }main文件:8 w, D0 j& g" o5 r3 `9 k! u6 c
interrupt void interrupt4(void)
- V. \7 x. u: w2 H9 z0 K{
' I4 ]8 z7 d$ m. S. ^, K Uint32 sample;8 F- {& U. f! ]9 z
1 u7 A8 C; x) ~/ x; H
sample = input_sample(); // read L + R samples from ADC
) t1 ^) V X4 f) [% f output_sample(sample); // write L + R samples to DAC 3 W& B7 ^2 V( i* J% `" ~; v" h
return;
$ Q4 ^+ i, u, V}; E8 X% x: U: Y8 ~6 I# r, n& `
; f1 k1 a7 O) y1 E( D0 g
int main( void )
4 k4 A5 }3 A. U7 V: o{0 k2 [) H8 A+ [; j+ L. d# L3 C% B
9 N' L. i t' q% e9 @
/* Initialize BSL */
4 K2 f# k$ ]! u- A; m! Z4 m) ~& ^ EVMC6747_init( );. C. V/ U' T0 {' ?0 K/ y5 d f
/* Call evmc6747_intr function */
, D1 o* b+ g' @2 o4 T) S+ ? aic3106_init( );9 G1 X) e( E% V% | @+ L. n1 ]; X6 v
while(1);( i1 J- [! k, L
}
2 n2 A2 }% @$ [$ p X
' {# G2 c: ?2 j) q6 J. O) }# W7 \0 y# t% p, i6 S7 n
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题5 v( \ x' m! c; f
/* Initialize MCASP1 */+ z, C: @1 g6 M+ D4 j
mcasp = &MCASP_MODULE_1;$ P, U2 _6 D* J' s1 d0 K$ [" p
mcasp->regs->GBLCTL = 0; // Reset
" D- R( b, u2 S4 W+ S mcasp->regs->RGBLCTL = 0; // Reset RX
/ q8 ]" E+ X' M mcasp->regs->XGBLCTL = 0; // Reset TX( m- Z/ z+ _) r/ i! F
mcasp->regs->PWRDEMU = 1; // Free-running
2 K2 T+ d1 S, |0 s1 X- U // configure McASP0 receive registers
+ p p/ c6 S6 _# N/ q7 N mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* O4 L9 U" Q5 w/ s% O4 A; @: Q
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# g+ I6 R' _$ d9 k! v- e
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
& F) h* {# M. J' z mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
- }( U- U$ q/ N- T mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)( L4 z1 Q: G8 m6 o8 {: m+ T t
mcasp->regs->RTDM = 0x00000003; // Slots 0,1# { H2 }2 |2 B9 e* Z; A
mcasp->regs->RINTCTL = 0x00000000; // Not used
6 f8 M6 a: ?3 f6 T. z mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' e- R9 x8 s/ g5 l/ X' B# I
( v& a" I! N; W. V: e+ Y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used( k. ~" P4 I0 Z# _$ _; B2 E
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 s( n1 y6 L6 a
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
0 y. |7 c' {6 k2 j+ w" |% S mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 A5 P4 @$ v& U- f% n
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK4 V7 G0 T2 Q7 @/ b3 s4 P
mcasp->regs->XTDM = 0x00000003; // Slots 0,16 H' M8 [7 c8 H5 |7 Q0 _' v' v* Y9 ?
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit, s; Y& O! R4 P
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, r6 m7 w& b1 G2 `6 j0 W( W% K
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN! P1 K$ D) z3 ?" b$ J
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
! m# P: I( B' k. L" \ mcasp->regs->PFUNC = 0; // All MCASPs
5 s, r6 `& l- n8 ~1 } mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: K4 ~( k% x9 S3 S, e4 G3 }& L
, p( p9 S. W8 b9 c! [5 p mcasp->regs->DITCTL = 0x00000000; // Not used+ `1 z2 B- p9 Z5 T& h
mcasp->regs->DLBCTL = 0x00000000; // Not used6 d, K1 G2 G" ~) }" Y8 [7 }
mcasp->regs->AMUTE = 0x00000000; // Not used' R6 X# x# K$ ?2 J+ t
, Q' _' p8 r P, w: E6 }/* Starting sections of the McASP*/
2 V+ Y3 c; L' {; z1 N. @ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 e9 X; D6 [1 N: q% u while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
1 `. E; j; E+ H mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; . r9 P' U* y5 ]+ ~5 O: i+ c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 a/ r7 Y1 c5 z- T1 Q' u# l: p2 [3 q0 S g6 j0 J
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; " X, y+ O: Z/ _# K! {6 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 `. G3 O1 V# Y& x- ^7 p" S mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ; K6 b1 w0 K$ [& m- h% S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) _8 @) _6 t8 E. r& h
4 E: Q7 ?: q- U mcasp->regs->XSTAT = 0x0000ffff; 7 o& X2 E1 R* |9 b ^: b! g2 G
mcasp->regs->RSTAT = 0x0000ffff; + T4 Y& ]7 z, K( s
# ~ |+ W, j I* _# m mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;( b; |1 U# T- E( e! ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) w# y9 H% S' r5 c7 w! c
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ( s( L& l$ _% u% k! F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );8 D* n$ W/ ?* D* [" G
4 ^' Y) `( l% H2 z ? /* Write a 0, so that no underrun occurs after releasing the state machine */
. i7 |+ w9 v8 {( t4 O' {" d mcasp->regs->XBUF5 = 0;
& o% P3 o% ^4 x% V7 H mcasp->regs->RBUF0 = 0;
+ _; Z; l3 i, S2 Z* w% Z* l2 A) G4 k1 C: e6 ^
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" w/ [- _. V n, E4 [ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON ); W2 Z# s7 J: O0 } s+ S& _
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; E i3 Q x; B0 ] v. g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );- h+ q0 D/ M* |$ I
+ F8 r, U7 d- e( _
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! u z9 t/ v- a# J/ F4 r& }: s2 w" {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# |+ F( M7 L8 X5 K5 \ |8 O0 T( [ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 `3 I' q% g! L9 p* d" L3 p while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) k( d2 M: j; u5 \! @
* R+ L+ w) `' l- ]
CSR = 0x0000;4 J4 K w5 N$ V4 S" O4 Y
INTC_INTMUX1 = 0x3d;: k: M5 x" f0 Q3 w( g
ISTP = (unsigned int)vectors;4 {! _: s0 n/ P' Z6 S0 U
ICR = 0xFFF0; + d6 ~* z4 |1 M
IER |= 0x12;
. A m7 n: h% y( `2 y/ y! X CSR |= 0x01; ' K) Z# p7 G: c, U
; U/ X9 j! ^& `' R p4 T
6 V" N$ J. M, W1 c; P' {# ~ a$ f* m, |# \
还有就是两个输入输出函数:
6 @& _) _4 e6 M0 Evoid output_sample(Int32 out_data)" [7 n' a; ?& u- D) B
{
# c0 c5 R u! b X- J$ F AIC31_data.uint = out_data; O7 m8 E3 ~7 m, ~1 J& w
MCASP1_XBUF5_32BIT = AIC31_data.uint;
, |8 W" O1 W" q' l$ Z}+ Y9 ^' e; o2 C8 T4 D
# z8 O8 {3 N, p( k9 t3 rInt32 input_sample(void)
) V* E* |$ I2 L" c. t8 D7 X{ / J7 d6 V9 O9 R
AIC31_data.uint = MCASP1_RBUF0_32BIT;
" w) t5 ^, ^2 w' e7 S return (AIC31_data.uint);0 v/ p, s( R2 i( c
}/ ~; t" c- u7 K
3 ~0 v3 q t" {+ {) ?& D
|
|