|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 Y/ l( O/ _6 n, T1 S3 Q) G6 p/ ^+ Vmain文件:1 S" J' m6 v% r" i/ ]1 P
interrupt void interrupt4(void)
- P4 j, V' r2 `( I! [" D{
) ]2 t: f/ a$ }1 W: m9 | Uint32 sample; g' Y$ D# s% {! S. C
; v+ i- w5 | Y, L; R( R sample = input_sample(); // read L + R samples from ADC
8 I. ^% [0 p" G output_sample(sample); // write L + R samples to DAC
5 K4 j- F# `0 D8 W& y! n return;
7 H1 ]4 e2 I1 [$ A4 N* q! @9 r}
8 h6 @3 Q) Y9 y* ^
( I6 d" R4 K4 Z) I/ i1 t- Bint main( void )
3 ~2 H8 Y. k7 r; A& E' r{
& t) ?2 [' M! v* d: Y" }
$ H+ D0 G5 I1 {) ~ }2 H6 ` /* Initialize BSL */
$ M2 s G9 C2 c' \* X( L$ ^% ? EVMC6747_init( );
: K0 H; O( w: Y) W3 S/ D /* Call evmc6747_intr function */
+ H3 s& k+ a% r2 P1 g aic3106_init( );$ n) h8 e' V4 |0 K: Z3 l1 H6 U2 Q
while(1);
1 V" v" p6 T- p- p- x} H6 B8 b6 @/ O# [5 K L2 n
& ^2 P. R7 Y- P' ?- p6 p* q7 r
, S8 `9 |8 r0 W+ E( `% g- Naic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 \8 M( t6 W6 d6 h. d* I" v
/* Initialize MCASP1 */$ l5 X( m* W" J& g. o7 k) M
mcasp = &MCASP_MODULE_1;; ?4 i6 t4 i8 A; ^
mcasp->regs->GBLCTL = 0; // Reset
8 T2 s" W: p( ]+ }& n mcasp->regs->RGBLCTL = 0; // Reset RX
( p; X/ J; {' r" Y mcasp->regs->XGBLCTL = 0; // Reset TX
8 i8 m9 l) ^% `) m: M- i4 p mcasp->regs->PWRDEMU = 1; // Free-running% u! X0 T! g$ s) Y+ p9 ]
// configure McASP0 receive registers
. h" ?! l8 {1 v! k& ^$ w% U8 Y mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
& L& K% g" y0 |- ~ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 q) L0 M, t" N1 U" a mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 n0 L% h- ]5 c; z% ] mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' r8 {+ U Y! M( o mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)4 [, u" Q- s$ Q. h+ A
mcasp->regs->RTDM = 0x00000003; // Slots 0,1/ Y% |- Y# ~1 I0 U
mcasp->regs->RINTCTL = 0x00000000; // Not used8 s) C5 z/ A, ^5 b- |; i' \
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 |: ~$ `8 I2 [" e/ n0 L0 F
' K* j/ T e0 b$ ^! _3 j mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
) r7 ~$ _$ v1 v5 s7 ~3 V5 v mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, t4 Y( H; F1 C( w7 Q* K- B
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" \7 z U; K; G* L: s
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* h6 O6 I" c. P- m0 O" _$ v2 J, V mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK' _7 Z2 C5 ]8 y, m
mcasp->regs->XTDM = 0x00000003; // Slots 0,14 M. r. X& k; H+ ^3 r; B p5 |! F
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit. [( H4 c2 F J# L# u. P" T) h
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( ~$ K ]! ]. b/ U. N
* J ^' l0 @3 D C: r, t mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 g) ?+ N: T1 ? mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT4 O) q0 q7 k7 v9 b
mcasp->regs->PFUNC = 0; // All MCASPs3 h ?: |9 X8 A8 L6 w; m2 I5 E* Q
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
7 S$ z3 K; L3 r& N
$ s3 [' N o `9 \5 W mcasp->regs->DITCTL = 0x00000000; // Not used
3 M ?* H; _- u* Y mcasp->regs->DLBCTL = 0x00000000; // Not used
( C) ]0 X {( H, N! A: O S6 U' B( q0 U mcasp->regs->AMUTE = 0x00000000; // Not used. U6 I; B4 H3 q: C9 d& B" q4 x' U
6 ?1 T# P6 w O: H9 b6 q. J2 @' Q/ ]
/* Starting sections of the McASP*/# ^) Z. V( p' _
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' l/ [+ p! l6 }7 a( d3 u while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
' S0 Z0 U: {/ a; m; J mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; + x) E8 K) L8 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 l0 L$ \1 i! N# F/ s' @$ i1 B) b7 D' g; B5 {* ?! a
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 7 D; O- n6 [ u. t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );( N6 W8 U4 D6 q! Z {
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; " T& R2 ?% }, ]( n6 K9 D! y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- }1 f! G. p, W& W. ]# D
3 H; J/ a) I7 L* E3 \9 l- f! S mcasp->regs->XSTAT = 0x0000ffff;
. B! Y$ a/ h! ?, l l% ~$ r: \. g( ] mcasp->regs->RSTAT = 0x0000ffff; , S0 }# Y# [2 z6 N) H$ x. [. y9 o0 Z
5 |( O5 e2 B7 N
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
3 ?5 I& M4 [( g3 p( d( ^ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! r# ]) b/ n g0 y0 s/ }2 {- U# W mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; " W5 G* C+ K& ~% v' R, m, z9 |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ ?. `2 {; y- \ G* `
0 r' U4 o8 F% e5 o! x /* Write a 0, so that no underrun occurs after releasing the state machine */
( H* z2 e& @6 {- D2 j mcasp->regs->XBUF5 = 0;
: y/ l! b& U" N& O: L mcasp->regs->RBUF0 = 0;0 v! _+ |( o' p
/ e; C: v" |5 t mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ! K8 P! Y7 I) l; @5 u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 Z# X0 ]7 y. T2 L$ ?( P9 a8 D
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; * q6 C8 S. [: l1 @' P- A5 x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' ^1 Q: m5 U: C+ q8 T. ^7 o& J- l0 \+ ^: u
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
% G; i: P: ~5 T7 M; X- P1 P while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 y' r! ~! P* [" D8 g4 D% F mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ a, N) D/ t, E* [ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( {) m/ C/ a! e9 q+ |$ H/ W; I& @6 ^$ ~, t0 I
CSR = 0x0000;
: W% M( I5 g1 C c9 O+ A INTC_INTMUX1 = 0x3d;
# a3 e' a4 l* a ISTP = (unsigned int)vectors; x1 W; R* X$ h5 Z( k2 D0 @; R
ICR = 0xFFF0;
5 q; ]/ ` }" L, m5 \ IER |= 0x12; : r+ i1 }" ]0 a2 P z
CSR |= 0x01; * J# k8 q3 ~3 V: c! l: X
5 i$ T4 F" `, R: Z1 l; t: i% @( |3 N [+ e% e3 l
& r: z5 y. W) |$ f- }0 T, f! v( B
还有就是两个输入输出函数:
5 v1 Y2 v2 K9 |4 Evoid output_sample(Int32 out_data)( |5 T8 T' o5 j+ ~/ N- R. L6 u
{) R. V# q. ?6 p& f5 b, ]
AIC31_data.uint = out_data; " V! y/ J$ L6 s; {% O+ Q: j
MCASP1_XBUF5_32BIT = AIC31_data.uint;
+ l- S1 ~. N* `( ~}
) A. x0 T/ Y6 U& t5 ^" }5 P& M9 y% j0 O4 q* G
Int32 input_sample(void)
8 g, O$ D" {/ `! P4 O{
' m! x+ z9 G+ U w4 } Q AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ } E. C0 V; c: c& p return (AIC31_data.uint);' S H) ?8 q! Q/ g$ k4 O
}
( E1 }5 o* r0 v% j5 s* @/ ^9 W: d8 H7 q$ }
|
|