|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 W7 t' P. c3 X" j5 U! rmain文件:8 n4 C0 A; ^8 x ?
interrupt void interrupt4(void)
' ?& V# S( y$ j* \# `{
% E/ D: N. t* G2 k( P6 F Uint32 sample;
# f4 x5 v- @; K0 K! d
- T0 C8 Q0 z4 ]' h sample = input_sample(); // read L + R samples from ADC
) t6 ]; l) c- @' O. c) o output_sample(sample); // write L + R samples to DAC + V" p' ?" G+ Q5 p3 N
return;! X4 U- N" s1 o. q6 A
}
& L& t) m( g2 n7 o- A {
/ j8 l3 R C' a- U: wint main( void )& m4 K( t2 d: w/ q s! M
{
g) L# g0 f$ q5 J4 b# B9 k8 `- n* }( `. S
/* Initialize BSL */
; L6 B& H9 _% f6 @ EVMC6747_init( );
. g8 u' U6 b# ~* _; C9 a /* Call evmc6747_intr function */
6 J! f& w% Y( h: U# d4 \ aic3106_init( );, _8 R* c; \5 t/ Y
while(1);9 o$ S- @# v+ B* _3 Y- Y
}) Y8 |. i) O3 ^
4 x5 B5 u0 D0 L0 `" X; j' r
' A5 P3 {7 Q" f5 D: j2 t1 Taic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题' c0 D* O- N2 Y$ e. F3 c0 D
/* Initialize MCASP1 */2 r1 s( i0 l8 W$ e" A% V/ e
mcasp = &MCASP_MODULE_1;
( A5 h# T( o% w mcasp->regs->GBLCTL = 0; // Reset; j# _7 q0 D+ I4 O; g5 z, \
mcasp->regs->RGBLCTL = 0; // Reset RX0 L- I1 |+ g* B( {
mcasp->regs->XGBLCTL = 0; // Reset TX
/ w u: N5 r4 \; o( o mcasp->regs->PWRDEMU = 1; // Free-running% Z" }9 B# t H
// configure McASP0 receive registers! S: A3 W" t2 X8 W' i
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used: C7 u u% q; E) I
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( L) N( `. ?- Z' A1 G) g7 f+ \ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# y' h0 E! c& \1 N3 L mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
1 {: y2 S* x3 e8 C+ S N, L+ I mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
+ B, w k% s( P mcasp->regs->RTDM = 0x00000003; // Slots 0,1- }. E F1 o) M4 L! y6 c5 N
mcasp->regs->RINTCTL = 0x00000000; // Not used0 Q+ n/ r) i) o8 _ Z
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 Y: P4 G7 X5 Y M
% \: }" U* C! f mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used+ `, @- A* l; h9 D& X
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% N/ z+ I7 w' x! B mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% |& a* B+ ?. A3 L3 f$ a mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: ?+ U6 B" n! w: `+ B6 a mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" G( ~9 g0 ?/ f: K mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 k% ]7 D* G. J' a5 m mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, {6 e T2 a# i1 ^; n mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( {- i9 S4 W9 P' I0 ]& T; e- A
- A2 E% J6 W' I4 ]' j
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
$ J. d, K- g' R. ?9 ~ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT+ ~1 ~4 m# { w) g) ]
mcasp->regs->PFUNC = 0; // All MCASPs- j* X# p% L* S* F! ~: ^9 ~4 ]8 L
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ _7 t& e; y5 H/ S+ H/ T2 X4 j
% X8 q" `" n7 ]) k# u0 a: j mcasp->regs->DITCTL = 0x00000000; // Not used( o4 Y- m( C z2 e2 i( n8 j7 H
mcasp->regs->DLBCTL = 0x00000000; // Not used
) o$ p2 ?$ L' {6 E, f# [ mcasp->regs->AMUTE = 0x00000000; // Not used t( y9 r# h; _. P d6 ^. J
( T. q1 N6 D1 Z$ D8 r7 Y/* Starting sections of the McASP*/# D: j' Q2 _7 @
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. r3 ^3 R% H& F- H2 @" L" n while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 8 _* s# I# x# F* L, V4 ^" {: S
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) Z0 y0 ^9 i6 ?0 A) n5 z6 j& ?" h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 u) A% T: |7 w
, ]0 z4 j7 H7 x2 ]! z mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' S8 G; z- o G* D* l while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ L# E5 q" m2 z, S
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 {$ I/ S! a8 P" x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" |, `' ?2 o& d; X- V! a+ Y" l+ H1 a- j+ H4 n5 Z# Y! e
mcasp->regs->XSTAT = 0x0000ffff; 9 }$ G+ x" u, C$ I
mcasp->regs->RSTAT = 0x0000ffff;
) `5 ^& Z& ~. {4 h: K6 a8 y, R* K- I1 J$ v' X) }: K7 I
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& D( B r* \* @& E2 U0 N1 }) V X7 O! F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; ~) I2 z! d# ? mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
5 I9 k2 e9 @% F9 D( w# I& `/ w0 q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 m6 ]- b$ V1 R1 A$ w+ d
* [+ r: R0 R- K; g N /* Write a 0, so that no underrun occurs after releasing the state machine */2 ~ p! f; a& Q* y
mcasp->regs->XBUF5 = 0;
. |* q1 q! Z/ _* Y, q K7 R mcasp->regs->RBUF0 = 0;
3 E6 h# N$ G# S/ j% C* t4 f2 i9 W: \( H3 q% J
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 u! K+ G$ E3 {1 b- O2 r0 ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* ^0 z) Q6 g2 h* _( a- [ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) j( i, j, |2 _$ J- W! j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
f# {' y1 C" M2 o2 b! X7 f8 b7 `$ r% R- q+ I' p7 L5 y
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" X1 v2 h' o) _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- `: u7 J j# G1 A2 @ m
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! h+ o2 o1 e8 l3 ?' h, x% x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* V. V' G) G$ Z. K% p: P" i& r4 Z& r+ |* }7 [
CSR = 0x0000;* U2 ?4 w' D9 L
INTC_INTMUX1 = 0x3d;
3 Q' o- z0 M9 J) }1 I% z( F ISTP = (unsigned int)vectors;: N* W1 _9 R; [( S2 K7 X" m: y
ICR = 0xFFF0; , ]% i0 g8 F3 O/ T6 U4 e4 h
IER |= 0x12;
- b0 @* T+ s% W: L: Q CSR |= 0x01; # D6 N+ W2 g( F9 |
+ B7 `3 m3 R* O/ t: D5 e8 }
, l @+ V+ g% }& L1 O+ o! k
4 k% |3 M0 A% h; [还有就是两个输入输出函数:' v7 u1 _9 M- O! C4 n3 y
void output_sample(Int32 out_data)
; B% Z0 q1 `% Z9 R' s; W6 ?{+ A& V/ ?3 Y5 ?# ?6 l# ~7 z
AIC31_data.uint = out_data;
1 P! R2 W) o5 S MCASP1_XBUF5_32BIT = AIC31_data.uint;4 M& h0 ^7 f* ~' s+ f( v0 F- M1 P4 t
}2 R! H% P+ r& N* r& j' I: H
; }* s+ k& @$ e6 x* j
Int32 input_sample(void)( k- S9 ~' y- H% p6 a: |
{
, m* s: {1 Z9 p1 F# z AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 D# C0 o" e: }8 N o, a. _" U' l return (AIC31_data.uint);+ S9 K, L3 `+ A/ q+ I
}
5 A z9 ^5 R! r% u
, y9 C. V8 @; N2 s* Q9 e |
|