|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# H& K8 F6 M( @
main文件:
' f2 [! `2 E" O* sinterrupt void interrupt4(void)
, G7 L# p5 v4 E5 F# j{( W0 M1 I% I& p( s
Uint32 sample;9 Q' A& S3 e* t( o0 u1 B1 e+ J, Y
5 g7 y8 T/ y. K, Z0 ^
sample = input_sample(); // read L + R samples from ADC
& O! |. O" D2 ?. d. o output_sample(sample); // write L + R samples to DAC
: q2 p0 Y2 W' Q" V+ O2 h return;6 g; ?+ L' x8 O" ~: n& g' n
}
5 X. z) \ `7 N* j: l' S8 g' E! H, J; Y* ~; F4 f% a4 m
int main( void )
% C; i+ {6 w6 g4 Y+ J+ U9 k/ _; ?{
( D* @- L; Q# ]+ h$ X; X* J4 _. ?! M4 C7 a, M
/* Initialize BSL */9 u0 c& {+ O' G
EVMC6747_init( );
' A4 [" q# w5 `5 @2 v /* Call evmc6747_intr function */
/ j" e2 {+ N( p0 q aic3106_init( );6 `8 G( T5 x) k* ~% _" g
while(1); ]/ }+ {; ]+ ~' X0 A
}
! I* Q# v8 ~) L: F# Q( y
" T1 ]( d5 _. k$ y- h" i5 r! L0 `$ L7 ~$ v3 G
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" ~2 }/ A$ [4 P" w8 ~
/* Initialize MCASP1 */( ?$ F: D0 v; I4 I
mcasp = &MCASP_MODULE_1;& e6 \4 Z9 K& \3 }& c# J
mcasp->regs->GBLCTL = 0; // Reset
1 G E- R/ h! O; ^7 m mcasp->regs->RGBLCTL = 0; // Reset RX: \! W3 G) E* m& T! n1 }2 F8 `
mcasp->regs->XGBLCTL = 0; // Reset TX$ a) n. e0 w% x( M8 t/ {+ z% ?
mcasp->regs->PWRDEMU = 1; // Free-running
B7 O- y) C. v9 h3 Q2 b+ j // configure McASP0 receive registers4 b$ q: V9 b& o$ n" A8 X5 _5 B
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used) L3 S; B3 {4 Q: b( _* Z
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' b: \% N6 B5 L6 X5 _, w3 Z0 O mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word5 _: m2 u: N) j9 [4 V3 ^ G; G
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)$ c9 W- [0 \1 E: _8 \
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)6 F8 O+ P( S+ C, h/ f4 v
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ x8 X# w* y( u: K, n mcasp->regs->RINTCTL = 0x00000000; // Not used
1 p+ C5 \* M" T* y mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 W' ?0 U$ k/ ]6 T& ?% M' N e* V" {( a4 {0 \& X
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used3 p0 Q) H6 n# e6 _ F4 h
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" A4 @/ y1 M! k/ O( Q ?- o: Q0 ` mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word' t$ H# M. {/ i O$ r5 Q, k7 ~
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-169 R, q6 S: ~$ w6 p) u# r
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# t) E5 N5 f/ d$ v mcasp->regs->XTDM = 0x00000003; // Slots 0,1$ K/ I6 u, m- \7 W8 a2 Y |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit A$ B! U. j# m7 O$ ?# K5 F( s
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 k* ?. w( C4 ^ v+ C/ s0 R
5 G* B9 g9 z) D8 u/ S# L+ M. z
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
, p2 S5 o. ^! ~9 Y mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
& h3 f8 |/ X3 G5 x mcasp->regs->PFUNC = 0; // All MCASPs
/ q+ m) \: s0 _$ J' z mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* h# _) q) G7 c4 c* Z8 i+ G8 B' c1 B* C; Q# |
mcasp->regs->DITCTL = 0x00000000; // Not used
) u4 g/ W3 g: a# K2 D: Q mcasp->regs->DLBCTL = 0x00000000; // Not used( b) e7 R1 |# L3 y0 P) X
mcasp->regs->AMUTE = 0x00000000; // Not used- C: g5 Y4 }7 a+ B/ i( D
7 |1 S+ ?# y d, n/ }
/* Starting sections of the McASP*/
& w2 y |* A/ r mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ' F: a8 D- }1 @9 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ) I/ a2 V2 K: d# x5 l2 H( `
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; % C. j' ?. ~1 M$ Q8 G. B8 A0 W- L1 \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 ]+ B R6 U# ~1 ?( T8 y x# f( W, {- r" q9 I% J4 G: @3 R' J; b _) a
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, O# u( G9 x( ? while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );" _( [% P/ @) T! K9 B- [& r8 ~
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 m# t+ V5 C" d* O+ N& @, P while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
9 ?0 @1 P7 K$ H% b6 a
1 M6 a: ^, G+ R3 ~( i) r mcasp->regs->XSTAT = 0x0000ffff; % A* n6 s% V" H1 p# f! D; @
mcasp->regs->RSTAT = 0x0000ffff; 1 A5 I4 o! ]% j# V/ o _" i! C
; D4 n. S9 }) @1 [' Z8 `/ O
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;, D$ P, V- ~' e! l" H7 g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 N* W! ^; T: O5 o6 d$ x% U5 ] mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; : ]& A4 D/ R0 V" p5 X$ x6 B2 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );! g8 m) a- T* P1 a) i+ k
! m2 e) {( _3 s5 | /* Write a 0, so that no underrun occurs after releasing the state machine */; _/ d) H: T- M& y
mcasp->regs->XBUF5 = 0;
9 B, K' ~( |! o- M% C& B5 _' K mcasp->regs->RBUF0 = 0;* \7 c# u. K' Q' K p4 z1 v
7 I: o: D; W4 g9 d9 Z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) G: _ K6 p6 }9 F+ z. h while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( Z* s. P) D$ t, h1 w7 [ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 3 K i; ^4 n) i5 W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 c8 X& z- k5 K6 e- n# w# r0 [; h8 K
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 V) _+ C5 E* s/ M) X, ^ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 |' C0 }8 W' n- d8 ] mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ x! s1 `4 o o+ J while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );* U# s- ^5 o5 v- b" ]! t6 a
' K7 ^- V6 {2 O+ A, \; ~, U
CSR = 0x0000;7 s9 e6 h4 H7 n- L5 X. c
INTC_INTMUX1 = 0x3d;
- n/ D! ?8 l( |4 I7 Z, [( T: I, Z0 e9 u ISTP = (unsigned int)vectors;
' F2 K- Q+ Z( W ICR = 0xFFF0; ) ]6 N1 r3 L, E! R- h; s( q
IER |= 0x12;
/ L. o7 N" B1 d& {3 Z; s* X' I. T CSR |= 0x01; 2 q. I/ s$ S8 p! v. {
7 }& `7 f0 T: W8 U9 b5 v, E* c5 N) f7 x* C& b
7 w2 Z2 m) K$ T
还有就是两个输入输出函数:
[; ?8 e2 [0 J; f) u3 H; }void output_sample(Int32 out_data)
2 K, ]" B$ U5 R% V! f$ Y H( J{
1 ~+ P4 n7 {$ z% D3 M AIC31_data.uint = out_data; E$ J" L& [9 n
MCASP1_XBUF5_32BIT = AIC31_data.uint;& o% F* O- d. f6 e
}
$ h% K) {' {" G1 I* G0 [
9 B H( x$ k% t- E' ^Int32 input_sample(void)
% u) V9 p7 C! @& k; y3 w0 q. j7 n{
/ l) [$ j& q4 f, F* ^/ T AIC31_data.uint = MCASP1_RBUF0_32BIT;
" |0 }, K, B& P) R return (AIC31_data.uint);
. |/ W' U! N6 E. z8 i}1 c4 e% S+ ^. \$ c) z
+ J& o0 K0 w/ W |
|