|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 q- C7 O D8 i# \. @" s' b. ]5 Umain文件:
6 u1 x9 |$ k$ O9 B3 [; \1 pinterrupt void interrupt4(void)
! \; D$ u! [0 S3 [; x6 C{
. ?) g2 N! ~8 K7 q( N' P% `# F Uint32 sample;
% X. a8 O& W% v8 ?& Q, l* n z, H1 H& o0 ~* X; n( n0 a2 m& k
sample = input_sample(); // read L + R samples from ADC
- w2 ]: J; p/ i# |0 k output_sample(sample); // write L + R samples to DAC 6 x8 C2 F4 a. |+ R+ N# s
return;
/ e/ v7 N4 w" w}
3 M0 U' Y2 i8 @7 B
?) M% e; T6 w0 Mint main( void )
' v- [/ S* Y9 M/ P* P7 U: ?% ]{
& U4 j! q; G; [% n, S0 E, e& ]' A" E6 g8 T
/* Initialize BSL */0 O2 S" U: ]( \ ^; i- F: r
EVMC6747_init( );
- v7 ^ j) Z' [" { /* Call evmc6747_intr function */( h6 ^3 g% h: { F/ C- R( N
aic3106_init( );
% j- V7 H5 V' J1 v) I/ T Q0 j8 z- ] while(1);
& X; ~. `/ J- L( f' V}
+ L& ?# f$ [ |: Y4 I3 |* Y8 J, ]( G+ v# ]' t1 r( J
" m9 k9 G3 j9 a. ?aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题1 e+ \; i2 d/ r8 d- V: H+ ^
/* Initialize MCASP1 */
" t2 S4 B8 T6 a7 W& F mcasp = &MCASP_MODULE_1;. V& m) E2 J2 O. e) i7 S
mcasp->regs->GBLCTL = 0; // Reset
e2 ]5 y9 o" C! y; M0 j+ V3 l, | mcasp->regs->RGBLCTL = 0; // Reset RX( _* D) ?/ a/ m
mcasp->regs->XGBLCTL = 0; // Reset TX. [( O8 P0 C* t& R; H( k* K; A
mcasp->regs->PWRDEMU = 1; // Free-running8 ^9 M) I+ C2 Q
// configure McASP0 receive registers6 _( ~! X8 C5 \$ l
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 l4 F- Q7 M. H mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" I& M. @3 ]/ }; j' S+ N! U
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word, Z6 C1 N7 N- p. f# D* C- @
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)) k) ?. A1 C5 ~/ b. L; c# P1 |' W
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side). i9 ]/ |% @3 s. o
mcasp->regs->RTDM = 0x00000003; // Slots 0,19 S( f9 ^" p8 ]
mcasp->regs->RINTCTL = 0x00000000; // Not used
l, W z! Y3 A9 ?7 w/ o/ s mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 Y: u8 ?+ t8 k
% j# V! v! J7 S& g3 }6 n mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
7 z( Y; n0 K+ x. V7 o% C mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! {3 @ k: o( F) `) } mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( E( i2 w: O7 k8 k( O7 }5 A! _ mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 }/ z, r$ U8 w8 ~2 T
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
* P8 A* C. Z" G! X& e1 R mcasp->regs->XTDM = 0x00000003; // Slots 0,18 m+ s9 P- J4 J
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit! E( B. @* K' g3 M
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ ]& q1 h: V. L! G" K5 b
! l0 j7 {6 Y5 I# T+ S4 M' K- J
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 z! V$ @& Y: a+ j mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
+ w3 i0 d a% b2 v( { mcasp->regs->PFUNC = 0; // All MCASPs
3 B( H& C2 Z, Q1 K mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1; n! g( S' C# @6 |
9 D" z7 C# [" H& [
mcasp->regs->DITCTL = 0x00000000; // Not used
% \: ?9 v. B8 ~- v: ?9 p8 b) m0 K5 i mcasp->regs->DLBCTL = 0x00000000; // Not used- O: I& F/ K% K, T: m
mcasp->regs->AMUTE = 0x00000000; // Not used" @- {& N; N- f6 ^3 ^
/ `8 V ?9 C$ z6 D0 u0 u6 X0 R/* Starting sections of the McASP*/
' [7 n0 g8 e6 y1 o* t3 t0 Q5 x7 m2 c mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 N; p1 q* k6 z! U1 i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 2 q \ l& d! O/ I* ? @, J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * j4 s9 ^9 Y3 f; b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% Y& d; T' C! A. }" u& M
( \3 ^- ]1 i- Z+ Q) a7 D- _ mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% e* O, n# B8 H$ ?# X2 L3 ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& P9 K% C4 W8 X1 H+ s+ N' J* ]
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( I0 \* K7 G+ X% U# w" W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 B& O$ X1 }4 Y0 X S' J. h+ Z( P$ K; _, ^% b1 C
mcasp->regs->XSTAT = 0x0000ffff; `* g1 {$ a* I
mcasp->regs->RSTAT = 0x0000ffff; 9 w; }9 Q* m. n7 _
/ H0 Q+ w) v+ F2 i, O! m( w mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 `% h k- F: r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );% y3 z1 C, c+ G( L3 `
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; # b) g, } d8 w% q% w2 H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 X! I H5 P6 u: r4 r- G9 C7 {0 U! t/ j
/* Write a 0, so that no underrun occurs after releasing the state machine */
5 F( _3 Q* _& t1 J8 g# F mcasp->regs->XBUF5 = 0;
1 U) J. ?# ~9 l, _% } c mcasp->regs->RBUF0 = 0;- x a: |4 J; |
|4 z* {3 T6 t2 h mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 s% E5 \2 f% C$ P! b3 }: c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );& |) M/ i% e( S1 K) l
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) o3 L' }9 M$ b( {6 j) h while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% Y7 j' V. J4 s2 y8 X8 g O; d9 a1 O- U
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , K( e# f+ X6 }2 Y, C+ c- X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );; h5 I K) l: O
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; $ y# Z3 C! E$ S' h% W1 Q' W+ n& v4 P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );1 n- v* |8 n _! t
+ Y+ h) Q% c4 q CSR = 0x0000; c8 }9 a1 M8 \9 c2 p
INTC_INTMUX1 = 0x3d;$ Y! [2 ~0 K8 v0 \
ISTP = (unsigned int)vectors;$ ^' ]: C6 e3 z; A! Y
ICR = 0xFFF0; ( t7 K* f2 w( I9 Z2 |
IER |= 0x12; 4 ?! i* }0 N9 P" v) a
CSR |= 0x01; ) x# @8 K4 F# g2 i
* F& C: C+ s& ]& ^7 p$ d7 s7 E
# I; Z7 ~3 [! y2 w h$ R2 Z( V7 C5 Z6 t/ d2 s/ k% {
还有就是两个输入输出函数:9 k; x, c7 h- t! a( I8 ?
void output_sample(Int32 out_data)
* d9 U! G9 [4 S7 v- _4 e: v{. y$ E! x4 e% C; h$ w9 X
AIC31_data.uint = out_data; / F- Z: p8 w& F/ ~
MCASP1_XBUF5_32BIT = AIC31_data.uint;' N1 T0 H; z) Q" U" b ^5 v
}
# C/ c5 o6 Q) ]8 ]; i
. M8 r# n: |9 Q1 S9 rInt32 input_sample(void)) p, ~; M9 N% h
{ ( N; F$ q, z' f- [3 f8 k0 [% C/ {
AIC31_data.uint = MCASP1_RBUF0_32BIT;8 I" F. S& G" ]; O0 {8 j
return (AIC31_data.uint);
4 r# ~- H- [3 G! a: A}
& Q s; o1 i) }' L
0 j( C& `5 q5 Y6 \( |% ? |
|