|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 p& g0 \2 D# [$ ?* s
main文件:
4 r3 U" i) o& K8 w, S' c- kinterrupt void interrupt4(void) $ r2 R2 m% V# c6 T
{5 t* m/ _* O- u, G$ f
Uint32 sample;
5 _+ }( R% O( W) l& @' Z$ @
# y! {! |7 x& H5 _% X$ B! c sample = input_sample(); // read L + R samples from ADC
( H8 B! Y4 K4 J2 }6 P" s( s/ G$ [/ r: O output_sample(sample); // write L + R samples to DAC
4 I/ Z% F* u1 {4 z return;
8 h+ t% u5 r0 o& N}9 g" h7 I5 y9 g& j& ^
4 X, J) C& U7 s5 q5 R( d" S; c
int main( void )3 B: e6 G4 y% C- E: } z0 K, N
{
8 x* p3 q4 {# m! C8 |5 ~$ |- D* _3 r1 m/ K t+ W
/* Initialize BSL */
9 ]9 ~8 B- |1 o f0 X EVMC6747_init( );+ w/ h- b+ C! `, p4 q& h
/* Call evmc6747_intr function */2 l0 ^. y1 w+ w! V$ v& q7 J: ?$ u
aic3106_init( );
! F. L( \( Z7 D5 V2 ^1 s( M: E while(1);$ A8 I. \1 S. L5 O" v4 D4 u H+ e( J
}
. D& a& C* o9 P( u$ k% v$ [6 D! S6 @( Y# O. R* O8 J$ H
( b0 ~& o3 w0 ?; @5 u' C# yaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题% G. ~- s5 X: C
/* Initialize MCASP1 */& v6 g# e. I& i- W
mcasp = &MCASP_MODULE_1;
p! f8 [0 F$ U: J0 i0 S5 l- R mcasp->regs->GBLCTL = 0; // Reset3 |5 o" S8 q: F7 w& c/ Q. A
mcasp->regs->RGBLCTL = 0; // Reset RX
1 m' I+ H3 G4 L) p mcasp->regs->XGBLCTL = 0; // Reset TX6 l& o e* e4 p4 E) b5 S* B* T
mcasp->regs->PWRDEMU = 1; // Free-running
" f" e" J" ^) r8 O: B // configure McASP0 receive registers9 [) m, d* O/ K9 K6 k$ ]% @
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used3 ~+ S& E+ t+ u/ d& J- o. y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 S/ r5 u1 f) i/ o+ e {7 {* q
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
; t# m. y. \6 S- }% Y; n mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ w1 ^" Q6 @6 f. {" i- b' ]1 L+ J mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
* G4 |( U% @8 ]) p. f1 F mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: W: K/ C* a* }5 y, V mcasp->regs->RINTCTL = 0x00000000; // Not used: E3 S _- C6 `. U. j b: T
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ E* e+ r$ N% O5 k- ?/ M& @; {+ g
; b F% a& ?1 E# k5 h N3 t
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used9 {( l# `. v3 B( ^/ ?7 d' m
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# |3 Y: ~1 n+ c5 ]# U& G, X mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 b/ m" L- D+ W9 P' ` h mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: @. f- Q' u, n* O0 X- K& N5 v
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
+ R$ I$ d+ r$ W. k* }& k mcasp->regs->XTDM = 0x00000003; // Slots 0,1# `, F* e( A, W5 {" u/ J; P7 g2 v" V
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 z/ _; g4 x3 d0 I3 J3 o! M mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ v" ]+ ~" N* s& }
( Y! i8 \4 _2 ]# D/ p/ ^) O" U mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 B; N( `% b; H. g mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
: A3 S1 w& O0 e0 y- J$ u m0 } mcasp->regs->PFUNC = 0; // All MCASPs3 {4 d; J" Y9 Q, S& L1 ~3 `, _* y. @
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 e' L4 ^3 X4 I7 R. i1 o$ C
) r/ W; \, k! U3 V
mcasp->regs->DITCTL = 0x00000000; // Not used4 m+ H; e3 @0 w, Q# g& o$ p
mcasp->regs->DLBCTL = 0x00000000; // Not used; B- f2 A9 ]- ?% n2 L) @
mcasp->regs->AMUTE = 0x00000000; // Not used
}& n/ i' n! Y6 V( c2 H1 _) v l# ]% Z% K; U, X9 P
/* Starting sections of the McASP*/# j5 m. l9 m& P5 l: @
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; + |' c. ^8 d- n+ O9 k/ d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
$ W, `# R5 e W0 T- I0 C) v# O0 I mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( M; F6 ]" y' J8 I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
; d! S( A* E) w/ `1 Z0 ?$ `! q% N- J% H3 @9 F9 w
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 C6 V, q7 | E8 f# j1 u- M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" Q( Q( V6 o* Z1 Y: h mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 V! w9 S6 u! k+ u0 e0 v, q: X9 M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );$ @, [# y) t5 M8 a- g- b
; ]5 Y) W9 Z; i0 J
mcasp->regs->XSTAT = 0x0000ffff; . u. U' I7 G; h B6 c9 K
mcasp->regs->RSTAT = 0x0000ffff; 8 ?# C- s/ r7 n- P& ?# z
+ z0 T4 ? ^1 C' m0 v! T# _' v
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;1 s8 n' J' f0 ~) C2 |9 K2 b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, c( ?6 D4 i; f2 a mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" K% S& q& ~" z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 p7 Y$ q+ n* q, w a/ n. {6 v! k+ f
* P2 x+ I# ?" |, g3 |8 U5 Q /* Write a 0, so that no underrun occurs after releasing the state machine */# a4 j0 a5 w% y; l
mcasp->regs->XBUF5 = 0;. K5 Q9 H2 i4 J. v7 j8 G+ m2 j* W9 l
mcasp->regs->RBUF0 = 0;
" ]$ f+ k/ t0 s$ P/ F" d* h* u! N( I5 }3 u) o3 ?( J; D1 f
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 4 m+ G) ~; \ p9 N5 }1 p( p6 [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );: F0 Z3 `* Z$ [- c& `6 a1 {1 K
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' I. \+ X x; u while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
) L0 B8 l6 i6 ~ _3 ?* o
1 O; s+ x* }! z' O mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
% _! n7 g* d5 `! q1 w0 }; g while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 Q. l, o0 N$ Y H
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
7 S5 d# i+ q( g1 c! a o7 c9 S while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ ` d4 A. g! R& P& u) }/ R! R. b+ |9 J, D$ ~* x
CSR = 0x0000;
) O# v) c; J6 u( [3 \, O, `# @ INTC_INTMUX1 = 0x3d;+ E; z5 d+ k& ~, r0 g
ISTP = (unsigned int)vectors;6 n+ ~. }$ i8 |$ K3 U
ICR = 0xFFF0; 3 ~6 ]' I* D0 F7 |/ b) B
IER |= 0x12;
% T+ I I) v$ b' C$ c L CSR |= 0x01;
4 C) `% H! E9 s+ O1 W, O+ Y
9 m; R, P, r4 U1 p X' K$ Q. _% X3 a% V! [- [
- L3 T4 U; T5 E6 p6 A' w
还有就是两个输入输出函数:4 h2 Z" ~" N) n8 b* s
void output_sample(Int32 out_data)
3 d1 h2 b( c) E* f+ u: M* T( ?{
7 y3 Q% J9 l9 h0 v: F/ q% ], I AIC31_data.uint = out_data;
# d3 f7 E( U" s& V$ C* K MCASP1_XBUF5_32BIT = AIC31_data.uint;
! D. v" W' g0 @6 ^# H3 ?}
& V2 K; C' g! _% J
( e/ p) J S. B( `+ A3 u$ L0 _9 E/ |Int32 input_sample(void)
( F" P8 @ w" s! x8 q{
}' u* I Z3 N3 F7 _5 m5 D9 q- E AIC31_data.uint = MCASP1_RBUF0_32BIT;( x! c: P% {: R1 e; H8 ^+ w4 ^
return (AIC31_data.uint);
9 ^+ G+ Q* y8 Q' Z) Q4 ^+ E! ~}
( A: x. ^. b. y$ [9 K$ g D* M
7 l/ k0 H: K9 S D. D |
|