|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 l" U t* R: w" `/ k' C0 Pmain文件:0 h' n: I" k8 \! {1 |* I& J
interrupt void interrupt4(void)
0 X4 S2 r% ?6 j) A: `$ x{
4 Q B+ L; p' ?. q) x Uint32 sample;7 C; A! Z7 N7 v5 c
6 b0 a! b0 d, E sample = input_sample(); // read L + R samples from ADC
4 Q D9 d5 F* p output_sample(sample); // write L + R samples to DAC . K, g- Z" ^8 F, ^: V; }0 z
return;
7 v2 B. y _7 p+ r}
# D) c8 K$ D$ Y. V2 T6 |) e; N( k K& T9 R. c$ C$ d1 V* |6 V
int main( void )
2 _ `2 L3 x2 e _7 n{
& e6 h) s9 e9 n% e5 v- c- {+ D3 A% A' w2 I2 k3 K3 j6 S: |
/* Initialize BSL */8 }! o( B- r; ~0 ~3 _
EVMC6747_init( );6 k' ?. Z {# E: O7 j) ?: J
/* Call evmc6747_intr function */# @3 a. }( `+ M& U+ \
aic3106_init( );
% H f# O/ T( K* _9 n! s/ a while(1);) [& A2 l% j0 h3 G& u W+ d
}
; V7 z" G% F+ |5 n$ G
9 u7 {3 D5 @* M, O9 Z$ x1 T- D" Z& y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" q6 p3 ~& b3 K$ `: k/* Initialize MCASP1 */
6 K& i( E8 H. A7 c% n8 h mcasp = &MCASP_MODULE_1;; Y8 u$ b% O: X' t- _& [
mcasp->regs->GBLCTL = 0; // Reset* H" E& O, M5 L# G
mcasp->regs->RGBLCTL = 0; // Reset RX
/ q/ P2 `; e& [0 p mcasp->regs->XGBLCTL = 0; // Reset TX5 a9 w8 @9 a) ~! a- u) ?% O: V
mcasp->regs->PWRDEMU = 1; // Free-running$ @% p D9 Z) o5 `' a& x c
// configure McASP0 receive registers
* m" ^+ V) b2 V6 z$ ? mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 T& t1 x2 p/ ]$ E0 L* @ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& [' a7 k) s) y' A mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
; D L: x5 u+ }% {( n' Y mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side). v$ }: d4 g( o/ q; c% g S) c
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)" d; s4 t$ z- R5 B o+ w& W
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
$ N- v& D& X( t mcasp->regs->RINTCTL = 0x00000000; // Not used
8 w- W& }% Y+ n mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* Z% L* F# k6 n) c5 T
. o9 C, O# M+ i. T
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 {3 A1 s0 T1 W8 o mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 k7 z9 q, E/ M2 O& P
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word7 L$ V( [" [( ^6 r; K6 z
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& h. ?3 R5 C9 g5 r6 p; ^8 S+ p
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK8 _; X9 r3 z% Q7 w# T+ \6 F
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 }4 i3 k$ J% f0 C9 p& I n; \ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
8 D9 f$ z# t+ S# S mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& U' d0 b5 P! y8 t/ r* @4 B4 ]: M( y4 o1 Q
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: O4 d9 Z" n) E `$ S% N1 Y/ X mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
d' A* @+ [- J( r9 s9 D mcasp->regs->PFUNC = 0; // All MCASPs
4 i g4 \* d$ j! T" x- G mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ ]! K8 e5 \+ D& [2 m8 {' Y( l9 F( [4 Z! B
mcasp->regs->DITCTL = 0x00000000; // Not used$ y6 T6 ]1 C/ P' u
mcasp->regs->DLBCTL = 0x00000000; // Not used
' Q& G" h2 l0 C1 ^5 J1 Q( O mcasp->regs->AMUTE = 0x00000000; // Not used
2 i, m9 S; [ ]4 C& [1 d1 P+ d! ?- c. q( ~7 V7 {
/* Starting sections of the McASP*/- a5 B$ t- {* Z$ e' T
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 ~% p0 k a7 x# N6 a7 {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ! \; }, d% ~: s7 e; W4 ]- p
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
9 E- n7 j y' p" M2 \/ c while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ K) B' _- H+ _1 N5 e. @( R6 Q+ ]
+ U4 K. o* n$ w: V) F
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 9 B1 ^; t$ q- `" S( D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ {! b, q$ T2 p; }+ O' s7 s# ` mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 U" g, X( u/ E) N6 h5 E2 D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );, E* ~7 w+ \2 w- y4 n- y
! y/ {- o) Z7 D# b mcasp->regs->XSTAT = 0x0000ffff; 0 I4 z4 b- g9 Y" j
mcasp->regs->RSTAT = 0x0000ffff;
+ m( B( O) J- f* o3 d
& H$ y' y/ R/ g8 u1 \+ f+ O+ B! ?2 W' j mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 Y1 d4 ]" o1 p7 Z1 ]" @) \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 F! @' Y7 f p' ~4 @$ O mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; & _7 J6 p- _( f3 q2 ^2 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
b& k5 ?1 d+ J7 Z6 F7 N; m0 L
$ H+ T8 G3 U4 @5 r% j /* Write a 0, so that no underrun occurs after releasing the state machine */ q/ ?' M# T# B/ b
mcasp->regs->XBUF5 = 0;4 m& q% V+ R0 p9 G' p* x
mcasp->regs->RBUF0 = 0;; y9 G& h+ t2 i3 @! C i2 ?/ p
. c$ m3 `1 g; q! }1 z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 I5 q' z2 W- z+ p& J! |" t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 O& L8 |( D, x+ C3 O+ ~5 j mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 4 {, H6 ?' Z+ b/ J$ t: C. ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );4 {1 W6 m# _: [8 a
9 {9 K6 o; c; A# \ P y mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ f# \3 F% a* U8 J7 m& \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
, E0 p: f. ^5 }# y mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 ?2 z0 K: S+ i9 d) o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# e# |, }0 q& h( R, I2 w
# U7 T% d _% V p1 j4 i+ G CSR = 0x0000;
6 {3 {4 b( z! u' o0 o3 { INTC_INTMUX1 = 0x3d;
% E# w* z* e9 _5 z' b$ Z ISTP = (unsigned int)vectors;
: L! x4 S/ n0 s8 c+ P+ O/ w7 [ ICR = 0xFFF0; 4 w* d! w- v7 E7 w* ^1 z+ }4 c
IER |= 0x12; : Q# [) n/ C, o
CSR |= 0x01; 6 d( K0 c8 M9 C3 t' g% q+ k
& r i0 U/ y% j0 s
9 i" U2 ]( z' K
, _$ ^+ G- n) G3 P还有就是两个输入输出函数:1 t# ^* D9 Y2 ^" g
void output_sample(Int32 out_data)
n# { X2 \( W! ^1 J{; s5 t. K6 t6 @6 ^, `
AIC31_data.uint = out_data;
4 {" m/ Y3 t, }* x: z$ G MCASP1_XBUF5_32BIT = AIC31_data.uint;! `9 l5 U5 {8 }
}( m* X% R l7 B6 e$ p6 O
& @# Z( {0 V4 p UInt32 input_sample(void)
2 }/ T. O5 y$ w{
7 W2 b0 N$ W' {' L, _1 n# Z* ? AIC31_data.uint = MCASP1_RBUF0_32BIT;
* `5 d8 x$ a9 h4 ]* W' U, N return (AIC31_data.uint);
; v1 G2 [- O7 N* E}& X/ d1 J( e; h4 m3 M
, X8 b7 N/ `/ W2 Y- [ |
|