|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:( l2 {4 [; {7 Z
main文件:1 j/ _# j7 Y" {0 J( o3 s
interrupt void interrupt4(void) , ?: Z4 L! ^; o3 f/ o
{2 H8 S0 n( {' }7 O" O! T
Uint32 sample;
8 F/ h% x" }* i# b$ v* E; R& h* b& y1 _) o% @9 d$ M& A
sample = input_sample(); // read L + R samples from ADC$ i) s! y& ]+ b
output_sample(sample); // write L + R samples to DAC $ ]3 b% O% a- ~) o' l
return;9 q0 `! R3 m( @; O9 m
}$ [, R" Q, z- |* ?6 c% [7 ?
6 ~% C0 ?" K& G& ]6 W) E; y1 y
int main( void )
- Z6 P, X; a2 h. g{ ^# S/ d" ~2 b, W( S5 C3 A) o
- a: o) q6 b3 f; i& v/ h- L5 d
/* Initialize BSL */, d% }: ]+ k& V6 D2 `: \: b: P
EVMC6747_init( ); H9 O; `4 T/ {* e
/* Call evmc6747_intr function */# U1 w6 a7 G" T# |" f3 @7 K
aic3106_init( );8 V: @7 E$ ~/ x& G. Q- Q2 ^* u
while(1);
8 U6 Q$ @: Q) k$ X}
1 S+ K& f+ @& h$ v# ?( j
/ Z) q# o8 h6 l6 G) @! a; Y0 i1 \ B. P- j
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题7 t; |0 ]& l5 x' x$ [
/* Initialize MCASP1 */
! C& m- l: `: A% d- i mcasp = &MCASP_MODULE_1;6 |8 p L9 Y4 W @2 z$ L/ v+ l
mcasp->regs->GBLCTL = 0; // Reset
# I8 C6 f+ K! i2 I' T mcasp->regs->RGBLCTL = 0; // Reset RX4 v6 [' e. v7 {- Y
mcasp->regs->XGBLCTL = 0; // Reset TX
3 i9 w( j6 U- Y, h0 U4 {3 x mcasp->regs->PWRDEMU = 1; // Free-running
4 a' b# s1 g2 I4 ^ Z3 A$ f // configure McASP0 receive registers
% A9 e+ G, n3 \5 }) R* V6 I mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( e6 Y: ~2 u. @; j mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, {$ n" p7 o) a6 T. i1 L3 h' `0 Q. J mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word t9 G5 [7 P! ?
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
1 d3 M$ _, d i mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)* h& p* p; E* Q; e& S
mcasp->regs->RTDM = 0x00000003; // Slots 0,1, m E& v7 g6 N( G6 ^9 t. a
mcasp->regs->RINTCTL = 0x00000000; // Not used9 e; C- j% ~+ s% b D, R8 B
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 y# ^2 d" X6 V" C+ h
1 o6 @. _* g" t/ F4 { mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used6 c/ b. V- N; |' \9 L
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
i6 a8 L4 ]$ Z; X+ g mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word; P+ }3 o7 B8 d) V4 [1 P
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16( j ]0 X; V* l4 a2 P
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK9 q- r: C# o% v e' i* D) V k [
mcasp->regs->XTDM = 0x00000003; // Slots 0,12 T0 v1 q$ F5 ]+ b; M; v' N- j
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
0 C# i& j. `3 m6 N mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 y/ z0 o3 Q: |: C8 V
- v( Q: L' L& [( |8 H mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN! A7 v% ~& Z8 x2 x# ]
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT' ?1 C5 X" O$ N
mcasp->regs->PFUNC = 0; // All MCASPs) O6 E, r3 k$ D* W3 f; c
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. ~/ X: A! c, e" e. J) Z2 v
" [1 d, G5 v1 l6 T$ j) \- I- \ mcasp->regs->DITCTL = 0x00000000; // Not used
3 O( C! d3 m8 z+ ~& P' Q( U' W' | mcasp->regs->DLBCTL = 0x00000000; // Not used# z* W' T1 u; J$ F9 r! S1 C
mcasp->regs->AMUTE = 0x00000000; // Not used, s# E a7 t. ^ X. E, d5 a
% U3 `; G" Q9 H& i
/* Starting sections of the McASP*/
0 L0 t& s9 r0 P! x7 m mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ B. i' o* y% V: ~) Q! ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 t( P2 H# M9 J/ ~' X4 Z mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 }4 A/ t$ S J* V, ~/ V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ E( n+ ]7 a7 Y0 z5 M' N: P4 m9 c) i4 p$ F. P
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , Q# c+ I" P. C8 j1 ~/ j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! T4 T& Y5 f: B) q' L9 k4 L$ l/ e mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 3 k- h. i% {/ I3 k0 ^/ ?- B6 u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 L7 j8 i) p0 g$ p' O4 ]) O; D3 d! y' t2 V5 c) R- i
mcasp->regs->XSTAT = 0x0000ffff;
1 l4 b" ?: M @3 z& t, H mcasp->regs->RSTAT = 0x0000ffff;
; C$ ~: E* K4 s+ h% e) `
3 |$ \9 \ t, B2 M, H mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( r3 U" p/ _5 L" L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );. L% J# q' f5 B7 r+ k" \. R
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" L8 C! k Q* G7 e6 h7 O while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ W7 h; y. j. u6 S+ p/ ^: v3 o# h: P
+ V0 U' T. r$ D# n5 _8 d /* Write a 0, so that no underrun occurs after releasing the state machine */
& x# R! p+ k9 r ^4 N mcasp->regs->XBUF5 = 0;
9 z2 S/ \7 |8 _8 b" j' K mcasp->regs->RBUF0 = 0;
, Y+ O7 X0 m$ K0 E. t* H6 r7 O+ E2 Z" ^
K* `: B# Z( _ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' R& Q; J0 h4 C! a( _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" ?4 d$ x1 b' _- R: w: K( m mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 0 G8 N- P5 O* P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
; x- M; l7 H' I& n6 s! B+ @/ l8 y' w6 I) d4 ]) b& U
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( z5 c- f4 w7 l* f B6 Z3 X* [+ a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 ?' ^) ~1 q5 Z) g& d mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( |1 ^1 }" z9 v" j" G$ ` while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' d1 u# f3 i$ X: c6 D9 v- P
0 M5 c0 {" a ~5 A! v CSR = 0x0000;
, V9 A7 ]+ S v INTC_INTMUX1 = 0x3d;8 ], \2 q D6 v9 [$ A1 C1 M& H
ISTP = (unsigned int)vectors;
, x! q+ E* M4 m( _. n7 W ICR = 0xFFF0; # S% u! G+ S) {) Y, K, g
IER |= 0x12; 6 J, D3 ]" y- z P6 [
CSR |= 0x01; * t% o7 Z1 z0 e
( H% l: m) C9 M8 K* h. X5 X7 m
- K/ l7 K6 p1 P; t- I, K5 T$ A# U
; L- b/ j# W- E
还有就是两个输入输出函数:5 w7 f- Z2 m4 _3 m( j b0 e+ N/ t: Q
void output_sample(Int32 out_data)
) D7 [0 L' [! Y0 h{
/ I! C& M9 X2 W3 c3 ` AIC31_data.uint = out_data; 6 f* u% H7 |4 _/ s+ G2 c5 R# t
MCASP1_XBUF5_32BIT = AIC31_data.uint;" X8 H5 r; m- g1 o, ^1 ]
}
2 s4 P5 P- p9 \
- L1 i' N" c0 d( Y9 QInt32 input_sample(void)
7 V: d5 E8 |9 N- \$ s) U4 V; a{ ; G9 j U) L j2 }5 G2 G
AIC31_data.uint = MCASP1_RBUF0_32BIT;
3 R$ h1 f4 k0 g) e5 m, T8 _( X' s return (AIC31_data.uint);
/ A8 e' ^9 a2 a1 o}. t. A! D$ Z3 o3 o0 l' B
; X* B- U6 J: d9 _% Q1 ~ |
|