|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:7 D/ ?, I z6 y! f: d
main文件:- S+ L" F$ @2 @) n1 S, g( e: p# n
interrupt void interrupt4(void)
$ [* C: @: V) `3 E( @. ~; ^& Z{
+ o/ T" i. b- s# |/ [) i+ d Uint32 sample;0 o5 A4 G' n; \
3 I) C% ?* K* m' J
sample = input_sample(); // read L + R samples from ADC
# U- Q' o3 _: V( ~' S output_sample(sample); // write L + R samples to DAC
8 f1 z' G" I9 R9 M% E2 [0 \- q& n7 E& N return;9 T2 G) |5 `0 O' p2 ?
}3 o' h( A. `. ~# k; t
( Z1 D, K: o+ |) L
int main( void )
2 Z# Y7 o3 q4 p, _/ p{
/ F6 H' X& j' @6 n/ @" f
! w: w$ R7 z0 V6 [) i /* Initialize BSL */
, r N4 V! r8 J EVMC6747_init( );% o8 Z& ]3 Y+ z9 R
/* Call evmc6747_intr function */
+ e$ z; l) z/ n3 _ aic3106_init( );# e6 N% A/ B3 p4 b. q
while(1);: X, l3 P7 o. y# W
}
$ i( q8 p3 c" J9 p O/ @8 ^2 ?3 Y( n8 L! ?- T V/ }8 C" r/ I/ g7 f% t
8 ?( u7 u1 l- ~: c ] ~7 Saic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( z) P% d5 b1 r# a8 K. k
/* Initialize MCASP1 */$ _* g# y0 u8 y9 W
mcasp = &MCASP_MODULE_1;
, r) Z( J( v4 T0 f2 T mcasp->regs->GBLCTL = 0; // Reset
! S* c9 u6 c7 ?( P9 s/ \- t! Z% e5 O mcasp->regs->RGBLCTL = 0; // Reset RX/ N$ v r" Y2 U: g2 y. R5 X7 A
mcasp->regs->XGBLCTL = 0; // Reset TX
2 B6 ?& G" m3 i, s4 ], R" K mcasp->regs->PWRDEMU = 1; // Free-running
* S, n. A+ s0 t2 ?$ ^ // configure McASP0 receive registers
4 P( g" ~ r$ t7 X) E y3 x mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used, G% S! d! d0 ]+ q7 Q$ N3 T
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ h& @ S3 ~1 J" [& \ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ F* `# I4 d* d3 |- M- z mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 S* d: O0 T& m; ` mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)5 w% ^" W/ V3 G! U1 z
mcasp->regs->RTDM = 0x00000003; // Slots 0,10 H0 x+ i9 Y" ] J; z7 H; D
mcasp->regs->RINTCTL = 0x00000000; // Not used
$ L* Z( ~5 A" a' v8 d mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# x0 T6 U! ]. G3 b/ W( }
3 `3 M4 q% Z8 H# f
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 \4 @1 t, I M7 D* V8 V mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( _ L/ u+ K7 a* O mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 }/ N4 z$ k: ^5 ?! y5 z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ H7 a, A. C1 F/ b5 u) ~, } mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" x+ r; K6 V a5 K9 N1 }( g+ C mcasp->regs->XTDM = 0x00000003; // Slots 0,1% L6 S, ~% J" P, j( w
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit8 q# `/ p4 q$ \7 E$ O8 l5 |" s3 J! V7 \
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ D0 E- U' [: F5 |" H. T$ ^4 `
& l1 l+ d% W( I
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN4 P. v3 {$ L" O! Z6 b
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
8 L- O* U0 W4 c mcasp->regs->PFUNC = 0; // All MCASPs' s$ _2 G4 e0 B' v* L0 Q* U
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ I" w I4 J' r! s6 j7 N
4 w* f' J a: ]7 z: S5 f mcasp->regs->DITCTL = 0x00000000; // Not used8 G% S! X W w- ~* E! E
mcasp->regs->DLBCTL = 0x00000000; // Not used
8 q6 r3 V6 B5 I0 r% X: \2 Z mcasp->regs->AMUTE = 0x00000000; // Not used
1 u6 B3 {; A2 ?; ?+ O/ [" U
9 q6 f$ W- f" Q# }5 d* ?/ H" W, I* I/* Starting sections of the McASP*/
0 C: H5 @4 P2 E mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , {- V5 n; B5 t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 a; A2 R+ _+ Z; }( L8 W- _6 ^' r mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! o3 A) [! Z3 v1 w* h& j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, k7 }9 P) \' J8 K8 w
' @' `7 H1 l2 j y3 ^5 f/ M+ Z: n mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 g/ U, d! ]) K9 c* u s3 w. N- y6 } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );' N# r. H7 s m6 W: D. O8 \
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; : W' s8 G4 g( `* j4 q. c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
2 L) J* _0 C& N( x4 Y# B: Z" D8 S* F1 Q. \4 q" p* l
mcasp->regs->XSTAT = 0x0000ffff;
1 b9 N4 G. W1 d* w. P% M0 n6 o mcasp->regs->RSTAT = 0x0000ffff;
* w+ Q$ L( w* a" y- k1 {+ |2 x& S) b5 H
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;' A) b; A$ n9 W. _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 Q3 D5 G; o7 C8 L2 o/ ~ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; * P; d% g3 y7 V# I4 E! K$ O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 x4 m7 I; J, r% G( p5 ?
! J3 o1 ~- g6 c4 t- _& u /* Write a 0, so that no underrun occurs after releasing the state machine */
# P' v( k( Q- H' E. } mcasp->regs->XBUF5 = 0;
% R. x4 Y; C8 `3 b mcasp->regs->RBUF0 = 0;3 c9 W z1 q+ L+ F- m
: G" a; [$ y$ ?3 A
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
/ E- j' [: j6 t7 I8 Y% M7 e2 ^ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );# M& C! O7 y/ H* t6 f% m# X5 @
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 2 A2 r3 \. Y% w8 E# k- t+ E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' `2 m: v0 r; I2 K
' l0 I* }8 o. C | mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; * A, Z3 |3 J: R$ i ?5 h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
t3 Y6 J) A T1 S4 a2 g9 d mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 5 R5 O6 _$ h; U3 Z& k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- a+ j+ a, a$ G) V Q5 a \; R3 L
8 q' y- |: ]% R( D) B CSR = 0x0000;
5 a/ I# q: M8 w# n INTC_INTMUX1 = 0x3d;+ V0 j8 ^' \* f! A
ISTP = (unsigned int)vectors;
% ]) W L0 Q# G4 `# o; T: p ICR = 0xFFF0;
) K, p# o/ t. W! q IER |= 0x12; : W5 F0 ?9 h, |3 t* V) r
CSR |= 0x01;
# v/ _* @6 m) g9 z' C, P( L/ u
' A6 U. L2 q+ l4 Z$ ^3 W+ V! d! ]$ o- `: W1 d7 s
3 r6 a. u V3 l
还有就是两个输入输出函数:
) c2 k1 Q' G8 V- |3 Q! q7 c/ b0 i) Nvoid output_sample(Int32 out_data)) G6 Q2 v( v1 H* P4 q0 [4 H: V
{
' J7 B7 U% g2 U! R AIC31_data.uint = out_data; / {+ K0 K0 j4 u/ X6 g% o! ]+ m
MCASP1_XBUF5_32BIT = AIC31_data.uint;
& a$ o+ D( C; q( v! ?}
! |2 o! W3 z6 \" `
8 X5 M( v, p! q- S6 t4 rInt32 input_sample(void)
~. j; X2 |( Q; i# [{
0 f' q3 _; \. ]5 ^ AIC31_data.uint = MCASP1_RBUF0_32BIT;
j! q2 r& m4 f return (AIC31_data.uint);9 L0 \) T/ P( D2 _% a
}7 s3 n. ~' c! Z' K8 T5 f5 x# ]% w
! D1 h R' ^, X; v2 r5 k
|
|