|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
6 t/ J$ Z4 t) P+ P0 Y) Z# gmain文件:
5 _ ?' l7 U I. F" hinterrupt void interrupt4(void)
& z* {7 k3 g% o1 G{
7 r# \5 u* G: e+ W- z! \5 C Uint32 sample;
% Q/ q/ U t- t b
: r2 n7 h1 w: p* v% p$ D# ~ sample = input_sample(); // read L + R samples from ADC
* q7 r0 L3 ~: E7 z4 |2 Q output_sample(sample); // write L + R samples to DAC
. C8 m1 h- k9 W- F+ u return;# i' P0 x0 L- }. O" C. `! i! b0 e
}" [1 f2 t7 }; L) f+ m
' N/ j% j5 S% i0 G$ n) T
int main( void )
0 l% m5 O5 [2 _6 n" F{
& |1 Z5 ^1 {' d4 k X2 z
2 q( X* ^9 L, K+ o' u- k /* Initialize BSL */6 i, Z9 ~8 p" F# H" z
EVMC6747_init( );2 B$ A; [5 |7 c, Q
/* Call evmc6747_intr function */6 a* c9 Z( F i! l8 k
aic3106_init( );# X( ^" M/ K, K) e) T
while(1);3 s' a% o+ g7 t/ q. i% Y
}, ?8 [1 {+ t1 j4 _% e
( o+ D# M6 N' t, p3 V5 l0 `" x; R6 Z! C# `. W3 K( U
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 b) s) e3 c4 i9 Q3 h9 @/* Initialize MCASP1 */
" u Q6 }! _# q m# m. U3 A mcasp = &MCASP_MODULE_1;% C: j, Q6 d3 L* e. {. I, |# E/ e
mcasp->regs->GBLCTL = 0; // Reset+ Q% b5 V; }4 `. a
mcasp->regs->RGBLCTL = 0; // Reset RX: g' m1 v5 Z( u9 j; ?( r/ g- ?5 H1 M
mcasp->regs->XGBLCTL = 0; // Reset TX* J9 R8 m3 ~ F7 e
mcasp->regs->PWRDEMU = 1; // Free-running
, L9 B' j& P2 U' _3 L4 h // configure McASP0 receive registers& i& S2 Q0 Q% `0 s
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
1 t) _9 q) K" t* |. [6 G mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ V, d# W1 C+ d( X8 _ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 V9 {; w9 s' [/ v, q
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! j: K6 B% L# s! p, Z% A) U mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)8 M2 E- b. }) X0 v# c
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
_: s1 }3 e2 o3 { mcasp->regs->RINTCTL = 0x00000000; // Not used) j% ?- h0 j8 l" F1 c! |' m
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! t2 F3 W: m# h% `! y
' d" J ?1 [2 H) @
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used% g9 P( [0 J2 [) s
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& T9 `5 j3 ~; c4 c
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- p) y- F2 R9 e) _9 N mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-160 X0 O% K0 }" N1 `
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
; @( ]$ \/ ^" m- P8 ]2 k mcasp->regs->XTDM = 0x00000003; // Slots 0,1; ?" ], t6 |" _3 s5 Z
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
1 `- P2 t* X5 N6 Z$ e) }, \ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- A6 F! l0 P/ {$ Y* s
; g& g# `' ^* I, v n: s" }
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN; r- k: o+ ]8 I2 V; H
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 o5 q9 s5 B1 K) W( |7 x m mcasp->regs->PFUNC = 0; // All MCASPs
3 ~7 M0 P; o7 j$ M+ o, Z% Y5 _& }0 H3 R mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
) w" ]! l7 S0 e9 ], Y \
& T c, i1 ^2 X mcasp->regs->DITCTL = 0x00000000; // Not used5 q% D; O1 `1 Q% `0 u
mcasp->regs->DLBCTL = 0x00000000; // Not used! E0 \. V4 |9 [7 r
mcasp->regs->AMUTE = 0x00000000; // Not used
+ E3 f% A0 w. f4 x8 k: N: N; d& O B
/* Starting sections of the McASP*/0 o3 Y( Z4 ^& S; R6 b
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 l' u- f: |- m$ |9 a4 B' S while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); - Q, m. K7 I5 E! y0 f
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / G/ O: O8 M' V2 H: O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );, N3 a0 B4 w- f& _: K. z
* B8 j+ r1 `* c5 m
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ) a) E/ R1 g* |/ O6 `; z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ N! c# q" v( Z8 o9 q# _
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 L/ D; j6 E, D0 b1 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( F& v% \7 _8 ]- |# O8 I6 e, _, E& A5 Z+ z
mcasp->regs->XSTAT = 0x0000ffff;
4 [0 B" |0 E4 S* S/ c& ]0 o6 O8 M mcasp->regs->RSTAT = 0x0000ffff; & k" \8 e) a4 m+ a& W9 O
* r! L! P9 p4 |4 W4 k7 p- F. @
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 {/ V7 a9 A$ h/ \+ w8 F" q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, V" T% V! v9 ^2 C, X mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
7 U5 y9 g* H( [4 }+ D" O' g/ @8 O( x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ @) H+ L9 c; U
/ _% k" j* x3 R, k/ t( P0 E /* Write a 0, so that no underrun occurs after releasing the state machine */
# S8 p5 a0 N% i% h5 a# d! J$ L mcasp->regs->XBUF5 = 0;& X: @* S0 S% K, s* A+ @
mcasp->regs->RBUF0 = 0;
5 n1 e- }( T- w- n2 Q# y7 Z3 i& @/ p% L
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 `3 J0 S$ }1 |( f) [2 t! N8 F) B while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% A9 |9 T/ H7 y* P+ u- x
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 k& p' f+ ~& c2 S7 a$ ]5 y0 k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% o9 L) J/ c& z+ G- c! s
]/ O: X1 u! y0 P2 R1 F# j mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
6 \' H* v2 R5 d/ B! r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
: Z* D0 c" S0 Y: _1 N* v) N mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 3 |4 \5 N$ n% B& `4 G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
% t4 @# V4 S8 \/ I% g9 R! s, K5 i# v
CSR = 0x0000;
5 W0 e T0 J& ~* Y INTC_INTMUX1 = 0x3d;
2 V2 S% v* }: q* u& i ISTP = (unsigned int)vectors;
' a" F& R3 B- a, p; V ICR = 0xFFF0;
% w; M9 `" g& j IER |= 0x12;
8 ~0 C- F1 F; S6 B5 \2 o q CSR |= 0x01; ; C$ Q1 `0 f1 L9 e
/ s3 T0 k; i. I- m( M8 L
- }7 l$ H: p d$ e, H8 M/ f) C0 q( y! w7 X, H
还有就是两个输入输出函数:
0 w7 q; o7 v) H$ X2 [void output_sample(Int32 out_data)# {6 t l/ @* g# T! T
{
- W+ I7 k* n& R, k5 C0 L) o AIC31_data.uint = out_data;
! p/ U: |5 N( y+ f! f, E MCASP1_XBUF5_32BIT = AIC31_data.uint;
& @( u2 C3 l/ o/ k}
9 y9 P6 r% Y: p. c, t
2 K# v' e X; ?% F" ~3 q) }Int32 input_sample(void)
6 _( I! @/ q: P( _4 @- ^( `{ $ Q' Q% C R4 W2 I' G5 g T: G4 L
AIC31_data.uint = MCASP1_RBUF0_32BIT;, L8 d. v0 Y) |$ M* {
return (AIC31_data.uint);
m8 S+ v9 P7 o}
) J; t# i0 R; w$ n% @4 W6 y& Y2 q5 x$ l- [% I- Y
|
|