|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:. H0 Q J' t9 O0 }& E
main文件:
; I7 c; `, y5 G) Hinterrupt void interrupt4(void) 9 {4 l `; ^. K* I- D
{
4 U* B- \# M9 _* n3 c Uint32 sample;0 D; M2 M/ S# L' t
2 }/ I$ i- V7 g& C8 ^+ ?! y
sample = input_sample(); // read L + R samples from ADC
# H* ^& V7 E$ S" Z& z' ` output_sample(sample); // write L + R samples to DAC $ ^' L5 ]* [. x2 u% y! p2 v9 x$ L
return;3 \$ K5 r7 i# F& j
}
" x# K% p' P) T1 o, T/ d
4 d9 m/ A, D4 [int main( void )
4 y# U1 t+ E$ u w% F# Z{
! h; {% \7 q' i
% C$ |& `8 A6 [2 t /* Initialize BSL */
; m0 _1 h5 f2 R3 k8 C EVMC6747_init( );
" j1 ?. L: ]% `+ p- Q/ y1 M) I /* Call evmc6747_intr function */
! a' y o8 G) X4 w: P aic3106_init( );4 r4 f1 G7 U4 [2 h! E1 [) U
while(1);
+ Y$ I1 _2 m4 j8 {3 T3 U% Z1 C}
7 v% p3 _/ I# }" m" Z$ P4 n" r0 \, W1 U5 Y9 f. W/ @* J
3 n8 T6 m- K* [aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
( V4 s: j8 o5 ^7 ^% A/* Initialize MCASP1 */
5 ]; l7 ^% v; Y& U" Y. Y1 v1 v- u, w mcasp = &MCASP_MODULE_1;
: v5 R4 ~; E2 I; t1 d3 [ mcasp->regs->GBLCTL = 0; // Reset
$ F7 H- l6 q E7 W' S/ m' k$ \. B mcasp->regs->RGBLCTL = 0; // Reset RX* A# W: W# X4 J) B) Y: |# t1 W
mcasp->regs->XGBLCTL = 0; // Reset TX8 \; P6 C+ h" C
mcasp->regs->PWRDEMU = 1; // Free-running
7 N8 r5 D$ X( \( `8 d- f9 }9 V7 U // configure McASP0 receive registers& P0 U) _& V* u
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
: ^! }3 @0 g7 B' N7 Z# W mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, {; T$ o$ J. ?5 l. l$ i3 f( ~
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word- a$ r9 D, k: q. G
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
`; c3 ^, w0 m6 o- @/ t. r3 l mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)0 D' m% q5 D0 d: a" [
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) l3 @5 ]7 {* b# f, \/ k9 i* B y mcasp->regs->RINTCTL = 0x00000000; // Not used; e. K: u% B" H3 ~
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, n7 n; Y \6 P2 I. \- H, G" ~
+ \7 a& C2 K6 r" s" h: T. s! R8 z7 W mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" ~( _7 v8 I; @ mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 C( j9 I& x& M k+ {1 j
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word2 s, m! w/ [9 [
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 N$ [, W& d# I8 j+ `7 Z: t+ O
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- O5 a6 J, \ v& w mcasp->regs->XTDM = 0x00000003; // Slots 0,1& |: u. ^8 l; _4 ]
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& r7 c+ g4 Z2 U$ Y/ J mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: K+ m0 ?8 q( n5 `7 x8 K" b' p+ I* p5 N. g( w; d! V
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
- b2 e# e, }+ k* z" B. S% a4 ? mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
; Q% r: H, p; Z+ v8 M0 ?1 k: ? mcasp->regs->PFUNC = 0; // All MCASPs) d2 H6 `! d d6 |$ u# K
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- [) f4 |) G7 H$ W# l7 m$ u# ?9 L6 W5 s3 m% F1 ]" j( s* Z, V8 q K
mcasp->regs->DITCTL = 0x00000000; // Not used& G A5 v% ^+ s; }
mcasp->regs->DLBCTL = 0x00000000; // Not used
# K5 N; [7 P( h$ x# @ V, M mcasp->regs->AMUTE = 0x00000000; // Not used A7 d. n% {$ T) V9 f; P, c
# n: f7 @- \$ |4 }/* Starting sections of the McASP*/
0 Y& i& o/ r8 d! b; y. r mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
, I7 z( v0 F6 s6 e- Q; h while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 M/ N* J0 b, O mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 g0 @6 ^: q4 H- W. x- B7 x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );# |9 a% Q4 K2 z; f! Y
9 J9 \3 l, g" m4 i2 T, [8 s$ u
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
: r3 i9 T! b8 K) v: p9 a! t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );( j$ ^; ?# Q6 d% F# Z" q# [# |
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 t H# P: t: w, M+ ~- d& u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" T9 M6 F! E7 G0 u& l) S/ v0 u3 t, [1 B1 s2 ?
mcasp->regs->XSTAT = 0x0000ffff; ! u! {& a+ z, K; A1 g |# O
mcasp->regs->RSTAT = 0x0000ffff; - g3 s% {9 U% Y2 ~9 p
: Y. [- l6 f4 }0 h: | mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 w( d8 `4 |1 a. d4 A( X" z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );5 R! W9 `( V! m& K! m/ _
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ' I7 ?2 q* \1 H& X7 _+ o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );4 K! s& V; D) F4 U
& {! u6 d& c1 I5 Q /* Write a 0, so that no underrun occurs after releasing the state machine */
+ J* z$ I$ k; i2 W& _ mcasp->regs->XBUF5 = 0;( f9 ~$ ^' `# u. a9 E Z# X4 Y
mcasp->regs->RBUF0 = 0;3 l3 h; |; y2 p2 D! C* I Y
+ X0 M, }7 U7 _ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + u5 G$ r( X5 {# j+ ~1 Q' E- q1 S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );1 M% j9 Z) J/ \ y6 W- X* V4 A6 y
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' m& m2 X( ?! c+ G4 C while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
; E, S# S* c6 ~+ u, @3 p5 {" G5 U8 Q9 R: I9 x- h
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ) G, k2 B* E, J4 a' Q% {7 J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) L9 `6 A2 x: O3 C) m4 Y3 G; B mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* U1 i2 {9 u7 s9 y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
8 j- Q3 B% o; s% n( Y7 U' T* ?* {% p: k" a A. V7 U* Q, N
CSR = 0x0000; l/ ~+ [1 L( y+ N/ j" N* f7 e q
INTC_INTMUX1 = 0x3d;/ ^% D, V4 d6 c; }) o" r6 b
ISTP = (unsigned int)vectors;
7 ?5 @& O# p/ }( ?2 z5 _ ICR = 0xFFF0; ( t0 l& Q3 I5 y# Z; _+ m
IER |= 0x12;
( o$ V Y0 w" k6 O6 @9 ~ CSR |= 0x01;
% I0 o4 B8 N& r H1 i6 X# D A' O4 P- `1 }$ z, L% h) `' e
+ @4 c! Z9 c ^& k1 H7 J8 @
\0 }; O2 t1 C9 ?& n0 d还有就是两个输入输出函数:+ H/ ~# T+ ~( v% L7 O/ p
void output_sample(Int32 out_data)( _* S1 }) B' O- q9 f( ]
{: I0 @8 ~. L) m. n% g
AIC31_data.uint = out_data;
& x- _! c5 o* t/ s MCASP1_XBUF5_32BIT = AIC31_data.uint;. _( s2 ? O5 @' O7 x8 l
}
. o6 H3 ~6 T- W/ m% e' J9 ?2 B; K9 e
Int32 input_sample(void)
/ l7 C4 E, G1 z5 D% @9 y$ m% P# ]{ " |1 n, s& t6 a
AIC31_data.uint = MCASP1_RBUF0_32BIT;5 ^8 v& \( N: j/ N o
return (AIC31_data.uint);
' P4 U/ Q+ w. q}
3 @6 n8 B. S+ l* S: I: @& C4 B5 E
# G5 j! T5 h" ` j# I) }. x. I5 { |
|