|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% g4 \6 R, U& ]/ a6 s2 Amain文件:$ n/ ^, \3 a8 u: |; F5 I6 W2 G, H
interrupt void interrupt4(void)
$ I7 d) F5 R# A/ d& T: \{
8 t, U$ `( h: C1 m) y Uint32 sample;
- F7 @" I" M; D& S' J# H( l
+ \4 e1 B/ j& B& S7 \4 i. a& s: r0 D: S sample = input_sample(); // read L + R samples from ADC8 d Z! @) f: Z4 N8 [2 G* Z" f
output_sample(sample); // write L + R samples to DAC - ?- l! S: |' }# @8 j
return;
7 k' G5 T M0 i( J& P- ` V}
/ ^- p- p: u8 _/ [2 b
2 x+ O, E5 L% Cint main( void )
* v o/ w( I1 ]2 T. a8 e{
4 x$ Z- n! b% R7 u4 @
_$ p& c7 c4 b4 }/ ?" o /* Initialize BSL */2 L/ V) c. z8 v! e( S; M* g
EVMC6747_init( );
! F, d" c4 [, V# Y: Y) p& ~0 F /* Call evmc6747_intr function */
/ [8 p6 y0 t/ C0 v! T aic3106_init( );, d2 k. j# Q! `5 B
while(1);
$ ]6 F4 B$ `$ x# ]. A}( `& i" i+ a0 c+ W+ p8 e+ ~5 [( ]
( l2 b3 m" {8 }7 s3 f1 j0 z( ?
s) ~$ t4 c: R( L4 Q+ z. J- Jaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 M% j: `/ i0 h& M: a
/* Initialize MCASP1 */1 @% [0 h# q! o" t
mcasp = &MCASP_MODULE_1;
$ P& c M W, O mcasp->regs->GBLCTL = 0; // Reset
; Y1 l. s# n# T Z: m mcasp->regs->RGBLCTL = 0; // Reset RX
- _. ~8 r9 H V/ K0 ] mcasp->regs->XGBLCTL = 0; // Reset TX
8 p& c% L5 h2 | mcasp->regs->PWRDEMU = 1; // Free-running
4 ]4 Z$ X$ ^; E/ e% ]+ X // configure McASP0 receive registers
# _, r4 R' |! g* w O, y. q8 ` mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
" p7 x0 R% q! W: ~2 O( q mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; H+ b# o4 |. P5 S1 m mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' J9 o9 j6 o/ V- ~6 B mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 ?( }6 J5 ^; H$ w$ K
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)- z( T1 S- q+ Y
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) w+ V- N! L, S mcasp->regs->RINTCTL = 0x00000000; // Not used
R! ]' y8 _, I( |( c mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" N# K) _, V. F8 J7 y, @) ?
4 `6 V F' Z; c3 R+ ?
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used8 a4 c& x1 w: }7 P4 ^
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 q; U7 q2 ]! A" z
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word( X( D/ V- Q- f. W
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! M" X. Q- y. ~* P4 z
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK/ {/ f7 R p3 ?( K4 h e
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 j1 W6 |! }+ X) \! s$ D mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit$ H2 u! a J+ i0 R% L
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' @$ f( [: A2 A. n
, O9 P3 |0 |) j) U+ X( {2 N
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN7 Y( D/ D: V% @! |# a- s
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' y- H) h0 x7 v5 k2 F mcasp->regs->PFUNC = 0; // All MCASPs
7 f3 _1 F. C( O$ ^' y' N mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 l- D8 g! z7 e4 r
$ J) _4 Z/ [& _3 ]# d2 B mcasp->regs->DITCTL = 0x00000000; // Not used2 J l# S4 c% q( l1 w4 F$ T
mcasp->regs->DLBCTL = 0x00000000; // Not used
/ {7 ?: p% Y, T; m mcasp->regs->AMUTE = 0x00000000; // Not used3 n% g1 Y" ] i8 h
4 M6 Q- q8 R0 ~3 D, b$ W
/* Starting sections of the McASP*/
8 K& }, n# v9 N w* T mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 p% |$ o# W7 X* J% I; f% r3 z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); # @. X% Q% b; f0 Q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( E* ~) i- F7 e5 b; p4 E% t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ A3 Z. d/ Z% A9 |! [; ?5 O. {. t
9 @# X+ E$ w8 ~4 h8 f' o( t( A mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ y( V( d0 T, s7 V+ ? while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- ?5 k: n1 G4 a0 L mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 {3 T0 g4 i# U# p' N0 H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 E" a6 R- r, Q$ w$ |$ ^3 |, k! p/ V
mcasp->regs->XSTAT = 0x0000ffff; * z7 U9 D5 m! W+ Z
mcasp->regs->RSTAT = 0x0000ffff;
2 v8 _; D: R5 G5 v+ j' U
( `# I: T s! J. h* g% a7 T7 g mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& j6 O" Y- H. C/ e1 q' ]" {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
6 m' D1 e, s/ e8 F% z4 h/ k mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
5 z2 A& r u! G6 W5 ~; | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
4 {3 E5 G; t5 @! ~ Z4 F4 H d5 B& d9 a6 m
/* Write a 0, so that no underrun occurs after releasing the state machine */
, [4 R/ M- [0 C mcasp->regs->XBUF5 = 0;* G* |: t' M Z! S# H
mcasp->regs->RBUF0 = 0;
3 h* a! q& @, K4 s" W+ ~* t7 {
+ @% Y* g2 ?0 }$ |9 ^" n4 V' B3 I mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; : ~% C ~1 {. J) u4 b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );' S1 C# ~) \6 L$ S' C9 h
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 T! R; _% H a! X2 d2 ?/ _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* n4 T# g% w, I N3 C9 i# n0 ^$ n0 g0 Z. @- F9 a! G
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ Q" s0 r P2 B while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! e3 Q$ ` _" W6 ^ K2 w5 v' C- a mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& g1 C" q* R$ c" m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );5 w w! [# y: [1 h& N
+ ^2 _ }' B6 @; q! k
CSR = 0x0000;
+ d: K, i# M2 o INTC_INTMUX1 = 0x3d;% N6 Y; @ N! \ f$ z% }2 {( E" o- Q
ISTP = (unsigned int)vectors;8 w! T4 |2 N% P
ICR = 0xFFF0; % O/ ]7 Y3 B9 k5 S
IER |= 0x12;
" d( ]0 X( Y$ k CSR |= 0x01;
/ V" g0 B! c; |
: b i/ n( x' t0 X. P7 h: e; J0 m# y- Z2 _, r
M! n6 f$ O, e# Y! _; u4 y1 e还有就是两个输入输出函数:
' a( x5 M/ Z, C( b8 I+ L: g/ x' I, bvoid output_sample(Int32 out_data)
' z# x+ `2 B* U: C* e( C{
( W1 L, ?, M" {5 m7 g7 b AIC31_data.uint = out_data; 3 e5 n) u- m z7 w2 H/ x X2 {& m
MCASP1_XBUF5_32BIT = AIC31_data.uint;& u( n0 }0 e" @
}
$ `- h. I) t' {" o& n3 Y
! \1 r7 @: L2 S0 X6 C$ MInt32 input_sample(void)
) X! x+ @; i; G0 ?{
% q: o; c" p L1 O8 P f5 { AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 d) f# J- w7 Q7 c* N# h9 T return (AIC31_data.uint);
% V$ w4 @# x! J9 |; Y4 w" G) N, Q}
: Y$ {4 O9 X, U' T, P; p9 z0 h
0 h% k6 {9 x, I! b |
|