|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:! G& k) @) d; \, G% [$ i7 J9 e) y
main文件:
9 |: z# h' N2 i$ \& Vinterrupt void interrupt4(void)
' B6 p2 t( i0 X( Q, h2 D F2 E{. z9 ~( y2 V7 x7 k2 P
Uint32 sample;
6 U( h$ {1 y6 x# N/ b$ \$ p, ?( ?, g( X. v8 H
sample = input_sample(); // read L + R samples from ADC
( f, B6 m X6 E4 j5 g output_sample(sample); // write L + R samples to DAC
0 l q5 c" h" J: ~( ` return;" E G. k) o6 t5 ~8 u9 U
}# z2 F0 L# l7 C# l( c4 J( {
1 C. {1 h6 c6 y7 Q5 g Gint main( void )$ A/ Q5 u. O3 v$ n7 j; V
{
6 F0 J. g9 p6 ~% I* ^3 l9 A8 n, u# ]/ g/ K$ s, @9 t
/* Initialize BSL */
3 Q0 N1 R2 P6 S* {. v! e3 O* M EVMC6747_init( );$ I4 w* W8 O P$ E/ x& t
/* Call evmc6747_intr function */; ^% g# X9 Y! M$ G8 A5 I) N
aic3106_init( );! ?1 h0 s+ |$ R( S' {
while(1);
' G; [& W3 D) ?( C& _9 x1 W7 }# d}
3 v# r; ^( u1 H0 w" G& N, J$ } I! o
' J+ v2 o @2 e
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! r0 s/ @1 S+ d/* Initialize MCASP1 */
, K3 q6 ~0 }+ R X mcasp = &MCASP_MODULE_1;( m8 w/ o7 Y* ?
mcasp->regs->GBLCTL = 0; // Reset
9 @" w- m+ j5 _" o( J- |+ i mcasp->regs->RGBLCTL = 0; // Reset RX4 ]/ z4 V" t, F6 u
mcasp->regs->XGBLCTL = 0; // Reset TX) D9 P" U5 i P1 o
mcasp->regs->PWRDEMU = 1; // Free-running" h% ]) r( V6 _5 Y4 l0 w
// configure McASP0 receive registers( f" H5 ]5 b+ U1 k) F; a
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used0 t% j* K3 J% _% B& P" `
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! k6 ]0 h" ]* x
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word d- [: I. j) h1 D
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, x% C; Z+ K6 e$ b$ N mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 k( W9 k/ L" a5 x# r% X3 _) N mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, m' f7 V, M, ^* [1 I mcasp->regs->RINTCTL = 0x00000000; // Not used2 U, T$ h4 s0 K0 B
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 G% ^1 ?2 n' C7 ]% t1 Y- \3 j- p
5 M9 q5 Y: q7 |/ q' R4 _
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used- Z, c }/ L( M
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 i8 g* W' W( v mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 \& w9 w( m9 w$ H mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- @5 H6 `- P# W6 I& n; t7 Q mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- q @" ?+ ~9 K: @0 x mcasp->regs->XTDM = 0x00000003; // Slots 0,1& T( t9 V3 a' u3 Y$ M! e
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit, s1 y% _6 |5 }/ H* p
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 ^4 e6 o- Z, |* B- {
% f+ n7 m2 @/ H3 b a1 J, Y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN- C, K& O6 a! F5 Y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT2 o' I: o, ^, A# |
mcasp->regs->PFUNC = 0; // All MCASPs
3 v9 D2 m; c8 d$ e6 l' m mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( y+ n) o- l' k1 j
( o7 s% I: D8 X! n% P4 x( k mcasp->regs->DITCTL = 0x00000000; // Not used
/ M5 H% j: ?# t mcasp->regs->DLBCTL = 0x00000000; // Not used
; T2 _* b9 g& r" ^9 g mcasp->regs->AMUTE = 0x00000000; // Not used5 y* p& W0 q4 a) U/ U" u% r
+ Q. d5 e' y+ b* p1 ]/* Starting sections of the McASP*/
5 O( G0 ^' s( D# V mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 q: }1 _2 S% q/ W7 K+ o$ i while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
8 Y( Q3 K5 O6 s9 U, `3 n, r mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 L, L* O5 n4 `/ c4 L/ s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" i* E \/ y) C# q+ l9 k+ Q* Z4 ?& |# v* z- b
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; - K' i1 j* _( L; ^8 P0 l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );: ]: Z- u, `$ b, j* |& C
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" {- H% V* i. j. C8 ~ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );+ T8 j+ `* D0 I
. {% w2 a& {6 }/ g0 o2 L* f
mcasp->regs->XSTAT = 0x0000ffff;
) J4 q: D; S, p& a/ `8 Q mcasp->regs->RSTAT = 0x0000ffff;
# t" N1 g; Q5 _7 Q' m+ S
+ L8 V8 Y, Z/ u9 j2 M& m mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' z" B- w8 t N0 p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 x2 U }9 a I. j9 o9 u9 S- Z mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( @% e3 `. ^+ G8 o while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
5 k1 u; b) l0 m& o( S. d- k! w3 \* u0 }
/* Write a 0, so that no underrun occurs after releasing the state machine */% `2 `$ K7 }5 l3 I: t4 m& A
mcasp->regs->XBUF5 = 0;' O' G" R& V1 h2 K
mcasp->regs->RBUF0 = 0;
' ` M! [! v- W( [) I
O- P, C' S; V" J9 |1 ` mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 H1 x: @$ P4 ~5 {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
: `0 R0 H* h, ?8 M+ k mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ @6 v& @! S% t( W+ n- W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. G A8 @4 b9 B/ q. l* s8 Y; o+ B+ Z7 M5 _
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# f( y5 w0 D& M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );8 i1 K3 P# m9 l) s
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 g% Y6 J a8 o# E' W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, y* a- _# k% l @ Q& q: x7 N- E0 Y' c% e
CSR = 0x0000;( R. X! R5 J" r# R% Y
INTC_INTMUX1 = 0x3d;. o3 B, w% m: L. P1 s
ISTP = (unsigned int)vectors;
$ [5 Z/ y- v" c# }: ]- Z3 ?. z3 e ICR = 0xFFF0; 9 ?' m& u: f3 P1 }8 f3 M
IER |= 0x12;
4 c) J' p! U3 b k CSR |= 0x01; . ^8 l- X1 K7 \: s
0 _8 Z3 p) m7 o8 P( d u( U
) h' x3 [0 A) N. A
# U4 {, ]0 F! k$ K) Z/ o还有就是两个输入输出函数:
D* E' h. n! U4 n- Xvoid output_sample(Int32 out_data)
. T6 m/ @! f' J; U{9 v6 p# H5 D: ^$ I( Z. F& h9 ~
AIC31_data.uint = out_data;
9 w9 M' Q# _# M/ @2 K; i MCASP1_XBUF5_32BIT = AIC31_data.uint;% J; H# `" a" h6 D: b
}
! Q5 n9 l7 ^. ~- B6 S9 m2 J3 A7 ~- w- d6 K
Int32 input_sample(void)
7 p* D# ], Q/ \* p* O* Y{ & G$ e: c% J, n, O
AIC31_data.uint = MCASP1_RBUF0_32BIT;
! ]& N( s9 {* i1 K6 Q) S! D. v/ k7 I return (AIC31_data.uint);
Z1 }; v! [. a}6 n3 O5 ^+ v- P& [9 f( s h
# }# g. S* R e) Z
|
|