|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ e0 _ q1 c9 @3 T, w- k8 ?' @main文件:
/ y K: K! w+ T6 R+ }: G& Ninterrupt void interrupt4(void)
9 A B Y: p1 I1 a{
% m; N* J. E, P# S: \5 Q Uint32 sample;
k, d2 R% i2 p- P# r6 m+ `/ L" a. C+ M2 J/ ^/ z; u) l& V3 ~
sample = input_sample(); // read L + R samples from ADC
6 h( {+ O4 G. x" S9 L# g output_sample(sample); // write L + R samples to DAC ! _) c8 | a9 I. a l
return;
6 l, f6 L$ e9 p}! R, \, \) B* l. p# b0 O
$ g! L: y% e5 C. Y- s
int main( void )
3 N5 I( @8 i; K{
3 Q. w/ Z; G6 x
; v: ?+ R# g5 d /* Initialize BSL */
7 ]5 h0 q2 Z5 P/ K EVMC6747_init( );! X$ e2 ]) A3 F9 W3 o3 D/ ?4 L
/* Call evmc6747_intr function */2 J, e( d" Z1 q) d( V& }9 t2 [) w
aic3106_init( );& Z: J0 a9 v @' {5 q8 v- J9 e
while(1);, ]; j6 \/ i& A! ^, D9 ]: U2 R
}1 }! B7 u) R+ l( C' `! ~- \
7 u1 U6 b |' i+ q. n
H7 l4 F% C3 |aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 Y! J$ W" O, F* _/* Initialize MCASP1 */
: Q7 |* |$ R+ G; }3 R7 |7 v3 M7 Q mcasp = &MCASP_MODULE_1;
6 O1 v! c% P, ~ mcasp->regs->GBLCTL = 0; // Reset4 q) a* G2 r& v; T5 w7 _
mcasp->regs->RGBLCTL = 0; // Reset RX
+ K' j. f& D' J6 @. K" k mcasp->regs->XGBLCTL = 0; // Reset TX8 r* z; w( h$ x
mcasp->regs->PWRDEMU = 1; // Free-running( W4 }! `# ?) K0 Q: M' ^7 c' v3 O: C
// configure McASP0 receive registers9 |* P0 p. x3 ^0 _
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
* @: ^- D& j/ v9 U( u8 U8 i mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ \6 K& r+ z) H mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 E0 m4 I9 W+ b9 e! V mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 l4 K6 b1 d- r7 e0 q! i
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)9 z5 Z* h5 u" J& c. k1 T/ ^& A
mcasp->regs->RTDM = 0x00000003; // Slots 0,1! o$ U( d5 Z% o
mcasp->regs->RINTCTL = 0x00000000; // Not used
! F0 a, e+ E: R1 z mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 W, \ ?9 u7 B C, p2 W' ~" H6 l
# w% N* {& q) ^( d, a1 y* }: q mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used! ~+ [& Q y# i4 y& n7 \
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ j/ Z- ]# g0 m; I' I% k$ Z
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( x8 | N ~6 }9 i6 d% V mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 T5 w K: R' u! u8 L' B5 D
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK1 ~( J i, m, t% x4 k/ S% i: e$ {
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
( S# n. q3 v9 W2 ?- O mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
; D+ Q) Y' ~: e1 S mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 n% e' n& g% d6 v- ~4 _/ W* Q% T
/ V/ o' L; b3 U, p: Z) D" U mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN" Y1 [& W' n: V# {5 z R- c
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
2 w& G' Y2 J. ?+ x4 R. ? mcasp->regs->PFUNC = 0; // All MCASPs- u& P+ t2 L. m! R
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. e; `; F' H9 o; }. p& c
# ]9 ]+ d9 U3 N& `- n& Q
mcasp->regs->DITCTL = 0x00000000; // Not used, F: i5 S6 \ t; s3 M% N% ~7 v2 t
mcasp->regs->DLBCTL = 0x00000000; // Not used
* _2 |$ Y( V& c w0 `7 S& F2 ? mcasp->regs->AMUTE = 0x00000000; // Not used
- O7 |7 q$ D6 r% w
7 F. j- k( V1 Z& j$ M/* Starting sections of the McASP*/
. x8 I/ q4 b4 g. a8 K' p mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 1 m* g; A/ n" a( `" _) H, }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 4 b$ o0 w c" Z9 J/ M+ y, T0 C
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
0 o6 d/ P/ J& N" {8 d# s+ t- H ]. \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );4 r8 Y; Z) R5 Z3 q, @0 s; I
+ M' p, p2 Z7 ?+ L3 S# ]7 n mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# K9 y! y$ w4 c, W& r0 b. L; ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );! q+ h' A; h* g$ g* a
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % Q; ~8 \( i% [, @8 k! k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 s4 T% F" ^- e# E* Q6 J4 i: I# M3 ?0 k5 \! f6 i" Q3 O& P) q' C
mcasp->regs->XSTAT = 0x0000ffff; 7 Y+ B2 f( m+ ?' z% D# r/ u; I
mcasp->regs->RSTAT = 0x0000ffff; $ y6 T4 o J& ?8 D& p
# T8 r q5 n3 W J3 x
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; g1 G f* X: V/ T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ J, ~8 T$ L* _ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 o x4 _3 C6 y' m' a6 A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );& m( v, C \0 S7 J+ {' M
. l7 c2 N% ?. Z/ R( n7 ~
/* Write a 0, so that no underrun occurs after releasing the state machine */: B" f6 Y' h6 S9 O. H
mcasp->regs->XBUF5 = 0;. u# i: V8 n2 u5 u& P- K! r# v
mcasp->regs->RBUF0 = 0;) ~4 I, E0 {* L
( h* V/ ?7 z% h& M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; , x; D( ] c0 L# w1 Y7 F( o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( d. d( u8 G6 Y mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 [5 w% K- B; [ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! {# q, ~7 H( D: q4 [+ Y- e
2 C; S- J8 {1 n9 V; ]7 W- U mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 `$ @$ F$ z0 U! s while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, t" n6 P i2 w( H! @& a' i r$ @
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
: O# _3 u8 d( R$ J while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, X) z- P5 [8 {. R1 b& \3 J
+ ^+ V8 @2 O& O# k/ X
CSR = 0x0000;; A" F% F0 f; T) P4 Y5 \; Q9 e$ `
INTC_INTMUX1 = 0x3d;( O( y5 p) b; `, ]5 h8 V) t4 _
ISTP = (unsigned int)vectors;
9 F4 I% J, T" M. V- S4 \ ICR = 0xFFF0;
' X( ], Z* h6 W% O: H5 X* {9 _ IER |= 0x12; 0 L% k" _0 k' a/ G5 K
CSR |= 0x01; $ Q) Y1 Q1 W t( R; }4 W
1 F7 R8 J/ D/ W% ^, O8 C( x
5 x; A5 |: u7 F I4 t |6 H+ e/ K; T6 q; h# p, R/ l0 N
还有就是两个输入输出函数:+ } z- J2 i. f3 l
void output_sample(Int32 out_data)
; c* m; r" r% \! K& ?{
3 j" Z* N+ {, F# u- m' W AIC31_data.uint = out_data; " M! U! u) z1 j8 K0 t
MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ Y- F3 D4 }" J6 @0 J}
8 S; ]4 i# ?; w7 {. l( r! Z8 R8 `- F2 {& q% W8 B5 H4 E# m
Int32 input_sample(void)6 m3 R9 `+ E0 g" I9 e
{ u4 v' L' }' a
AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 e2 T! P) D2 @- e4 F return (AIC31_data.uint);
' v$ A* c0 C1 G6 D) G}$ W3 v0 d5 z/ \ @
1 W/ k0 Q' U$ a3 M9 O, }. K |
|