|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:1 Y" J' x% m: B |7 l8 c
main文件:
& s0 y, ~% V: _: I! x3 t1 Q) C$ Cinterrupt void interrupt4(void)
' v ~( R( z' {# U. G7 X{) T9 \4 L* b+ J0 \7 [4 Y: P9 a
Uint32 sample;
3 i& V5 _# b8 f d% N* c; {3 Q" K
$ _; o' K3 m9 O3 @5 { sample = input_sample(); // read L + R samples from ADC0 d! c" u! s% B6 k
output_sample(sample); // write L + R samples to DAC ; x/ q6 I. V4 Z `# W7 C" d
return;
2 z3 I; o0 A- c. [1 X+ [}0 k$ b4 O6 \, B6 [
d+ c9 J: g: M/ v( D
int main( void )
# i) a4 F3 p5 B% n: Z{) d n' q9 s3 u) f
. c& _( e1 F7 |6 j) d7 K$ g% H& Z
/* Initialize BSL */2 j' E+ D. C4 Z8 Y( |$ y D; @6 m
EVMC6747_init( );
2 M) n1 I. ]2 @ /* Call evmc6747_intr function */! {- c9 R6 j+ e+ ~5 v' R
aic3106_init( );
" w- I* {4 {' g5 s8 I5 \ O while(1);
& a( [4 C% G. U8 X3 _}( V9 k- D( x% ]2 @% ?" x) D
1 }# O1 ~) d& o7 X
! H# f/ F) m. Y/ _- h
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题: [7 N5 V4 h. M1 A# I4 C" [
/* Initialize MCASP1 */
2 K3 P5 T9 i. o5 I( i% ]8 s mcasp = &MCASP_MODULE_1;* v) L' s6 S D3 O$ L9 c
mcasp->regs->GBLCTL = 0; // Reset+ t, w! a; T# e" F7 g
mcasp->regs->RGBLCTL = 0; // Reset RX
$ |7 @2 M3 e/ ] mcasp->regs->XGBLCTL = 0; // Reset TX
6 @2 h: x p+ c6 j$ I mcasp->regs->PWRDEMU = 1; // Free-running
5 I- h$ _: B" z/ u; l; W5 r/ J // configure McASP0 receive registers
/ {3 c" L) k8 F+ V, B' K! v T3 \ mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used8 D5 @/ u0 j; y N
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 i' t) f8 V! ]8 A ]& d& Q% J+ r! }
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word, M6 k9 ?$ Y1 T5 }/ K4 O" A
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
: Q; [4 k) b0 F; m* v mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side); b8 _9 E; J3 Q& ~2 I3 Y \. k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
$ d, @1 Q9 Z1 l8 }# Z4 u1 z mcasp->regs->RINTCTL = 0x00000000; // Not used
& d9 X0 O: {9 w% X6 G9 A' I mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 ~ t, r( T+ {7 Z; s. F" s: F3 S) ?% e: u* [
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. E6 B& X: C# H- z) _8 p R mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 G5 y, {2 Z! \$ L \ mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& n# l; \6 H& \0 {* t+ \
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 A) H! n: S, G0 w M5 R4 f% C/ j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- e, ~3 ~3 i: w! h8 f; N mcasp->regs->XTDM = 0x00000003; // Slots 0,1
- g& v7 _- u$ s! m6 e+ e6 B mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
) j) v% }1 ~1 \& B- Z mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: ?+ n- b( L5 l# S+ `
5 Q. U* C5 E. K* W3 Q* s5 S4 q( b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& X/ x6 p. g( D% n1 e( O mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT) {5 S. f8 j* [
mcasp->regs->PFUNC = 0; // All MCASPs
, |* y# a: x# ^& Z( ?+ D# Z mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 z: |, W) E( W' c
1 T2 {% C' ~6 K* @7 D( r4 _ mcasp->regs->DITCTL = 0x00000000; // Not used; I' d# M; r7 J2 r
mcasp->regs->DLBCTL = 0x00000000; // Not used
3 ^# a0 ?; }, a, Z' m1 v mcasp->regs->AMUTE = 0x00000000; // Not used- x V8 }' p$ G1 p3 k# S) G8 q
; `! `, u5 i* q( U5 ~) u! J, F/* Starting sections of the McASP*/* F' A% k7 m; P1 D
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
s$ a1 {6 M' x+ Y8 O/ S- e. b while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
( Z+ _! l' i) \1 w; x mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ j: @0 T, h: w) g! M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" L9 _/ d. j* M$ Z
/ X& @$ }/ s2 k mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 K% K+ b) O. f9 E6 j& Y4 m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );" n- q6 @* y: F$ C
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ j G2 N* ~ C7 z( {3 ?0 \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );, a( k5 |5 A, f; \$ ?" E
) i: [1 Q$ P/ H/ Z* T7 ^! W4 @' Y
mcasp->regs->XSTAT = 0x0000ffff;
$ y7 t; x5 a6 B2 t; e# O- t, f mcasp->regs->RSTAT = 0x0000ffff; / H$ v3 @9 _$ z4 Q- ?7 n
5 ?4 |. @* @6 @6 g: \! t- T
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
) F( h1 v- N' C, f5 q5 X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 g: \- B" Z& e; ~$ q+ A+ L
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* d9 z p2 Z% _; W+ K while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );. C: J- F3 V5 b$ T0 Y
6 Z3 }5 X. ~' G
/* Write a 0, so that no underrun occurs after releasing the state machine */
* H! T3 {$ {7 I mcasp->regs->XBUF5 = 0;, {2 W: j9 E# N3 f
mcasp->regs->RBUF0 = 0;
" L5 u6 g$ D6 c# ]( t( ]/ f0 X) d# B5 w9 N* B1 L6 \
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 1 a) A- [4 a: ]* C1 \4 z$ k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );; F+ o7 O1 M; f: O6 L: v
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ ]# s, C# v. b5 v' s/ | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 Q; K/ P+ }! z% m* [9 m$ [/ d% P* l. W9 Y
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 4 c6 P n& d: A9 \+ F/ ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 |2 s! {* b$ a: M) U5 E/ p! V% T mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( w+ Y1 n! A" k$ o. W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. P) l3 y: W0 B3 O# z/ e" v( F
2 D1 K/ d+ v$ K+ @# z CSR = 0x0000;' B7 d7 n2 Y% `- q0 l+ F* B
INTC_INTMUX1 = 0x3d;. m7 k5 N4 i5 t
ISTP = (unsigned int)vectors;
: l% A" N3 _) e- q: |) k ICR = 0xFFF0; , L3 n, M1 @ c$ X5 q( ^4 w
IER |= 0x12;
- k' d9 @) G8 o2 w, ^" _# z CSR |= 0x01;
! Y& N& w$ j4 m7 s4 x
, J2 x# H" w' L( t# l
1 l5 E3 r8 r3 h. D0 |' O5 A; G6 J& N5 L
还有就是两个输入输出函数: }1 K6 }3 u1 L* `0 u
void output_sample(Int32 out_data)! z/ V$ n! T: X5 }5 _
{
2 K( J* P# u9 G AIC31_data.uint = out_data;
9 q7 k2 Q2 x" [ e& d1 Q" d- F MCASP1_XBUF5_32BIT = AIC31_data.uint;6 X5 @; M. p# A/ ]9 H& |/ y
}/ i+ ~" Y, B! [' G9 k
# h4 _+ F+ ~7 r: E. Z$ a6 R+ H4 o- f
Int32 input_sample(void)1 G' O* k1 Z) R0 ^3 u7 t* F
{ 9 ]5 A# h: J H; Z; J' @% }
AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 L7 a7 y2 a4 ^+ h/ x% p6 y+ s( D% M return (AIC31_data.uint);( d- \' Y3 g2 s$ R, S1 `
}
3 B7 l( v1 @+ L0 ^
7 j% B- V; q7 E5 q8 J: E |
|