|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! G1 J: v; q. w( }main文件:9 x: g, d% Z& o& Q1 v
interrupt void interrupt4(void) # `6 |- y+ r8 I e
{7 N1 H0 a y& ^; H7 j
Uint32 sample;7 P+ |2 m" T" x* W
2 ~0 S, B* i* ]4 I sample = input_sample(); // read L + R samples from ADC$ z8 b0 Z& a4 h+ s% o) Z w4 P% @- M: q
output_sample(sample); // write L + R samples to DAC
, q7 @9 p- k9 N0 V return;
# V" L o' s% U& E+ h: L$ n, q+ H}7 R' \! f r5 h% g9 [; v7 d: w0 c
( e/ {3 h8 p4 X1 d
int main( void )& v* i' ~/ u. S$ Z; B+ @: `9 _8 Y
{5 I" W) |! i1 k$ m8 C0 r9 M
# b2 l& O1 G) w /* Initialize BSL */2 @2 q1 ^+ n) }- x3 N
EVMC6747_init( );. N9 q* r. R" p
/* Call evmc6747_intr function */
; u; f) u4 { Q$ u7 V aic3106_init( );4 ^- s8 x; J5 ]& K5 L4 n
while(1);
( |7 Z1 u2 i2 i- E3 _( ?}: w2 N5 T" ^* V$ r5 s. i
+ L. y/ p( F) o- K) v- ~6 l p, K* ?: C. L7 j3 L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 k0 k; i m7 ~" J( m2 D/* Initialize MCASP1 */& ]- j1 d2 W# ?. @$ A* k" X4 D
mcasp = &MCASP_MODULE_1;
" D+ ^5 P0 Z0 a/ A# f mcasp->regs->GBLCTL = 0; // Reset+ o8 D$ x5 E4 Y* W
mcasp->regs->RGBLCTL = 0; // Reset RX
r% o I, d' W4 `) J- e! \ mcasp->regs->XGBLCTL = 0; // Reset TX4 }/ b, g$ o: A
mcasp->regs->PWRDEMU = 1; // Free-running
+ n: @8 }6 f+ g8 A // configure McASP0 receive registers- b6 ~3 J$ \$ z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
0 B) | ^; W, G: ~4 v mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 t7 N- p, Z/ _4 L" ? mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word. Z: ]& _8 V9 a3 W
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* k& i5 i; B1 A: X4 Z5 [ [' s
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)9 N2 B# V$ a; }: t$ H1 c$ T
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
3 p& a( g- t( C& L6 i% K mcasp->regs->RINTCTL = 0x00000000; // Not used6 s7 q+ w* Z4 ^ t0 ?% y
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 r9 s3 j( }) X. {0 k5 @0 Y( k% C
+ Y- N$ w$ m3 s- q* Q( c mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
- m6 `* w! m4 e9 h* t mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; j. ^; ]+ V. r% ?3 x3 k2 k
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 }( P' \3 W: M- o" x$ ?3 L mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* |5 `! S) l; {7 ]: W mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
+ s2 @2 I# { q: G( f mcasp->regs->XTDM = 0x00000003; // Slots 0,1. w2 M, e4 E7 s# c6 p1 i
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit0 O, X. C7 G: c2 e1 Y
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 G: M1 X" {. r4 q ? N2 ^9 ~6 `
9 @- u6 |4 c3 I& l4 b mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; j9 z) u. \8 p" j* W$ O mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 f) \# Y! `! X/ ` mcasp->regs->PFUNC = 0; // All MCASPs) `! I& w! L) W$ z
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. Z' L2 T6 w7 w3 R* R$ _
A& o8 }4 I9 z7 u3 o. T mcasp->regs->DITCTL = 0x00000000; // Not used
" f1 ]) \4 K' Z' C+ w5 U# J! G mcasp->regs->DLBCTL = 0x00000000; // Not used
2 J0 |" Q: R6 n) g mcasp->regs->AMUTE = 0x00000000; // Not used
6 `$ W! z9 E' K, V; [1 I# h) |
, W2 A4 _, U+ h; U Z/* Starting sections of the McASP*/
+ `* _ G, G! ^4 f mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 _$ M0 m4 n' \! u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); - `# R2 r0 Q) G
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' k) e% s3 U8 r2 b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); s% ?+ Q: ?; K# G
2 L- {+ o* C, ~+ u% m; W f# d
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; / J+ j0 h: m$ G+ ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 n5 |3 e) Q3 i2 c% w mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ! o' g1 P8 R2 X% @* I/ X4 {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );7 M4 R1 [+ V; K+ c* Z( M' s
5 r# D9 L6 s" e) }; J' c8 J! A
mcasp->regs->XSTAT = 0x0000ffff;
/ F: S7 }! F) v/ Z4 _" E- e mcasp->regs->RSTAT = 0x0000ffff;
+ O& u; t. T$ N( C" {) d# B* P$ x: J1 F% _$ W) N
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 b n; y6 S% x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );; R6 G% ]5 f& p1 W. h* }8 Q
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% j0 l9 P6 ~0 O1 T3 _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 Q% s5 e; \+ n9 ^* d4 w* N# B" a A
/* Write a 0, so that no underrun occurs after releasing the state machine */
9 }" U" h& g0 t( M% f mcasp->regs->XBUF5 = 0;
( b" _2 L0 h, u4 I! d; T mcasp->regs->RBUF0 = 0;/ o8 r6 f& f% T1 |9 |# q+ s J
- O3 h& p9 ^) X0 F9 e mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) }' N( P& b# e R( V7 l$ v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ x8 o# }' ?# a& p- w6 X1 ^
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # \" j2 w" Q- I0 n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
/ r4 y, g$ }1 Z I. {6 M q5 S: b
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
4 ^( s- ^8 f. ?3 v. X$ O! a/ I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. s6 o+ |; K0 |1 Q2 C. G. \ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ( T9 ]4 B e4 c% A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% w3 Y7 U% |6 }- m2 H9 u5 B
8 D3 z, F6 L& h/ V; }/ d4 M7 K CSR = 0x0000;% l# v+ Y' v. U6 o" G( ]$ `) h+ @+ F
INTC_INTMUX1 = 0x3d;8 m6 A. Z6 m: L) {+ u% O( [
ISTP = (unsigned int)vectors;# o$ C- w7 h! `2 m4 f# {
ICR = 0xFFF0; ) g/ C( N2 q% Z; g l0 o- g; v" {
IER |= 0x12;
! X! f! v+ `2 L+ B# J CSR |= 0x01; " G/ i8 k& U( L' N% V
1 ~8 r; _ q4 f6 j; c. R
% l6 X" }1 c* F7 P7 B, L# t/ Y7 f* j
还有就是两个输入输出函数:
& i5 A7 P* ^( Q8 v# y% Cvoid output_sample(Int32 out_data)
0 z% R9 ~9 i$ L$ `8 k( H6 H{: x3 S1 j; m4 I3 D% h% L
AIC31_data.uint = out_data;
3 p1 }2 V7 v0 L" H: h9 Q MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 x7 K7 D+ P+ |5 t7 X0 c}$ H+ P$ r) W' T- s
( Y# a. B. F- m! n: m$ LInt32 input_sample(void)
# m; O- i% O% y7 J. E' m" h{ ' m% E3 n& k+ x. w0 c" v, e
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ T* _7 E! {/ Z return (AIC31_data.uint); l8 Z5 w3 L* o0 {4 t
}7 c1 I& [$ ]8 E, I1 r
; f/ i5 o0 x3 f
|
|