|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, y# h! q! Y+ l: s, Fmain文件: ?4 n3 Y) m- i7 }
interrupt void interrupt4(void) 7 `2 g3 B* Y G, X% k0 g
{; N0 F* H O5 U
Uint32 sample;
% ]% @( [; }7 N" T" h; @3 S0 }$ I( {% [
sample = input_sample(); // read L + R samples from ADC
" x8 i% n; y1 {& z) G: b$ w- L! O output_sample(sample); // write L + R samples to DAC 3 D. }& o V% b% j+ J+ H+ O& r. p% C
return;
/ F y9 w0 r, H6 E}" n8 c" b" J: l! ?: {: a$ c8 F! ~
0 t$ v* Q/ k7 cint main( void )
9 [- `/ M) Y# d5 c6 K: d4 n) G2 U. ~{9 r' i. s) _% D) B% h
7 r/ {+ |, U6 D. \; U5 V, R3 \3 \9 t
/* Initialize BSL */
" ~. n) v! o& e/ T# h$ i EVMC6747_init( );2 A' a4 a8 ]1 A8 E6 a
/* Call evmc6747_intr function *// U7 x" }9 G) J |# p; f% s
aic3106_init( );
1 V* N: p4 z8 j3 [ while(1);
% u n) d# C7 a0 Y: s+ |) S& V}( d4 R* V/ _. ^# w0 t' X2 P
9 T5 j9 E$ d: q# H8 R5 n2 e
0 U' |2 g2 ]* H- A: Laic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
: a j" ]5 A. |3 T0 ]! Z/* Initialize MCASP1 */! E5 Q& Y0 p( R6 o& e- f- I
mcasp = &MCASP_MODULE_1;. ?7 O; p$ v% K. h
mcasp->regs->GBLCTL = 0; // Reset
% ~& d( ?: M9 W6 `1 P9 z4 b mcasp->regs->RGBLCTL = 0; // Reset RX+ [% |9 W/ z% Y
mcasp->regs->XGBLCTL = 0; // Reset TX
3 B* f0 t" v& A1 T+ d x9 B7 ] mcasp->regs->PWRDEMU = 1; // Free-running
; t: v+ i( \1 ?( ?- E/ ~* I // configure McASP0 receive registers: O! j8 N+ j* `, E3 K [) l
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
4 j+ q0 N( w( {* G& j mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 q* T+ O4 F$ B0 @6 b4 [% ? B0 L0 o mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ g% f$ B& [% [
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' ]. H5 a8 W$ G. Q4 f1 Q7 J mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)8 M, }$ a0 R3 a [: j T' ]* B
mcasp->regs->RTDM = 0x00000003; // Slots 0,1- I W! Z9 d' u1 |8 S7 b, o2 |
mcasp->regs->RINTCTL = 0x00000000; // Not used1 d$ j. R& C) Z0 L9 F
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! U' T, @* K* o% w
$ R/ x8 @$ u( V- b/ V0 o4 W mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used a( B# }/ H8 k8 @ x; a
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 @3 I, s) Z* G4 X
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
. E9 u' D+ p. K$ W$ i& { mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-169 P! B( U* W. W: E' t% t
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
k5 q, M% ]1 G mcasp->regs->XTDM = 0x00000003; // Slots 0,1
/ q6 U) V( b2 X$ p' r( S mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
9 M$ w% P/ ] c. J6 M mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! m3 C, k; V O- z; P
' G; r3 t" y2 A( i9 q9 D, E. @5 c/ v mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
, ]% G- n, Q, @" `, B mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" ^2 O) g- r6 c. Q mcasp->regs->PFUNC = 0; // All MCASPs
8 E+ ]' Q& x+ E- p; h: ? mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 x0 p) G5 L, p% d+ x) T; S
8 _" e# C6 o3 Y0 w* O) m: ~3 q mcasp->regs->DITCTL = 0x00000000; // Not used) K$ x) L! P" _* Y, p$ V2 P
mcasp->regs->DLBCTL = 0x00000000; // Not used
, }. s! c* m/ P7 ?9 i mcasp->regs->AMUTE = 0x00000000; // Not used
( d8 y% G- z% w$ e/ F- J2 j, B! l9 h- W5 m2 P3 ]0 Y E7 S
/* Starting sections of the McASP*/: X8 d7 U) p* T. z4 F+ S
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
; } u8 L t9 C3 j0 u5 I2 S while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 0 P" r S3 p; F% Y
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- H* v: I7 S+ X: p4 T while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
H. T0 e& ^: [- k0 n& q( R
g# p# W, `% q! L6 h. M mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 1 z5 v+ L' l2 k" r% k2 W# S. ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );! }* x+ k, J* x& A9 x4 x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
0 m/ h5 q! N" s( b6 d2 O H% ` while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );" ~# ]0 |% u. ~; m
' `9 z( `% [( Z: w3 N' l q mcasp->regs->XSTAT = 0x0000ffff; # D1 J4 l. ?$ U, B( n6 ` U
mcasp->regs->RSTAT = 0x0000ffff;
( o e* y3 x; ^5 b
. c+ C$ D. q N9 L. Y9 a0 I0 E mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 G( ?; i3 G7 q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );: h# h7 x* _& r+ ?: j" z
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& o! M5 f. h$ ` B while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 D% x$ m' G7 x# Z, s, c
1 B a$ s! e- Z* i /* Write a 0, so that no underrun occurs after releasing the state machine */
9 Z) U3 z A" o8 ~# y& R mcasp->regs->XBUF5 = 0;
2 c0 K6 H; T! k$ `% d; J mcasp->regs->RBUF0 = 0;
2 u* w& Y% Y9 I9 b( W. k9 l' F3 t
. ?' ~4 [2 ?$ M) h5 f mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 i# C* E2 F4 H9 c2 O. x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ @7 t7 x0 G5 H; D) _1 {4 e
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; . D8 s% v) {# Y6 i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );; h) b7 e9 o4 W
: j3 ]4 T: ~% K) a2 ?
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! V1 y, m7 m- ]8 l8 D4 S while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* v; t! x5 l: |: u( _ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 b# F3 t$ v1 M0 L6 S1 D* ]3 o! H while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
% V1 A+ z$ p" G; F& D8 k8 J
$ I) l9 }$ Q3 \& D0 ]) M CSR = 0x0000;
& m, a3 e- ?7 H( b4 Q INTC_INTMUX1 = 0x3d;
6 ^8 q# W( ]$ v9 g" b" f- P% @ ISTP = (unsigned int)vectors;$ v' n; a, {3 K# r* B& A
ICR = 0xFFF0;
0 p9 n# i: g$ H" G IER |= 0x12; / a$ ?/ j5 Z0 z; |) r
CSR |= 0x01;
, o$ o. y6 }% P) i3 u6 W& S$ k1 q% j; ^3 D% g8 S) Y
: j3 X* \2 c" W
6 A8 Z+ e6 D% ]
还有就是两个输入输出函数:: J' O# `- C! }& f7 a: O8 v
void output_sample(Int32 out_data)
$ ], ^/ F& L! g1 l7 |" y/ R# |' I{8 G2 y, W* w! `& V6 _
AIC31_data.uint = out_data; $ D& L9 U4 u& ~0 R& v4 J
MCASP1_XBUF5_32BIT = AIC31_data.uint;5 C+ P% m" H# g/ J2 h% U1 b
}
/ @# J4 }4 Y0 U5 I7 D. q
- A* R2 x0 H9 I$ r0 k' T1 }Int32 input_sample(void) B) S" ]0 D B' o" q/ E8 u
{ ! t: p6 ^: D4 ]9 I8 O. M
AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 | q8 p6 T1 i( b5 \* A: c+ v return (AIC31_data.uint);
2 q- n% z) J1 H+ G; {+ @}
0 w( O% n: F# R: I: ?
+ b1 j! l7 q4 O( S+ ?; p0 ? |
|