|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 V; j6 D% T% s- H( C/ U/ \& _4 D; Zmain文件:" O {& I3 J+ K( J& w
interrupt void interrupt4(void)
, ^, X3 U) M8 w5 {4 C2 s8 E{; W. g9 U, ` }* }$ k
Uint32 sample;
* m! F4 r6 @- N n( S' w. I
2 L# k& S" f% z+ \* a# E- m sample = input_sample(); // read L + R samples from ADC
' {8 @6 q! u G, |$ j2 K output_sample(sample); // write L + R samples to DAC ; ] x. Y# y1 J& g m
return;
" J) {4 d# O6 ?- J# m# I}+ r: Z5 i& H9 ^
( y( Q" c. I( z' A( ] u
int main( void )
# x7 A% e B: ~0 ]{
. z; D' F# J1 Y. p, i1 `+ F0 S3 z$ R# ?, \9 M' \9 [1 P
/* Initialize BSL */0 q' M5 ]9 b" K2 |& Q" |3 v/ B
EVMC6747_init( );7 v% F- h8 J9 p; c) k( _1 H. V P3 `
/* Call evmc6747_intr function */& e" ~" f3 R* D- \2 Z
aic3106_init( );
, C" J1 R7 M# m1 z5 i7 ^ while(1);
- [4 X& V& |/ Q. j, N, i}" h% ?2 s$ r( ?$ M9 X
$ _& a W, @. O# j
* |7 f5 h' T9 v6 C7 B
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- [7 n) k3 k$ w4 k/* Initialize MCASP1 */
3 H) m1 z4 n) Q0 @. d U# M4 F mcasp = &MCASP_MODULE_1;
& B; w6 W0 ~/ R8 n mcasp->regs->GBLCTL = 0; // Reset( T" a' F# b% z) K
mcasp->regs->RGBLCTL = 0; // Reset RX
6 }- ]/ U$ O S1 C& ~ mcasp->regs->XGBLCTL = 0; // Reset TX
( `5 D! f% V: ? s4 P8 t4 E$ q mcasp->regs->PWRDEMU = 1; // Free-running: z6 l% b$ f/ S
// configure McASP0 receive registers; w, {4 e0 u: Y" o/ [
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
. X1 W8 i/ d" G4 N mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ c9 S/ o$ U x& a3 w mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( A) |: d, y! K( C mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, v% m1 `, T) V mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 f8 n# m- i! g0 t, M9 [ mcasp->regs->RTDM = 0x00000003; // Slots 0,1' e4 I' K; h* H" j, @3 w) Y
mcasp->regs->RINTCTL = 0x00000000; // Not used, m" j4 g3 b: v9 s4 W- j( x
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: m2 q, f+ m3 N/ K( g# ^" p" F3 ^7 n% b. a+ b
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
: e* a) c V2 r1 X( O mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ O; Q4 K6 j8 X: _% L mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) _: [1 Y7 [$ Q5 [0 R! f$ K mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# c. ?# @. n2 ]5 Y mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
1 d9 V5 C3 O1 E* B* I& X mcasp->regs->XTDM = 0x00000003; // Slots 0,1
# U% b% Z I& u7 v. @) \ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit; @9 y D3 l( G& E) f2 u' h
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# e4 f7 b1 K* Q; s Z
$ w: ?' I4 i. m) }, {" k4 w8 I1 M mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN+ U, t9 Y. ?: z: Y6 B5 Z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
3 t# K2 Z6 A! e mcasp->regs->PFUNC = 0; // All MCASPs
0 _* R) d' ?/ ^( V- i' K mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1" y0 A! I5 x" V4 c+ {" N# y
% L# L+ @, h9 V6 t mcasp->regs->DITCTL = 0x00000000; // Not used
. X1 ]6 b6 `- }! J1 Q mcasp->regs->DLBCTL = 0x00000000; // Not used7 |# J3 O0 _. k; i) I
mcasp->regs->AMUTE = 0x00000000; // Not used
% e) Y* c& Z( q( ^! I) L5 B+ A1 D! F+ x8 E3 V
/* Starting sections of the McASP*/! p/ C6 X: v9 @9 q6 @; k9 w
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 A0 \$ O Y1 @ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- C+ M8 r7 K. _# K- [* ^4 d mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 N$ U$ V+ W& \3 l/ E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );- O1 `4 c \1 s5 C2 t8 D5 e
7 u: L$ `- Q4 G; k mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; + j. C, X6 p6 E& J% k; M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );. D: R' b f) Z0 F. l( x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # `0 C+ ]9 L5 i* A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );$ _+ o1 R+ Q% C1 |1 t$ Q
) S, f K4 c' y7 i" \; Y9 L% u mcasp->regs->XSTAT = 0x0000ffff; * Z# I2 y" f. O: v5 Y' c
mcasp->regs->RSTAT = 0x0000ffff; 9 ^( N. z) u8 w7 c( \- e
+ R; H) Y' Y& U1 p. n mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;% J8 q' E( [, u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ G% Q' C# l! ^* w- T/ N' ^" J
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) p" J3 U, x3 I! l# r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
4 T/ S9 c& w/ g0 B
! W9 {, m F. }& A2 u8 g /* Write a 0, so that no underrun occurs after releasing the state machine */
7 g# f, ?0 a6 I' R/ t3 y mcasp->regs->XBUF5 = 0;
8 s5 Y1 e) b. a5 p+ {# `) ? mcasp->regs->RBUF0 = 0;
! f- E: h- |/ _' u- J) c: E4 p/ p/ |: b# l" M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
+ w; |* F' ?6 R5 h+ Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
+ |/ b& ~5 Z. R mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; . S" Y2 I% g% ]6 ^* f. P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); _4 h( G9 |, I- D. O; H
5 Z0 u! E. g ?' Q- n# L0 ^ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ n( [5 Y3 B2 a8 W4 o8 ^! w while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
: Q; t2 `0 a" Y mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 G7 M6 N5 y6 {3 g while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: M0 ?; n' \3 p2 J& f
9 w+ _% h" c7 n+ J% D6 d( O( T6 { F4 v CSR = 0x0000;
% @6 Q* k+ w, u L. @ INTC_INTMUX1 = 0x3d;
! G! O0 ]3 s, b ISTP = (unsigned int)vectors;
* c* i, g- K/ Y; i& a5 r- W ICR = 0xFFF0; n9 i9 U; R. }
IER |= 0x12; Q( W4 B9 S& ?' G( k! {
CSR |= 0x01; 7 v1 i# P% {0 ]
: ^& L! [& Q( y4 O7 ^# k! z. s% K$ H( @: Y1 I* s
3 V& V% Q* S% F+ T& B还有就是两个输入输出函数:. [/ G) M+ B5 n/ u6 w; E D
void output_sample(Int32 out_data)4 `5 `6 I: g7 T0 M9 m# x
{+ M; k0 X+ a% V3 v
AIC31_data.uint = out_data; ( e1 q, b# h" Y1 [( A0 |
MCASP1_XBUF5_32BIT = AIC31_data.uint;
* P! r+ U$ K% q5 ]}
~1 o/ [$ N6 U0 Z% v# U0 [0 c1 p( f2 P$ P- r$ j( C- w# K' E
Int32 input_sample(void)3 d6 ~3 s; _; R1 n6 s
{ 3 D% [5 G" e+ r, w
AIC31_data.uint = MCASP1_RBUF0_32BIT;
% L. X- d6 U8 o/ U7 e- i( n4 | return (AIC31_data.uint);
( H- Q7 h' O. ?3 U; t}
. _% Z; @- N3 V6 h j0 v5 c# ]' d) f; G. Y$ a( p) O
|
|