|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 \8 }$ C5 Z) C' Fmain文件:3 ]- k5 h! F' R0 B, r7 r6 h$ b
interrupt void interrupt4(void) * U; N% x4 M! W R& F
{$ ]% w6 N' t) C" X
Uint32 sample;- u6 Q& Q6 ]" Q
5 Y# C u$ F6 E- c
sample = input_sample(); // read L + R samples from ADC! s; C1 G' z+ ]* v0 `% i
output_sample(sample); // write L + R samples to DAC * C4 h- H% L X( ` `& t" a( F
return;
' g* N7 v7 [9 f9 O}0 s" g! Z& P& a7 {* Q( m" k
1 X8 l2 N+ L' Rint main( void ), S5 H% m/ _6 n. y2 l: R
{6 @: E; z2 v N& O. t
( B9 S6 D6 `: R) Q /* Initialize BSL */# e3 T5 ~" q# M5 p8 S
EVMC6747_init( );: f" H( ]" n- N- i" Q6 G
/* Call evmc6747_intr function */* R; K; O: ?$ l3 k; o- P
aic3106_init( );
; c8 H; D! h% s while(1);0 U7 O- \+ O4 T0 Q
}
) h6 ] D/ f1 q |5 `' ^- _8 O, }6 H4 O+ p
4 r: Q) f; G/ Saic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. j. U2 o5 n' D' U/* Initialize MCASP1 */
4 A L" f9 A7 o4 N mcasp = &MCASP_MODULE_1;
6 E* P# z4 C: ?; u: v: C8 b& S9 A mcasp->regs->GBLCTL = 0; // Reset
6 R) l# M( K/ v mcasp->regs->RGBLCTL = 0; // Reset RX2 P" L! I& a6 N- A9 B8 }7 @5 S$ k
mcasp->regs->XGBLCTL = 0; // Reset TX$ F) q" h* f, Y5 `7 }+ `/ M
mcasp->regs->PWRDEMU = 1; // Free-running
; _2 u9 {# @" F |( }0 a7 F7 n: [# o // configure McASP0 receive registers& t. F. S2 d4 H
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used8 `, j" {4 v# T
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
A3 U6 i3 U1 t0 u9 u% y$ Z mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word5 M0 d9 E: Z8 H0 `
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# j+ E! ?3 E; v' K' C# s) t0 h. } mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
5 ^* N* z/ p& g( G1 y mcasp->regs->RTDM = 0x00000003; // Slots 0,1# u& \# x2 l9 p7 j- I; W% _. h
mcasp->regs->RINTCTL = 0x00000000; // Not used
* ]/ R* R+ m9 U) S3 V9 a9 m: I6 ]; _! W mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 Y' ` N; H" f4 B. h& B0 u& I. o9 s; m u6 }3 Y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
1 X% l/ ?; U0 `0 D; d mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; q- l5 O+ w$ N8 P% L5 V9 q mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word H# w, ~: a# u5 d) K
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16/ b/ H) q5 l/ P7 \& x! U& j9 r
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
( s9 U5 {/ S. X mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ a: q* G; F% Z$ _$ Y4 Q8 u5 K& X mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit, C8 [' M8 {4 Q. d5 n1 W9 t
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: y) \5 T& r% h. v3 d4 I2 K/ {- D9 x3 u8 _$ l2 \
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN$ u2 \0 y( o( U* i
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT1 |# a% F2 W- Q, q( I
mcasp->regs->PFUNC = 0; // All MCASPs
$ }/ o; q5 G6 u( K mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1$ m" `2 k0 o1 v% ~+ F. w( a
, ]3 W9 V. c! Q2 B6 }- }( h R
mcasp->regs->DITCTL = 0x00000000; // Not used
' {, G# M& l1 z; R mcasp->regs->DLBCTL = 0x00000000; // Not used
/ L* Q# k4 Z$ v7 f% `5 F% @) @4 P mcasp->regs->AMUTE = 0x00000000; // Not used
7 s! d& r+ a; t7 T3 f8 E) f4 h0 U# i6 \" o
/* Starting sections of the McASP*/! F" Z7 r+ E% T4 e% m
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' @/ k' `/ p$ g. T while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
) B9 [4 ^( j* h% e% u mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
& m: D8 S3 W2 q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& Q3 P3 ^% g! |& o. [1 A2 \ B* x# U# `
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 @+ \+ Y& y* b. r- O" v while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
C; [2 h. Y$ d4 C mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ }; F* g$ T( V1 e1 P while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 |" o4 ?0 N( D) A' j* n4 ?" D; z* b# R) p
mcasp->regs->XSTAT = 0x0000ffff;
4 N% H2 o* g+ z2 r* ^# }( s8 z mcasp->regs->RSTAT = 0x0000ffff; ; a1 g& X* Q8 N1 r" F0 p1 x- j9 f
8 t4 [% x- K$ p- {" E
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 ~% z c, B$ l. {4 B: E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
+ B: Y4 L4 W h4 y( C4 x3 s3 T g mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) _- q1 j: E; G0 m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
" L& ]: a! N5 l1 n/ S6 a1 U
: E3 S/ `) j0 r4 @$ h /* Write a 0, so that no underrun occurs after releasing the state machine */
' ^7 R4 h0 w8 K% @, ^# R1 n z mcasp->regs->XBUF5 = 0;6 @) f7 m4 @' k5 q3 h
mcasp->regs->RBUF0 = 0;/ O' r' M5 @5 U0 B
) a5 j7 ~ i4 T+ r mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- b3 T8 t0 |/ E0 M! s2 q8 m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 `, q- p0 N+ X mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ( ^: |" @3 t2 S( G* n, U$ p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );) [7 Z/ k4 `8 _/ X9 s1 @- S
& `9 U- V2 L' n3 ]! ? mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 F0 l2 @8 F% v0 s while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
9 r; x; }$ \! D9 T, w8 p mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; k! u% M3 x, X8 W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' N# a9 \' [/ U K1 l1 c/ o3 N( J5 g) Q
CSR = 0x0000;
! `+ t. `. [+ o& ^$ C: i) L INTC_INTMUX1 = 0x3d;
( | ~- J" c/ T$ x7 { ISTP = (unsigned int)vectors;; |2 l7 R1 n. B# _! V
ICR = 0xFFF0;
. v" e- U) L( N' w9 k) h& } IER |= 0x12;
+ P6 Q( `$ L5 W8 k" `; v) v; L( j CSR |= 0x01;
# ~$ V' O" q1 }% k& e5 d( r& ^( {1 |' W5 Z0 i0 I3 v) u6 s+ ]2 h$ F
3 Z, R/ z' O/ Z; K# Y5 u# H* W8 d: V, E2 V2 ^9 o: ]$ c# r
还有就是两个输入输出函数:6 Q. d* z0 M% j, g# T. u: V4 {) `
void output_sample(Int32 out_data)! \9 u& i6 R* ~5 F
{
0 B; O- [6 |7 e2 s AIC31_data.uint = out_data;
+ @# J! |$ H* `! F' ~: p MCASP1_XBUF5_32BIT = AIC31_data.uint;
, N- b! r) Z- ]! W! h8 `}
7 U, h- b! g6 G2 Y0 F' L% m' N- X4 ~0 s5 N: ]( W
Int32 input_sample(void)
% p- S* |: P/ p8 y2 j" |7 l* r{
/ ^9 L$ Z- l, ?" S& L AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ {* r$ G! u' Q3 I return (AIC31_data.uint);# t) a; k9 i% w' ?0 R" [5 M6 c
}! l; }2 T9 e9 u- P" Z
- E/ i9 S. y& r! F
|
|