|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 k; q: x9 q# [% G: ]5 Imain文件:& h) f$ w0 V) c8 h' t
interrupt void interrupt4(void)
. `3 \- N/ `. T; i: z8 I{
! B* e1 ?; G, D+ I, ~ Uint32 sample;
( q6 {1 G. Y" H2 R$ Y: P8 i
0 P$ l; U$ a0 H3 Z sample = input_sample(); // read L + R samples from ADC
3 Q8 m* b. g3 `% l0 r9 U) D- @6 J4 C output_sample(sample); // write L + R samples to DAC # V% W) k$ A9 \
return;
- S4 N H8 b# _+ I' f% G4 n}- ?2 ^' \* j N$ u
3 q. E0 Z' U4 }, R' P# `' s P cint main( void )! o6 n! G: |* @" O( u
{3 s" m# D7 w' _/ f8 Q" W# i, k
7 [$ `' y4 I* Y3 X5 Z /* Initialize BSL */ P' u% d& z5 V+ g f( ?
EVMC6747_init( );$ H" x( a% u7 A# u2 W! n
/* Call evmc6747_intr function */3 `( `& k. `" V7 a0 ^
aic3106_init( );
. a+ `, ^ h) j9 Y( T* w9 c while(1);4 v; u9 Q4 l% w
}- @7 V9 [7 r: S, J- E- s3 K9 c( o
( b `: \1 {; U+ H1 C3 \5 n* w- f* B, F# D# V; z) y, r. ^
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( I2 S) k- X" E2 w) o( S7 t" `
/* Initialize MCASP1 */; P& @3 h' t6 C) e
mcasp = &MCASP_MODULE_1;4 T. |. V0 H" {5 A
mcasp->regs->GBLCTL = 0; // Reset
) P, S% E8 l9 @/ i; z mcasp->regs->RGBLCTL = 0; // Reset RX
: A; d) o5 F. W4 W7 x( O1 v$ d% B# |- ?) c mcasp->regs->XGBLCTL = 0; // Reset TX
8 v( s* Z5 }3 r: G6 }1 m( \" h mcasp->regs->PWRDEMU = 1; // Free-running
' N# ~6 e$ q/ K0 o3 c: O U // configure McASP0 receive registers; N4 ^9 \" ?% s
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 ?* p- J. M" `% F$ t, ]% Q0 m mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& ~' K W# Z2 L! L1 f: C
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word' P+ X) P$ }1 n2 g3 M1 }
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# s8 N/ Q* f' N3 _, Y mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)" F" R7 x# r3 v0 d' r0 p* y
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
# K# |1 ~# l+ k" |9 w4 v mcasp->regs->RINTCTL = 0x00000000; // Not used( R2 i% q& E. V3 W: ~3 F( Z
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, b5 C5 V8 T Y2 y) C) v- N. Z1 Q' n% @* z8 d# V
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. j/ l; ^/ l! |+ w2 k/ [8 v" ` mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* a3 _2 G; `$ O1 h+ J2 V5 c mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& \) V: C0 k0 ~1 x, e4 i6 V
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16$ |, g* ~, S- Q& s- {9 f) _
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK/ X1 m' k; e9 x& r! C7 Y4 K1 f
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 l0 \) K) q& h3 U, C' C( G mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, g$ }2 A2 P: M mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 F4 B# J, Q# M% Y/ r+ O
2 y O9 ~5 t' N. k, f- K mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 m" v, K: L# K; ? mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' s2 w7 ^+ @4 f& m g mcasp->regs->PFUNC = 0; // All MCASPs
* y+ O& W, J4 x1 L$ ]- s$ q mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1- M: Z3 f( _0 B" [
" M' n: l. z% H3 X" A: ~- g mcasp->regs->DITCTL = 0x00000000; // Not used
9 W# C2 g+ b8 x; F- _& b8 n mcasp->regs->DLBCTL = 0x00000000; // Not used
7 ~ h: P5 E4 m! u+ ~ mcasp->regs->AMUTE = 0x00000000; // Not used! u# x3 K% t, p' c% e6 Z* n
$ E. d* ?/ b' D5 O+ I8 g# [
/* Starting sections of the McASP*/
( a( n8 w5 W# V% v mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; # w8 J. G( o" P* A) F/ L( n" T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 X8 q* R- X" O4 T4 c, H5 G# ?5 b mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 4 _' j7 a$ T& J a3 F4 O( s m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
Z% U! t- l" w2 ^- M, E( g8 B. i& p2 h" ?" K( l- H
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 D! T6 b _2 n2 j/ F; A! ~/ s, I" L S while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( r+ l# C: I i* Q0 {+ F i mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 Q3 q2 B" }, w* w0 b while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 o" F5 {4 M0 i: I2 {4 o8 _& F' H, v) c$ i6 r
mcasp->regs->XSTAT = 0x0000ffff; 2 @4 y, s3 ~ U( V, ]3 u
mcasp->regs->RSTAT = 0x0000ffff;
. R$ `7 E8 z. R' Z1 K8 G
8 Y9 T' ~. O/ Y: g mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;* R; o/ n( M( n3 E4 P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 x3 x& Z3 {) ?7 i+ l mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# c* Q9 j$ }, q% b t3 l5 W/ x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) h) ?2 b7 t4 E
0 Q7 @: r$ v) ~% a5 R! U /* Write a 0, so that no underrun occurs after releasing the state machine */
3 M9 Z% s4 L8 T- V$ H7 g) c mcasp->regs->XBUF5 = 0;: ~; E# l. ~ G
mcasp->regs->RBUF0 = 0;) V) d5 k' J4 f4 k6 ~0 o
$ @/ o' b# B, f/ h. `3 ?
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 d6 m! `& |- K$ M9 T& J; _, J8 f& s while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );* w; `6 G1 Q" t4 N- I( V
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! U! c3 g7 d/ R. z+ m4 U) q! Y# A4 B while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );- G0 ?" M0 Q/ k8 w( |5 g
, }1 Z; U/ B) P2 S) | mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
) S3 ^6 P5 Z% F4 {1 v" d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );: K/ ] {4 ]/ N6 P
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 j. b! I0 f0 c& ^. Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- b) c/ a- _0 L8 k$ c N$ C$ ~+ n* m2 ^& g" K) d5 c4 `
CSR = 0x0000;; C4 m! m) g$ ^1 U
INTC_INTMUX1 = 0x3d;' E; N$ }2 k P7 v( C% j
ISTP = (unsigned int)vectors;
$ ]) Y5 ^$ N. F5 O ICR = 0xFFF0;
3 S6 Q4 ?) v& z* L9 h7 L5 D IER |= 0x12;
0 \# y' l+ S5 F9 q5 g3 P CSR |= 0x01;
! \- h* O5 b* X1 b c+ _2 A
# s1 _7 @4 I7 x# C! G4 Y* S8 h% W) u6 n; T8 t# Q2 j( j
7 w9 L0 m8 n/ {# g1 x9 b
还有就是两个输入输出函数:
$ _( m; t) _' dvoid output_sample(Int32 out_data) f9 Z/ E( `2 q4 b( T4 \8 G7 I
{
8 T% V! U# H k& t8 w% D AIC31_data.uint = out_data;
2 m* h* r5 s+ }( p6 z& D) M MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 R9 C4 v" {( {6 Q5 @0 s}" S# `/ ], D/ r6 P8 C' y; B! U
$ n! o2 p8 P1 R6 S% ~
Int32 input_sample(void)4 ^9 z2 e! ?4 z9 w
{
9 q5 ~' F) l1 h& f% ]7 h AIC31_data.uint = MCASP1_RBUF0_32BIT;6 S' F6 E% J6 `5 G% |( L
return (AIC31_data.uint);
4 V. v+ k" R: r1 h- W0 s+ J}/ G( X A1 U" m" G% j; N
7 ^% V- ]" E; D: ~0 ^ |
|