|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:) A4 P" T1 h8 c* s6 w n' l
main文件:
; ~/ r- u( u P9 W$ O* V# Kinterrupt void interrupt4(void) & n$ s# E* \+ W5 ~& y4 c
{+ i+ B1 m# f# N. a- _# C
Uint32 sample;3 w1 p0 I' N6 ?0 _# ?' U
b1 l4 T/ p$ Y& R7 n) J
sample = input_sample(); // read L + R samples from ADC
3 c) s* w3 z* @& n! S output_sample(sample); // write L + R samples to DAC
4 c, H! p! m, p return;# A/ Z) ]) d* s! N# o/ B# w
}
( k8 A7 {2 L7 z; L) ?3 |6 Q( `. ?2 K) o; j b
int main( void )
" R: }2 Q2 h0 K: h. d8 ]2 @) M, S{- W# F# V* i6 @9 Z1 ?' C Q
6 j1 N4 P% K+ i; _
/* Initialize BSL */
* t: w) R( N: C2 x) ?. c0 f1 t EVMC6747_init( );
" ?/ p& w: f/ ] /* Call evmc6747_intr function */
: N/ R1 K) w6 ^ g; x, g* N% Y# T aic3106_init( );/ V9 O/ w) _! T" P0 g# X+ L
while(1);
' O# _+ \4 [: n9 s}
" z$ J( v$ P, r O, i4 r
9 a' [9 d( Q- L' _! U$ s5 {$ H) M4 t7 i5 I! ]
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题. a) D# |' z' ]# |" Q# T3 ?% K, Q
/* Initialize MCASP1 */$ S+ j" `+ L+ J3 P
mcasp = &MCASP_MODULE_1;9 b8 D. K+ n+ V* S9 H7 V
mcasp->regs->GBLCTL = 0; // Reset+ x6 w8 F% k) @8 H0 X3 A- q: g
mcasp->regs->RGBLCTL = 0; // Reset RX
0 |& d9 N5 j; ?2 q. ] mcasp->regs->XGBLCTL = 0; // Reset TX
5 e4 k" q" {4 I' M% p mcasp->regs->PWRDEMU = 1; // Free-running
+ h4 @% s) ~6 | // configure McASP0 receive registers$ W2 g+ u3 N& W
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% }4 n7 `8 j7 E1 ^- e0 T mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- K' q& m: P) {2 L" P mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word. o2 O0 Z) ^7 X2 u
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* H# r: z% { }0 Q9 ~* _ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side): h% v o" Q" a$ H! d" u
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 B* s% O$ E8 L7 x, {+ C# ?6 m mcasp->regs->RINTCTL = 0x00000000; // Not used- o1 N/ A& y. ~% j
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 d- X8 I- K) q: |
5 B3 U$ q; i$ }! `7 Y mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
9 |7 X( `7 `+ u4 f mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 r6 m. s& z, x2 }# e' g
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 J& A8 h; T. L- N mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 ?, I$ S) a: L3 }) W! W! [) p7 y9 G8 { mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK4 y; r Z5 u! Z% D' i) {
mcasp->regs->XTDM = 0x00000003; // Slots 0,1- J: {* |- T+ ~0 f0 g2 |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit( L: M! O! s o o
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' s2 [9 b& {( @. O, H" f3 f3 f' e+ C0 p( {6 u, }
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
a: ?% V0 m4 ]4 R* ]& n& f mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT6 O$ a% _% o) |3 |
mcasp->regs->PFUNC = 0; // All MCASPs" o/ v* v* j* d' l$ [
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" Q2 R( I1 \! F% Q1 J% G! `
9 \3 } U4 h; x' w* b! u* ? mcasp->regs->DITCTL = 0x00000000; // Not used9 x0 R9 y3 e1 `6 W
mcasp->regs->DLBCTL = 0x00000000; // Not used) j7 ^0 S! e1 `8 T* O2 q
mcasp->regs->AMUTE = 0x00000000; // Not used3 s* I/ Y7 I& b% y
9 U/ {6 V" K! u& {' O5 P6 Q: A. `/* Starting sections of the McASP*/5 g) ]+ `' P# n% }3 P X, t5 F
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 h% q/ p9 L* N. O6 U L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 g) I) v4 v3 C8 Z! N6 r" I mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 0 y/ X# ]3 F) j `, b$ J+ s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );# ?& m2 m- }& S( I) f& G# i
* A. O. E0 O4 w. P( R: U: ` a4 U mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
" L9 V) V7 I: {% X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 I7 G/ p# P) i w: l
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 Z$ J H! d' p! I" K6 ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' q+ J) @2 z% w
6 [3 f. D' f" s' ]$ O mcasp->regs->XSTAT = 0x0000ffff;
+ h; B0 a1 l& I, q: [ mcasp->regs->RSTAT = 0x0000ffff;
* R5 t9 j) k( n* G
2 ^; G* C- _+ J. W e. o mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& e2 @. a) {4 f6 u, O* t) m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. a L' A) C- f" s mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ I: A8 p3 W5 |4 w& k9 h while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ Y* y- }) f4 C" S/ z) l
2 O& i! @) z( Y$ @5 V0 n; R3 C /* Write a 0, so that no underrun occurs after releasing the state machine */
5 Z! K3 `& s6 h" { | mcasp->regs->XBUF5 = 0;. s( v2 O+ t, ?8 L4 x% ]
mcasp->regs->RBUF0 = 0;
+ ]4 ~1 Q) _% J
: _; Z6 u6 b" |. a mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 J. \- @# @, }' B& t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
M" k9 C: [6 ]+ ~2 ~8 m* ]& d% J6 a mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; - o9 N+ A# t& s+ W& ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 m( M0 M1 P. g E( R" A
& n% Q. G5 G j* ~- n; J0 P mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - q$ [' @' q4 x+ {3 t) L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );' q7 P( [& X! C: y
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; U0 a; ~6 W v: g) \/ V3 B# S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 f. X5 ~) Z7 D2 [) c
) M9 {4 {( e8 @3 r CSR = 0x0000;
7 J2 y# L J- q0 r6 p: e2 H INTC_INTMUX1 = 0x3d;
F# p# v' A( V, e( i8 n8 ?1 ~ ISTP = (unsigned int)vectors;
* Z; W; O) a+ R9 [$ b ICR = 0xFFF0;
4 ]0 @1 r! ?* u) ~ IER |= 0x12; , |/ l& D& R0 X; N9 x
CSR |= 0x01; 1 c* S# r6 n, g5 Z: p4 d
9 |9 z, O- r( E' [3 T; r5 k
" F; y$ } B- j& X b
+ p. `1 E0 [) C8 J还有就是两个输入输出函数:# ]; a/ N2 r& K! N$ {2 B5 [7 q
void output_sample(Int32 out_data)) f6 B9 P) x$ L, Q3 G! w
{* W1 r3 e) V( ^" I) t
AIC31_data.uint = out_data;
, j3 Z( l4 l! L9 K [2 Y3 ~ MCASP1_XBUF5_32BIT = AIC31_data.uint;# J7 P6 v3 F4 w7 C
}
9 c+ I6 Q" J) I2 s/ E. R' i2 w. c* W1 `
Int32 input_sample(void)
! u7 c& ]# A' H8 }" c{
' G0 s5 p3 D, {' R8 b9 a% k# [ AIC31_data.uint = MCASP1_RBUF0_32BIT;1 ]8 R6 _7 s! ~) P( k" x
return (AIC31_data.uint);
1 h$ J: v) S3 M, s' C}& \" o2 q# D4 [1 `6 ]
1 `! e' [# C' f# g$ s+ j; E |
|