|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( R0 `1 z2 Y7 N; _: xmain文件:
7 y( s3 _$ f/ U0 H/ J/ ]interrupt void interrupt4(void)
; _' u Q l$ }: j{4 q/ C+ K c5 i5 [
Uint32 sample;
7 m3 w3 v( \0 ?
( {$ t- f/ t! U) P) R" ^ sample = input_sample(); // read L + R samples from ADC: ~% U0 L @0 F1 u
output_sample(sample); // write L + R samples to DAC
$ U7 I; L t2 P E return;
+ x' }7 O* N3 R) y+ K}2 X$ T# o, }# T8 s2 X
4 }" Y: d( }% c/ m' S
int main( void )
3 M) L9 c# D* d{: l" f$ \. }' Z! I1 P
- t6 _+ c/ ?) W7 P' Z/ L
/* Initialize BSL */4 e3 j' A6 f1 _
EVMC6747_init( ); T9 i1 F/ D* W2 e. G
/* Call evmc6747_intr function */
2 H6 L4 a6 v" T2 d/ f aic3106_init( );
8 `( Y5 ^ @/ U B* B) U while(1);( q) k% I. d' Y5 c8 f
}% X6 j0 p' j. a2 M/ y7 x
' R2 b- G, k. l5 u2 Y
4 q9 y8 j6 B1 `aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题7 h# O# a, }: a/ o( K5 R
/* Initialize MCASP1 */
. ^5 X7 }/ c$ c7 i mcasp = &MCASP_MODULE_1;3 O9 ^* Y8 n) M, @5 c+ W: z4 g
mcasp->regs->GBLCTL = 0; // Reset
r l# B* a# D! U8 L. ~# o mcasp->regs->RGBLCTL = 0; // Reset RX
6 y, {8 P- e' q1 A' c mcasp->regs->XGBLCTL = 0; // Reset TX
0 l9 C" }+ L0 d/ u' I mcasp->regs->PWRDEMU = 1; // Free-running! ?$ O1 z# n: n# r9 N
// configure McASP0 receive registers
# y+ V4 c2 m# ?4 l mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used, A: q5 D. V& K1 G5 L
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus+ y5 B- W7 U2 n. W& z. s' Q
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
0 P+ d. e- D3 | mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' Z% b, P3 P5 p7 h: v; c8 C mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' ]5 {! r* k6 S, O6 O( A mcasp->regs->RTDM = 0x00000003; // Slots 0,1; T5 E/ m8 q4 |7 K2 m& b
mcasp->regs->RINTCTL = 0x00000000; // Not used
# D/ ?3 v6 t6 I% n: W mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& p8 {+ v* B3 D P: G0 R- N$ m2 \, p" K y0 _& ^" b1 M" [& M6 W
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
+ f2 H8 f0 y4 I0 h: E ?! O mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# C" L& {! \, K; n% R/ p, ]" q6 C
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 H8 n' h: o' M& L$ U mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16" j2 I1 Y/ q+ u6 r, v
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
4 n6 N& S5 d' B& K5 G- D5 c9 X mcasp->regs->XTDM = 0x00000003; // Slots 0,1- y: s+ k8 h) [! b; u9 e! o
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
: o& q$ i) X5 f- b3 s$ N! M0 {6 {+ s0 _ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) x$ L# B2 p4 K" r$ ?
) E' f" j: h8 K$ n, T2 N& P mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN1 y* F2 M A4 a Z2 B
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
; j; K, N6 B+ x: U& m; U, L mcasp->regs->PFUNC = 0; // All MCASPs
5 n+ M* }. X+ Y! m% b! [ mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% ~& S; ^6 P/ G
0 U4 u6 o% n/ {" q' @# t
mcasp->regs->DITCTL = 0x00000000; // Not used
: b: v3 ~4 Y& [, d. k2 E/ Z4 w mcasp->regs->DLBCTL = 0x00000000; // Not used
- {4 }8 T" u& Z. h% o. l3 u mcasp->regs->AMUTE = 0x00000000; // Not used) u6 \ k- f* N+ y- c/ o6 i
8 |1 ] ?& c1 I& ^) G/* Starting sections of the McASP*/
& z/ q" B* q% I# l# W5 O7 r mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; - N. K6 A& _6 J& G/ E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
! U5 [* R! W* \# M! D u9 A mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- L- H9 V/ G; ` while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 Q6 U# C1 o2 e2 C( B1 G- }8 R* h. s6 m* W- [+ q4 E
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; - S( a6 |' h! I5 i& u/ R) l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );) Q! n ^: Y, q" e2 E1 c. R- z, X
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 b+ L5 o' g: _% X9 Q4 Z6 j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# t; r0 A8 L+ g2 y3 o
8 ^# O$ T: f% Z+ Z* i: R/ [
mcasp->regs->XSTAT = 0x0000ffff;
% D5 B3 n$ Z# V1 ~8 T, J mcasp->regs->RSTAT = 0x0000ffff; 5 E" j2 D& w M v: ?3 h
8 ]% b/ }0 e8 n2 L+ S* d; K mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;6 ?, S) U3 _$ U* E, l( W6 |3 e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 i$ j* x! ~% F+ U9 H2 U
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* {6 z, C8 Z- U6 U6 Z. _5 K8 x1 G. ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: D' M! y( m5 J: C
5 `0 q* t, G7 |$ t9 h) G /* Write a 0, so that no underrun occurs after releasing the state machine */
7 s* w& Q# d+ j6 x$ [$ B mcasp->regs->XBUF5 = 0;) _$ c8 @! K/ v# G
mcasp->regs->RBUF0 = 0;
* m2 P/ `: j% D3 o& K C/ b9 H+ V" w
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) S1 m/ S, ^3 ~+ A; h: N while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
^( H3 c; a8 V9 J mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 T9 n" f& B4 `* d7 k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
; D0 |" W7 d7 `/ l, _. w/ ~/ k2 n6 X' U+ \% I# i3 o; v
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# g, X& t9 a5 g; Z K6 b while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( r+ o& n( v$ O! p ^ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 2 l$ g, e+ }! P5 n; S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" g5 `4 |4 K& F, v2 ?: z3 ]3 s2 v8 j7 i* H# x
CSR = 0x0000;
9 S6 A, r' k: C# H* q0 V j INTC_INTMUX1 = 0x3d;
6 v. e' U/ y0 K D5 D. l$ P ISTP = (unsigned int)vectors;
! L$ m7 H x/ I' R$ I! m1 M" Q i ICR = 0xFFF0;
0 f% }% T0 P% }5 D* `' M$ M IER |= 0x12;
) R) h: D& |$ _3 d, f) Q" U CSR |= 0x01; - T- B2 g' c4 e! u. d+ h
; G# q# h# l* ]1 |) ?' G/ I$ t0 G; O( x5 P, I6 T
# A. Y6 S/ L8 y+ O
还有就是两个输入输出函数:- J7 Z. P" V# u6 M4 p! G( m
void output_sample(Int32 out_data)( n6 D1 }+ v7 G# `
{
. x8 d. o9 ^# e$ N( V, Z AIC31_data.uint = out_data;
7 s1 V2 Q! @! v4 W' V6 r2 M3 [ MCASP1_XBUF5_32BIT = AIC31_data.uint;" H2 X x. ]' A( k6 P2 T$ w" j
}+ w5 z' r. g7 ~1 `+ l; _5 O3 H
) I$ P' i1 A4 C% ?4 |/ c3 l" P
Int32 input_sample(void)2 ~8 J2 Y' i0 e) [
{ , |5 ^" X; U0 d5 l8 a6 G2 w C
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ s1 Z1 c9 M6 L& n6 y( s3 E% V/ \ return (AIC31_data.uint);
4 \2 f9 B7 q1 U7 a6 v A}
. e) G0 G1 E, W8 P$ E3 t' d; f) r& e" R) M
|
|