|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! p$ ~: P# I6 k0 g! Lmain文件:
0 q0 t9 X" t: B7 `/ Q+ U8 Ointerrupt void interrupt4(void) 8 ~$ s) P% c; x% Q4 }
{
$ b7 E- ~; ?* J! p9 Z; R6 Q Uint32 sample;
' r( [+ Q0 m& x; p
+ b- }! [2 h m4 {$ P$ G sample = input_sample(); // read L + R samples from ADC
* f2 ]- d! j' _3 }1 j( C output_sample(sample); // write L + R samples to DAC
! R: X# {+ ~+ ^5 f, k0 q return;) K8 t$ p+ I4 q& y4 l
}
$ @" Q# v+ v9 M" X* S
# K' o. [0 J& _3 L* `int main( void ), [4 `( {9 s, g! }
{: G; n6 {5 D1 R$ V8 r
9 h$ p) ?. [$ q6 Z8 m /* Initialize BSL */
+ N. ?0 Y8 `7 E3 T6 z j EVMC6747_init( );5 Y; ]. p9 n4 b
/* Call evmc6747_intr function */) t8 Q1 l" L3 ~; K/ ? k2 Q
aic3106_init( );" G5 T6 C( @! Y! L( A& U; v
while(1);
2 c( ?5 D, a# H, \* }% E}+ n/ u% U% V! y0 R4 E
' h! U2 m0 {+ s+ B0 |! A
3 d# A) d5 c) W' Q# Eaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( ]- c ]& ~, ?8 s4 C6 R
/* Initialize MCASP1 */
B( Q9 j9 R4 t' V2 }' m2 F& B mcasp = &MCASP_MODULE_1;
- }8 Q E7 S3 i) ^$ v- X mcasp->regs->GBLCTL = 0; // Reset
! O0 U; u2 @( U7 O1 V6 O. a* R mcasp->regs->RGBLCTL = 0; // Reset RX
$ r9 P' `% g! {; p8 e. _, E) ] mcasp->regs->XGBLCTL = 0; // Reset TX
! Z- M% o. Z! ^ mcasp->regs->PWRDEMU = 1; // Free-running
2 [) c8 Q B( I4 }( U% R9 o // configure McASP0 receive registers0 G) `3 A T+ f, N8 `- O7 t$ _* S4 l
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, C! q9 @( h. }- S* ?/ Y mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 H* P! N2 V- A: O2 m mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word! p* b) m" L' q& x4 F6 V& ]' O
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ h3 Q& |- m7 H+ ] mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)& P6 z8 q& Y+ k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
2 U2 f4 S% D! Y! S- @' v: E$ g mcasp->regs->RINTCTL = 0x00000000; // Not used
5 t8 `1 H; m5 F' y$ c mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' {% F2 F4 w( i. y/ S: B8 e, a Q
) w3 Y. j$ X5 g$ z6 A% ? mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used( a" v1 i, p: E' A( `5 b
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- V, k5 d e9 ] mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 e4 W' o. S1 Q/ i& p; e mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 s/ i5 W B8 P* l% W, z mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK! N- U1 A# Y- R' L
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
! r+ r. X* @) W# _) u mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ C" H& S- a2 l" I; X+ k" U
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% y& o& c2 o) u M; C. }- n7 v) t' D/ B% X& ]0 S& `" Y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN+ a( o2 ~4 ` m6 t5 O
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT# x: p, L7 h5 }9 d) _% l" u
mcasp->regs->PFUNC = 0; // All MCASPs
4 j) _- }. q! ~2 S( e0 R mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1& k d' i- d. f- V- |3 J
; P4 F8 ]6 y- R mcasp->regs->DITCTL = 0x00000000; // Not used" z) V) w( O5 F3 c* Q: H/ L
mcasp->regs->DLBCTL = 0x00000000; // Not used
/ x- ]* a0 b$ ^7 \! D# l( X mcasp->regs->AMUTE = 0x00000000; // Not used" {. Z' j6 e! e7 W, j7 ?
7 ^6 D ]% j2 A9 _6 M R ~! o: ]/* Starting sections of the McASP*/
0 g w' X- I5 _4 ]$ y) N mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ' R* Q$ Q. a. Z' `) r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); $ ?7 U6 B/ J* X, L& O
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ! z1 H% `5 g$ N7 D* x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ e: J4 ]" [' J; A% q' r" V7 Q
+ o: r* R! n- B( F mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) y# \( s# y: F- u4 t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 U1 B3 p. e8 P2 X) c
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( \! u4 z) M+ S. Y$ ]- T" S% T/ y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& f4 m& c" T8 M
/ @: \( \4 t y' G
mcasp->regs->XSTAT = 0x0000ffff; 4 E* ~/ t5 c' P! Z {9 l) ~5 i
mcasp->regs->RSTAT = 0x0000ffff; # `. C# U$ L- w5 C
: Z# d8 W6 \2 X% y/ B) m mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; b" a4 H, c u$ [" m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );: X: E) _1 F. }4 U4 R, b- U
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; / v! p0 z+ o4 D5 x9 \# b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
4 s6 U, h: @4 ?' \& U( @1 i. d
' n# O1 c9 y. R6 f3 ^$ ^( |$ J /* Write a 0, so that no underrun occurs after releasing the state machine */. d7 O: L+ i h9 o0 G2 d- l- e
mcasp->regs->XBUF5 = 0;* d! B( Y9 d, X5 ~. ?% V
mcasp->regs->RBUF0 = 0;
3 |1 \; |8 c, @5 X: T: O! J: \7 M& Y, R+ Z# D( ^& r* A
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ! W8 Z/ [* m6 ?6 P; r; o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 h8 _9 X( D5 N. D. s mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# [: w: n: r' ` G4 I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. X* m6 ~* P6 P) ^( Y& R# Z; ~1 Q( |3 _3 u1 {; }- c
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 f% g, {/ d3 @5 S9 K while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );$ N8 l4 {. J* I9 S
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 n. Q6 e0 `) E0 I7 M$ P2 X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 p: |6 A9 F3 o$ j. E+ L, r) g$ c& h. ~& o, a
CSR = 0x0000;
$ f- ?* o" g! S INTC_INTMUX1 = 0x3d;
% {1 _8 h' j( |/ T3 P ISTP = (unsigned int)vectors;) e1 S A8 U: C
ICR = 0xFFF0; 6 P+ @5 `8 J7 u. j* B x9 G" G5 m
IER |= 0x12;
% r1 X; a3 p5 O CSR |= 0x01;
4 Y8 v* s, e# o
5 W6 T1 C# N9 u% [: n
8 s( G J- A' N- O
% O. Z c% R0 z8 Y1 @7 _还有就是两个输入输出函数:
/ ]- L; V, c4 n2 Z# bvoid output_sample(Int32 out_data)
# l4 X! m8 |* a1 j( A+ c{
2 ^* Q2 z, W7 C8 R C0 B AIC31_data.uint = out_data;
/ C5 [+ r) h9 [$ L& ]$ A MCASP1_XBUF5_32BIT = AIC31_data.uint;
+ K. Z* m! B. c}3 y! [6 k4 r9 @2 @5 c
3 X7 G8 [& F5 S3 F Z. F* hInt32 input_sample(void)/ R; L& ]! ^" e0 J/ k; c
{ 0 n0 A% @2 w* r1 v# D
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* T6 j4 j* T9 B return (AIC31_data.uint);
$ l6 _9 c( T' ^}
, D% I8 [8 H- T: z
. D3 f E) j# a/ @( g |
|