|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
) R5 Y: T4 k- m8 n0 x; Wmain文件:* ~( z+ @2 l5 K& S) U
interrupt void interrupt4(void) & j8 h, Z7 C/ H% Y2 Y: | z
{
9 ^$ N% |$ F0 Z0 c3 }0 g3 B Uint32 sample;
0 D; w+ y" E7 w" h. N
$ a) y) i: y0 A sample = input_sample(); // read L + R samples from ADC% ~7 G5 [/ t5 R5 M! d" o
output_sample(sample); // write L + R samples to DAC " n9 B3 e& C! T. x
return;
8 |# P3 i1 u9 l* [" S8 x7 m; j}8 v# w6 L# c+ P/ s- T0 Y( @
7 N4 Q& ?( x Y
int main( void ) H4 W$ U! u' q. a7 G- C: ]0 W
{" y; q3 O, M6 a' L
& i6 Q& B" b+ `& h1 M8 E /* Initialize BSL */
L1 `5 f" W3 }1 r7 t0 i0 H8 h" l1 u EVMC6747_init( );
0 r. A5 D8 V# m /* Call evmc6747_intr function *// t% j5 u* K/ j: N$ x$ v' V5 j
aic3106_init( );
3 A G# t& [2 g while(1);
! \( c& q, }% [- |; j5 S/ @/ ]}
) S; | n1 X$ J9 \0 J* i8 |1 j# x5 K4 C6 | M6 Z& M
* x' n" n/ g- ^( m4 o9 K7 j8 I" L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题) O5 c1 J* j3 a* y
/* Initialize MCASP1 */5 m: X2 b! W: F* ~. S; d$ t- s
mcasp = &MCASP_MODULE_1;
6 }7 e5 H; V; ?0 S( Z mcasp->regs->GBLCTL = 0; // Reset- H' p5 E; \* J; b1 o, Z
mcasp->regs->RGBLCTL = 0; // Reset RX
4 `7 O7 Z9 ?, O+ H7 n- W1 b mcasp->regs->XGBLCTL = 0; // Reset TX
D- q1 a( U; A3 a+ j: Z ]! ^ mcasp->regs->PWRDEMU = 1; // Free-running) K' s+ ]8 j4 u2 b# ]# g6 i
// configure McASP0 receive registers
6 D) v- K0 ~3 {3 F3 \" g* Y4 q K: M, F6 x mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
0 p" N4 O% F5 g7 s5 l+ ~& [6 i mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, y2 X j& B8 n! G. K mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( S' }8 E. D2 @6 i5 W& C mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. F9 x7 y5 v/ @$ U mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)' s+ E: t+ _9 K3 m/ j$ |
mcasp->regs->RTDM = 0x00000003; // Slots 0,1& G; J( {' l; W1 _9 b! ]8 X' y
mcasp->regs->RINTCTL = 0x00000000; // Not used, M! b# Q, `4 U; U) `& g/ `. }
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* H8 T9 p5 ~- R6 p7 k3 I
) l) ^* u( b* `* }3 T* i" ~ mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used" {5 _6 W& W0 ? z( V& {
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, Z# g r0 W% x* j# C. G% O/ p* r( X
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% ], g( T; l% [8 N* ?- N mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 _& l1 j* @8 M7 g. K5 Q
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
( E B" W( ~4 C; u* x1 J! T+ V mcasp->regs->XTDM = 0x00000003; // Slots 0,1
& a. v+ i5 w( o2 z( v/ N4 u4 H mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, a" W+ L! z w: v1 y4 Q mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- o- p+ m. Q/ k/ R5 t2 ~* C
3 z8 f0 S6 G' J. \+ {8 {1 E, `2 O mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN% o6 T7 X9 a6 Y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT, `; V$ x. N. r* ~1 R0 J1 j
mcasp->regs->PFUNC = 0; // All MCASPs5 \ `0 B! K# [7 b8 w ^
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- }7 c4 k/ v; e7 B' n, Q2 \/ n! ?5 B* X
mcasp->regs->DITCTL = 0x00000000; // Not used
T- ]- M9 |9 @0 J# X8 T mcasp->regs->DLBCTL = 0x00000000; // Not used- l, s: J1 n# s& N; Z
mcasp->regs->AMUTE = 0x00000000; // Not used
- V ~) }3 S+ e, c
! j/ Y0 A; K& q0 t; ^! f/* Starting sections of the McASP*/
% \2 T: f, M% h0 S q$ [. p mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: j* v' u$ L2 V5 w' \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 3 [6 W, F# T5 o+ o/ ~. I
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 9 k/ k( m5 b) g- }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );( e; R! x8 @/ }7 D
3 R3 I0 p# n# M% M# c' y% T
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, y: `3 g. c8 o/ a+ w& \* I+ X, t, z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% `7 Y, x" f' h8 }$ M# r! E mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 7 ^! K" Z) e9 H! |+ e) Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 V1 i8 n# U/ X% F3 O
4 N2 w! U2 X# U2 z/ i mcasp->regs->XSTAT = 0x0000ffff; , e4 r& C. }. n a# L2 {
mcasp->regs->RSTAT = 0x0000ffff; 8 E8 t: _- [* w8 |6 K+ z
; ~' H5 }3 Q1 a mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
: `; c- a$ d$ z1 b while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# e5 q7 y& d1 ]# d* M Q mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: K. _3 Q1 ]4 t0 A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* i$ y+ G& W8 h* M
% m1 c) c4 { d3 M5 `5 ~' f /* Write a 0, so that no underrun occurs after releasing the state machine */
! @8 w: R8 v3 f& B! H0 h mcasp->regs->XBUF5 = 0;- O6 D r! g/ m2 [9 M1 U
mcasp->regs->RBUF0 = 0;
D3 b- X7 ?2 Z& E8 p# ?6 z" b
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 B6 u; J# t. K+ U while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( d* V3 s9 u6 H3 H M& H$ X9 u" I mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ A6 r. S- a- ]% J& a! F& l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); ]3 C/ F: d* a
: K% t! K- L" Q' ?* M6 k
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- u2 ?) T+ o& q8 L+ |' s: C while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );0 s, J8 Q- ^; G3 R K* P, L
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 ]/ b; R, x) j5 i4 w2 J# _% f; e while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) G1 D% I/ M0 [- q+ n+ h& x
?( f( l8 X4 r, u; l% O, [
CSR = 0x0000;
( g- r0 _. C$ `- b2 |' f( y/ d INTC_INTMUX1 = 0x3d;& w. j6 o6 v9 y; [( l0 `9 s
ISTP = (unsigned int)vectors;
& x% i; B8 S& u) |4 ?9 ]; F ICR = 0xFFF0; # K9 r3 w* g& R# q
IER |= 0x12; 1 c% I4 x& S; q+ x' Q. A
CSR |= 0x01;
, Y5 b- `( E5 ^ u7 t+ F
, z* u4 s( J L5 p) h+ \$ z; E6 v* t+ A& |; M# q
% {5 Z3 r# }3 b
还有就是两个输入输出函数:
: [6 {& S9 o# O; u4 K& E: s% gvoid output_sample(Int32 out_data)2 V4 r9 R, ~; U3 }) W
{( ~0 {# q' H) Z( |
AIC31_data.uint = out_data;
7 C% H# R* Y" H' ?* Y" b MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 t1 ]# C3 H7 u [" M4 i: U}; t: G& |# w, ^8 i' Q1 V4 c
, F0 M+ J9 ^0 H3 m
Int32 input_sample(void)
+ \1 A; }9 W1 _" d7 q8 ^: k5 G E{
) o% f% q6 l/ a! n Y/ V AIC31_data.uint = MCASP1_RBUF0_32BIT;
, I3 a6 [) l) }9 T9 r7 y7 Y& [2 c# l( A! N return (AIC31_data.uint);
4 E) [8 o( T0 W/ k}4 m- E$ a c9 v* o, v' x3 C
3 I9 _$ H/ s7 D0 `1 B
|
|