|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 z7 s& |8 V/ D" Q& ?: Fmain文件:$ t3 J2 {7 h- V- X
interrupt void interrupt4(void)
$ O2 c$ |7 c/ g' l( {{: o2 X0 i6 S, h5 L0 v, V' }+ L! o
Uint32 sample;, ?1 j, r- y6 Z8 v- S# {( [& X
7 L/ a7 G! z& |1 [, [6 C9 I( b sample = input_sample(); // read L + R samples from ADC/ E7 I2 Y+ U) s" h) _
output_sample(sample); // write L + R samples to DAC
: {3 d9 l9 P+ J! b return;% z. N6 m# r( n! _' D; W9 |" H
}0 Y& l4 E- i6 N# v
1 @7 P) a3 ^! G l Gint main( void )
! J K1 o1 n2 c- p+ f7 Q2 o{
! o* I, F5 ?3 ^; b. r3 P) J* e" ~+ p: g, a
/* Initialize BSL */. j. `4 J7 ~5 A7 J! H9 I: [
EVMC6747_init( );$ [% B# e s! a
/* Call evmc6747_intr function */" Q+ R, W. T' d" E# U" [4 p
aic3106_init( );& l! Z0 M7 X7 W, Z. u5 F% }% H
while(1);
9 B& D: i& S" Q/ v K}
d1 H% o9 t6 C# P$ [
- Y6 [) c- ~+ n4 ~
. ]9 x; l$ e$ \( Aaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" ^: {# w1 M) ]. L8 w6 ~
/* Initialize MCASP1 */
M4 T: {7 k. M% ]9 Y mcasp = &MCASP_MODULE_1;: e' j! O2 A; N
mcasp->regs->GBLCTL = 0; // Reset3 ?; D D5 p6 ?9 L5 L
mcasp->regs->RGBLCTL = 0; // Reset RX0 d$ O' b3 M1 y8 x
mcasp->regs->XGBLCTL = 0; // Reset TX
: P: {2 e6 u9 s3 c, j9 O$ C- ~ mcasp->regs->PWRDEMU = 1; // Free-running
: @" J7 M4 h4 ~. a* v% A0 r) h // configure McASP0 receive registers4 O+ ^# X' c. @% K/ d
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used6 C, u* X: G! g& j
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 u4 H) K3 k% R/ S$ a
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word- j) K! v. ^0 o; p
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 U: Z. T9 L8 N: N$ S3 a! l* b mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' N- I1 T) z S* Y; ]1 v5 n$ [ mcasp->regs->RTDM = 0x00000003; // Slots 0,1
6 a# Q6 @" N' T mcasp->regs->RINTCTL = 0x00000000; // Not used
5 y% h5 p; f8 f# Y3 C! K( Q( H+ ] mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& J m; u. |- Z9 e7 J% X
+ V3 r- I% l9 o8 m" x, r4 j mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# T$ }$ `: F" Z0 d0 u mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 t6 z% u* C1 l
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& g: f \" o& x6 X, }
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 w: I4 p- P2 R+ G A& V mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK& R* M, e. g' B( Z' l' g6 i
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 V# E& ]3 h% y mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ u: x/ r2 E" T% B" _$ e mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& l, a1 b+ f1 T" |4 c
1 O u" v6 H0 e mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN N5 B& e# ` U4 g
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT. @, l, e( @4 @* e
mcasp->regs->PFUNC = 0; // All MCASPs0 J" z, u$ ?8 s& g* l9 e; g
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: C7 u1 u) n% j7 S3 S# Q1 t7 P
1 }5 I" j# j$ G w8 H) E mcasp->regs->DITCTL = 0x00000000; // Not used
^, }; U6 `, _* V- X' O9 U1 } A mcasp->regs->DLBCTL = 0x00000000; // Not used
! H, x7 t6 f8 B1 b8 }0 Q mcasp->regs->AMUTE = 0x00000000; // Not used% q) L( O% ^& X; {2 g! U
$ y9 v B- O& {6 r$ r8 k/ ^
/* Starting sections of the McASP*/
: r2 G% ?$ D% L7 \ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
9 t. O! c9 m; P* z+ z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 s2 C! S% w9 F- u4 E mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* L* n! R6 B8 @0 o. @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 D( {) g8 D/ s1 X0 h" F$ g. F& i$ L& t% @. H3 J( Z8 u
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; - [' Y b6 D7 `4 R" e1 y; Z# g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, b2 @! `" I" p6 K mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 l! k4 c/ Z* ?/ }$ p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
9 a5 j8 R5 h4 g+ c4 }
" s; j' G; J0 J' k mcasp->regs->XSTAT = 0x0000ffff; " n; _. i# o6 X/ n7 o5 P. Z4 _* Y
mcasp->regs->RSTAT = 0x0000ffff; + @9 u- K9 @) J( o
# d/ a4 p2 m$ H mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;; q" O% K' W0 t8 s& i' J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& w8 n) f# t' a! |, ?7 b mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 q3 f. D3 Q ^7 U7 j/ @4 x+ ` while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ f' E* e- X* T* d! z) G( Z- S* g ?; n5 o
/* Write a 0, so that no underrun occurs after releasing the state machine */8 k" G$ H. b. Y! Q! Y7 u
mcasp->regs->XBUF5 = 0;6 j- N8 w+ e* ^3 ?9 ^/ a# r
mcasp->regs->RBUF0 = 0;$ s7 E' U$ Z) ^! G5 r/ J
" M5 t' I* u) _$ j7 O& h0 J+ a mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % ^- j, `) X+ E' |, y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" Q! D6 ^- J/ k$ [0 B0 X/ f
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & K2 r& i, V' z6 f0 X: u- g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );0 o' q3 {+ h/ _
% ^6 @) i5 F* ?" V
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; % h* J* ?2 v! @- Y& Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( @6 ]' E, I" _9 d6 s, a
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 5 N. y$ E6 \. D; ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
) S, q+ O" s- _! q* G' V' H, ]7 q1 _$ u, H3 u
CSR = 0x0000;8 d1 H( h& B$ n% R/ A! o' h8 L
INTC_INTMUX1 = 0x3d;
, q5 s1 v, v8 S# V) w ISTP = (unsigned int)vectors;
- Y: z1 I2 }) _6 g5 E+ N+ P ICR = 0xFFF0;
0 u& {- E! E$ @; l IER |= 0x12;
/ F* a$ Z' V4 H7 k: { CSR |= 0x01; $ h7 o* U. \0 a
5 F: ^ u- ~! z3 ]
/ t+ s" Z& o. N! z! Q
& K: P" C$ C# A! Y% _- F" q- k2 F
还有就是两个输入输出函数:% d" T% j0 J2 m7 g
void output_sample(Int32 out_data)
7 ~9 j. p6 T! [0 ~{
, }2 Y0 Z6 `, b+ \5 d AIC31_data.uint = out_data;
( b& [5 U- h& u, {, h MCASP1_XBUF5_32BIT = AIC31_data.uint;, k! }" h* O% D3 s7 c3 m* s! b
}
# m* ~9 V- [# L! @. X# v/ S9 a0 U9 I# a5 T
0 e$ o6 r; E& B# v% ?; H2 |Int32 input_sample(void)& H0 i3 j; T" G1 o* a( Z, O
{
8 {& ~8 s2 M' I+ q AIC31_data.uint = MCASP1_RBUF0_32BIT;
- Z" ?/ |0 O- F% T6 @8 m return (AIC31_data.uint);
: J6 J# L4 _: M2 h! W}8 [9 Z {2 f: m# M' }! j( ]
0 q: s G1 ~ t" p) C/ n
|
|