|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:) _1 e' V$ f) R E) y: C
main文件:
, [. Y! Y% a$ ^4 A& G' l8 C6 sinterrupt void interrupt4(void) : n# p q. X% T# J' i+ a
{
- A! K2 f* G7 [- x" l6 v1 f Uint32 sample;9 X& P6 b" [2 z
6 M5 _0 W q8 _6 T& d' _ sample = input_sample(); // read L + R samples from ADC+ ^1 R5 U6 M1 q& y1 U
output_sample(sample); // write L + R samples to DAC
( z( X5 W% j5 D# f return;! m4 A* w3 ~/ ^) L* t8 P
}/ U- l5 [3 w5 i
2 c2 [) W- Z; aint main( void )' Y5 F9 i& t( [4 |* {( L
{2 V. Q: _- B) G4 T: A5 Y6 R* v
) A# S! b! z: o; A- C$ v" B* y /* Initialize BSL */
" x q( i" _2 M9 e: R6 J& W* _ EVMC6747_init( );/ S- F, j ^ e" P3 U) j f3 m
/* Call evmc6747_intr function */
1 P$ b) \3 v; s7 J1 q aic3106_init( );
5 p H' W; G$ v6 n# h2 Z4 i, S while(1);! u* D. D) N! O6 Z7 p
}7 D# }; B$ s$ J! L7 s
+ X0 w/ b. e! j3 D* m( P! \
/ {, a7 {! k2 l/ }( J
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) O; y% Q; y1 w/ K1 V) p/* Initialize MCASP1 */
1 d7 r4 m; v9 D7 o% i+ x* p mcasp = &MCASP_MODULE_1;1 t0 O* r$ m" f+ X8 i
mcasp->regs->GBLCTL = 0; // Reset
( ]' n, ~1 M8 h* A! @ mcasp->regs->RGBLCTL = 0; // Reset RX
) s% C+ v; t3 F0 y r mcasp->regs->XGBLCTL = 0; // Reset TX( ^) [6 O& o3 \/ k; \7 h1 k
mcasp->regs->PWRDEMU = 1; // Free-running- Y5 Q' J' c7 ^7 n& `! `/ L8 L
// configure McASP0 receive registers2 D7 S) x6 ^% G( z2 ~: W
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used7 P* `2 [7 I) \+ k% k
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& s3 y% ^* q6 `; K mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word+ R6 Y+ p/ @0 G! X5 J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 W f+ U* w( L# ^: W- y6 q2 X! E
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)! e! j; a) Z* F5 J4 C* ~) x
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: O. B) F! y8 s* d5 D mcasp->regs->RINTCTL = 0x00000000; // Not used1 U* E/ @" z' @& j0 h" S
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 `$ @9 h* g1 m+ e, _; h
* o+ d6 N& u; u' W9 {* ~1 y2 Y& y4 z mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
C$ v9 A- I( a5 F% @; u mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; l! b: Y1 k) ]) U mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% z% X% [8 G1 o( }% Y( m, x& w mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-162 k9 w* w/ s) Z% ~6 R
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK4 S- e3 v* I/ S) n, a' d/ ?* @6 K
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 s N8 S, y/ ^. G: O mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
+ w6 F( V+ ]* [, B3 A0 q. f- L mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' p- E- p) J4 g- {8 \- v
' o6 y) g. O7 ]& z) P* k mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN( h" h0 H* Q# \- @
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT- w& ]* W p: o4 R8 e/ a' c
mcasp->regs->PFUNC = 0; // All MCASPs7 {7 @: u( f- \) ]+ ^2 T2 C: [3 F
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% I! S# J2 n0 F# u4 E% z( F
# x0 a4 X( q2 ]" x& k/ [' Y mcasp->regs->DITCTL = 0x00000000; // Not used
+ _% N- c" Y& O; t5 e' W* t8 G mcasp->regs->DLBCTL = 0x00000000; // Not used
# q% g1 I: ]. i+ n1 H# L7 R3 n2 x mcasp->regs->AMUTE = 0x00000000; // Not used
: V6 ^0 f9 l8 v& M8 `2 ~' Z$ E' H6 s3 I1 B5 S- ^6 G0 U
/* Starting sections of the McASP*/
1 B X$ ]5 F; Q( Y. y! d5 ] mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
6 ~0 a9 [; e5 q; _5 W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 G4 w/ Z; R% F) v, ~/ M: Q: p1 B mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( @' {. T0 R1 l3 O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 J( \+ V- H& |3 j6 E H+ Y
5 T) k0 o3 c8 [9 @" a( M c
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 t9 y% K' `( n. \+ l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ d0 |: f0 t" e/ M$ ?2 ^3 X
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 1 r4 v/ r) Z6 r# h# ]" d8 [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& V1 U" ?8 O% ?% f, w0 {' F
. q/ j \7 R& I, Q( q# ?0 h0 q, A: C mcasp->regs->XSTAT = 0x0000ffff;
; b3 S1 I- L3 O- E1 S/ X, N# o mcasp->regs->RSTAT = 0x0000ffff;
2 ` y' Y, E# }% m3 g+ R# N: S+ B# K& |/ S# I. N1 m; ^
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& v* k3 B) f4 a5 b- d: X/ E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- e! z5 y0 Z4 c# {
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 X9 d3 x8 F/ n0 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 A" |: x5 t7 w& H# t. _5 W B; S5 z& P
/* Write a 0, so that no underrun occurs after releasing the state machine */
. y( [6 e. r; ~) D* v9 U7 F+ q! @ mcasp->regs->XBUF5 = 0;
8 s/ y$ ^5 g# Q. z9 j5 _ Q \ mcasp->regs->RBUF0 = 0;
% L1 g9 u# \) q1 v4 ?9 C
) p. O! I* e' D+ i mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / ?- X2 }2 h* |9 `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );6 C+ `( y2 R9 {' s
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , g$ p+ \+ g7 o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' V/ H Y4 i4 L& }3 ?7 y
; R O6 T% i5 \# Y mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 F; w# f0 w* ^$ q& Y Q9 F5 g6 W* |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' d8 {% z" I" [5 F8 E+ @
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; + ` S7 x5 k g7 g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% x( q) P; H4 r( \) F
0 _# M: C5 ~% P R" d8 e! x* s
CSR = 0x0000;
0 g$ Y3 y$ @' l4 A9 P INTC_INTMUX1 = 0x3d;
7 g) F8 ]# y, c% N6 w5 b; X! a+ m ISTP = (unsigned int)vectors;
1 k& ^" T, W) P) i& B ICR = 0xFFF0;
$ W; M( t" V( p5 c IER |= 0x12;
2 s2 i$ N1 J- k2 X3 F( ` P+ c* n: H) e CSR |= 0x01; , ?! b8 _# K D% \! j: }8 E; a
; Y) Z E: v% V4 M& W
# n \; |7 H( D2 E6 K- h3 \
- d& p+ F6 y3 f1 f6 |还有就是两个输入输出函数:
" X* e8 o( O% D) W! qvoid output_sample(Int32 out_data)6 C4 S+ y: q! G7 F; \$ b
{! o% l5 x$ q: @" C
AIC31_data.uint = out_data;
! I! h( Q5 |* p7 P c MCASP1_XBUF5_32BIT = AIC31_data.uint;
; j9 D/ W. j. _}3 V/ J; q$ M% h/ g, O
1 U. z7 j1 {* ^# d! z0 H# pInt32 input_sample(void)
6 \) g# F5 S# J! ~* q{
" h7 z' `- ` v; k! t. t AIC31_data.uint = MCASP1_RBUF0_32BIT;$ H) ]. r! ?+ `8 K6 o0 E" K5 ^
return (AIC31_data.uint);; S- C) v: g6 d7 i( w/ N
}
2 b' v! Y# g, t! ?
* Z, N. P( X& [3 O% D2 ^ |
|