|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, ~: P. H& [4 W1 mmain文件:3 g5 Y4 U8 r" v0 g6 d1 Q
interrupt void interrupt4(void)
H# x% S8 ^' C! [. ?0 f{
?- O* P$ H6 ? Uint32 sample;( o& B7 z ~% a, E: L* L0 U: k
. w" g7 c7 Q+ W
sample = input_sample(); // read L + R samples from ADC& i5 G3 s$ q8 D/ x" Q! y* C3 r
output_sample(sample); // write L + R samples to DAC : c6 n+ q+ `1 X. }/ g9 R9 h
return;
, k" J7 v. T# I}; Q' C% J7 e/ C3 Z' C
6 x8 q+ q1 {# u) {int main( void )" p' g) v! _" M/ W
{
' h- J8 t' j2 i. A% o1 L: K3 S/ _0 N$ H, T9 \# a# G0 ^
/* Initialize BSL */
: T! _9 ?9 Q0 ^. t) s+ I EVMC6747_init( );9 c* N0 l! B. d1 x; X' y
/* Call evmc6747_intr function */8 B! I9 F! v$ x% F! y
aic3106_init( );
6 ~% s4 O2 d8 x while(1);. d! ^ G3 b: L4 [8 {0 ]
}# B A/ ^5 m) q6 y7 q
* v3 J7 y0 K4 T' Q' @ _
6 }# u# N3 O1 G1 f6 S1 _aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! y+ s+ H/ K4 h4 d D/* Initialize MCASP1 */: g' _# d& t+ _+ n+ H
mcasp = &MCASP_MODULE_1;
% A/ X, K$ q- K" O mcasp->regs->GBLCTL = 0; // Reset
: P! k3 S9 a/ R* s$ g6 U mcasp->regs->RGBLCTL = 0; // Reset RX3 J; w. ?) r$ a9 [7 f
mcasp->regs->XGBLCTL = 0; // Reset TX% v. m4 T$ T& o$ _) F' O
mcasp->regs->PWRDEMU = 1; // Free-running5 ]- F8 U( F+ B7 x4 _) m1 w
// configure McASP0 receive registers
/ C% [% u7 }- {1 p$ X, C: @; v! z4 G mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used6 r g7 `1 L- H) z+ r2 M
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 _/ ~1 W7 A4 }9 {4 k2 u mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" o8 K+ j+ p7 n& ] mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ i4 M' r. E0 ^
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; j5 g( O6 S; [( H' \ mcasp->regs->RTDM = 0x00000003; // Slots 0,1
- t2 e' Z# u& a" @! {6 W. w mcasp->regs->RINTCTL = 0x00000000; // Not used; z' W8 N5 }: ~) ?; U* s
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 Q. E) O# `% e4 J( Q
" V" k5 u/ v9 h$ G mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used2 q% b# U- y# ^2 ~# t
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 S* l- r7 u0 R' q: I" J mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ l! l% x8 ~5 n$ K l$ S" k! q
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: m3 I8 p7 X x2 w9 C/ d mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
& H. ^; E( {- V- B: M mcasp->regs->XTDM = 0x00000003; // Slots 0,1
" U) L' P! G, |! `9 W" {" ~# I$ C% I6 s mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
4 g4 q5 j3 q8 e; {' H& Y5 d mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, @ Q' L6 O; P& q; ^6 r: O- |1 t
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
2 c% @5 `8 ~0 j- N( e) T mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' ]6 k2 j4 v- D, n, ~" B9 f mcasp->regs->PFUNC = 0; // All MCASPs5 P8 E" n$ D; t- k8 q9 u
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 ^% s0 P3 L/ P `5 G" G5 B
. E0 S5 Y+ M! u/ Z/ _0 {
mcasp->regs->DITCTL = 0x00000000; // Not used0 s+ j# H# [8 c% z. N2 _# H, ]5 ^
mcasp->regs->DLBCTL = 0x00000000; // Not used' ^/ x7 m5 U$ g3 z0 n8 H
mcasp->regs->AMUTE = 0x00000000; // Not used
+ h& a% L, R+ C) ]( N& S5 y% ^* j$ ?& ~* A3 m& `; q
/* Starting sections of the McASP*/3 }- e# L3 j. P9 O$ d; V
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( i9 |$ X+ g: s; _; y8 B9 G$ ]3 w while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 8 M' S- f: `9 J: K
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 S. a6 H7 |4 {* S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ [& ]$ |4 ]8 Y9 X2 S$ \' \7 U. b' w
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 7 o/ O2 i1 w7 E0 o1 ]; k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );' K+ P- K1 i: c% y
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
_. p! S& ~& C- A6 d( F% w' s! C while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );' \) Z8 A* J u) l2 v! a5 r2 I$ T
2 X6 N/ I9 w7 L) s& W& A mcasp->regs->XSTAT = 0x0000ffff;
* k( S- I8 |: b* o3 U a- G# c mcasp->regs->RSTAT = 0x0000ffff;
) V$ k! |6 {- M0 c$ V# S: O6 q" m9 K$ e# u/ V. B4 f+ ` R
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;" P, r8 W9 H3 j7 C3 S, P: U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" f5 [$ K' O7 w5 B mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 R! g& Q' I! C* G+ k, `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 C' W' b: C1 z9 x. G$ B# G
- F% o6 S) [0 v4 Y4 ~" r) U! H
/* Write a 0, so that no underrun occurs after releasing the state machine */
. w9 m1 Q( t$ b5 p mcasp->regs->XBUF5 = 0;
* n( A. u' s& l8 { mcasp->regs->RBUF0 = 0;; e) r0 s3 b6 M
+ f- Z; o; s/ I0 p7 Q. V mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 9 E7 o/ O% ~2 S3 l7 L+ }& ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. P( O5 r1 K; t9 z mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ p& Z8 g- J0 s1 q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% X; B2 P& f. |+ _# q/ _
/ N+ E* G# `* v7 a P/ B, [/ u mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; $ k% e3 e& m, B. ]( N7 J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );$ t, m8 u" A/ r8 x: |9 P
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 u/ k/ E( H; l" \) X# @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- Z* X! X' r. c! ?6 Q( T& \
" w1 V- w2 h7 w) ^ CSR = 0x0000;+ w/ Z2 \: M; P* A
INTC_INTMUX1 = 0x3d;
. T7 `& j6 f6 p# v6 A6 ` ISTP = (unsigned int)vectors;) D, ?; g: I% Y! D7 @
ICR = 0xFFF0;
. J& R. N2 s8 _* Y2 g% I2 w IER |= 0x12;
# C' r% @6 `; T CSR |= 0x01;
) r- E- n K& }' @" ?6 u+ n# W% b% w; ?5 H8 f% Q% c7 S6 Z+ i
; v/ B0 A5 b3 d a. h. J
, ^- o& @4 e2 a/ p( ?
还有就是两个输入输出函数:' B4 c2 m$ x3 r" L3 M
void output_sample(Int32 out_data)
9 g/ U1 ~7 ^6 u# O$ u+ ]9 h4 z& v6 m{
6 ], t4 b" K8 L AIC31_data.uint = out_data;
1 U) ^$ L! l# ] MCASP1_XBUF5_32BIT = AIC31_data.uint;* V! K, j1 n, a
}
7 V6 C! ]+ T" i; I% q$ T2 S" x; |# X+ U% z6 O0 W% P
Int32 input_sample(void), N( L' p# m+ y- F5 k/ `5 i+ e
{
" f( @' P4 Q8 y9 B1 o2 ~ AIC31_data.uint = MCASP1_RBUF0_32BIT;0 z6 H, L9 [& g1 ]! z
return (AIC31_data.uint);
& ^8 g# }* a/ z7 t. T& Y}5 ?( R! R4 T2 {3 z
4 y$ ~) Z+ ]5 A8 P. V _" @) W |
|