|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序: a+ J, k' \: |
main文件:
! ^( K' }3 x4 @8 s; h) Ainterrupt void interrupt4(void)
' S: |( [7 e, M s/ ~! N% _{; C! B+ E- [+ K( c9 q6 X, `
Uint32 sample;" z5 Q0 F' E. N, y) J
- l- M/ f1 H! M) X# x( M+ \. ~6 l
sample = input_sample(); // read L + R samples from ADC
$ S3 c/ H4 |8 H6 |; Z4 } output_sample(sample); // write L + R samples to DAC
+ _: \0 a. Q. L& Q return;
0 v# \! e* ^8 w$ x}
6 V' n) Y1 W( {
) }& V+ O7 q# B! ~) K; Sint main( void )
. W Y% j- K2 }7 d; W{
1 a2 w+ s0 i' j) L% h( F6 z+ J4 V7 f( `* x! D& @, s, [* D) j( ?5 g
/* Initialize BSL */
6 y8 b$ N1 O0 b( r3 z% L9 E& j! \ v EVMC6747_init( );) f) Z9 A1 D( Z9 e
/* Call evmc6747_intr function */2 _2 i& i6 U5 v3 g2 [/ O
aic3106_init( );$ a: x2 Y5 O+ I" e2 B) f+ _
while(1);
6 w) P/ G9 i; k4 O, Y}
" V! j( Q" e* ^# ~: w8 i6 _0 H) P6 U
2 E; j; J& D' }6 M9 o) haic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题8 ]+ t- _; ?. `2 J( c
/* Initialize MCASP1 */
4 r9 ]# h7 i0 `" [# ~ mcasp = &MCASP_MODULE_1;
8 E7 G9 u' C9 s; b$ Y* v, e D6 F mcasp->regs->GBLCTL = 0; // Reset
; a: F8 z" V; i( t6 ~ mcasp->regs->RGBLCTL = 0; // Reset RX
/ R2 |2 b3 Z# J/ u' T( J* Q mcasp->regs->XGBLCTL = 0; // Reset TX
! Q" \: q) h; X0 a mcasp->regs->PWRDEMU = 1; // Free-running
2 S w8 Y! L! j% S // configure McASP0 receive registers
' c' ?' x* p" Q mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* G" z# \$ X6 f
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 x$ y* x* b( ?$ ` S" c3 L# j: y mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word8 l9 l3 {9 V* N8 {3 c# N5 Y6 T7 V
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)# o1 k) e& G* _5 f q. L1 j
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
, ^4 M' `" ?, d$ o& a l* Z; A mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, D t u1 o3 N/ v* ~4 {; J8 z mcasp->regs->RINTCTL = 0x00000000; // Not used
- d' m6 @) x( X: h6 p mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( m! h) i" P, e7 N; l
4 {" i7 P, o; \) y* e# q0 I mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used1 O% @3 Z3 l4 f- G8 K
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 n7 D0 _2 W5 d, B% p+ P mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ M$ I) T7 u1 h" C8 [ mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ ^: T. }, \' g, ? mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK. v2 _4 p! w. Z$ a+ s! {" I) f
mcasp->regs->XTDM = 0x00000003; // Slots 0,17 g) H, M& c7 ]4 b: d5 F% k$ K1 h
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* X$ q' }$ v4 G( {. | mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* k- R9 ~% k" A8 S
& A; ]$ w$ n) @' e: [. J5 f mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
2 [- {4 G! j8 Y( u# ^ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT* S; v* u! T! r/ X
mcasp->regs->PFUNC = 0; // All MCASPs
3 O" k3 M( H3 i1 t+ B! `1 t w mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX19 A/ @5 l9 M3 z, f
+ }, \+ l0 t, i" f% Y: o
mcasp->regs->DITCTL = 0x00000000; // Not used# k7 C8 m8 {( n9 ]
mcasp->regs->DLBCTL = 0x00000000; // Not used, g3 ]; R4 D8 k9 \ w3 P
mcasp->regs->AMUTE = 0x00000000; // Not used6 M! n+ l; d' x! y$ c
8 q, c/ u% b+ r, P4 S, k
/* Starting sections of the McASP*/& A+ t! }+ z* h
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ ?. G& [- \" n) T- o while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
; e! h, d3 R! t( M6 n8 D mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; : O( R. H9 G. p' u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 j& W+ C5 t& r# E e0 U4 n
; r5 H7 S4 Y6 {( N( S1 l' }. S mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; I6 h4 h( n J j j* D; M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" I S4 n1 m- v; U/ k. y' e# [ mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 ]! u1 C+ K, ^- y1 R* ^( O while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );+ {7 F; M8 i7 l8 ?' m
+ V; a# @, Z# t: e3 I5 P/ [ mcasp->regs->XSTAT = 0x0000ffff; O3 e# I3 J- r' u, m# [- V$ }
mcasp->regs->RSTAT = 0x0000ffff;
! Y* L- N0 C- X/ c0 U( R3 j7 z) y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ o8 d; B% m& _) b while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- |, w1 x$ V ?. D+ ~
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 Z) l- F+ [2 R. [ S/ x* o7 u. B1 |( g while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: f+ j% _# }2 B3 M$ O+ c$ \" b% o8 |$ {2 y! A
/* Write a 0, so that no underrun occurs after releasing the state machine */
2 g+ a r. `8 A mcasp->regs->XBUF5 = 0;
. I, Q3 J5 G1 K1 _; C1 f3 ^% i mcasp->regs->RBUF0 = 0;
3 r B9 |8 f, m+ i: r* }
# K1 c- f' m, }0 k) l- O* q mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
* b# S3 }3 l3 \$ Q0 ~% r% C+ N. V' ~" x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& v! A, b1 c; L mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # X. p1 O9 B2 e. j3 I$ G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. h8 ^: h2 x, I- D9 _7 A
0 E$ ?; L8 d6 z mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 ]7 J/ W( Y: W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );* F5 R: a; m4 s% i
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 a7 @0 X* Z, X+ u4 Y: N" F2 O while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );3 s- ]2 c. q, \! E
. }% U+ y; M P( r5 S/ A CSR = 0x0000;
- l# O$ w0 [" I; C INTC_INTMUX1 = 0x3d;# B, I' q" m6 t
ISTP = (unsigned int)vectors;
5 x) M# u( `2 h: a) q5 s: g' e ICR = 0xFFF0;
. R8 Z: [5 j" {- h& R) o8 c IER |= 0x12;
( ~: H ?0 z2 y& i! C CSR |= 0x01;
2 P" ^! H( {$ X0 p* a4 l
" M+ t3 T4 ~" l6 J G: Q3 b2 q; ^6 K
5 Q, N8 n: X$ x) |% U3 ~6 O, ? }$ [# ]( o+ g, I
还有就是两个输入输出函数:
5 o" T$ @% N' o4 {- C& Pvoid output_sample(Int32 out_data)$ Q0 o% ]3 |7 O, _1 y2 r" n
{7 E8 a R6 v) F$ j1 o
AIC31_data.uint = out_data;
& s, C" `. }4 u% r* V, [5 i MCASP1_XBUF5_32BIT = AIC31_data.uint;+ K- l5 f& n1 b9 q3 T6 _$ ]( L
}; x" x, w' R& y: g5 D* c
, ^3 z k9 u" n4 p9 d: W1 n1 W
Int32 input_sample(void)
* M+ Y7 g5 X0 `5 f0 W r: [{ $ U4 u9 y/ V( z' Y6 N. M( `* n/ H# U. R
AIC31_data.uint = MCASP1_RBUF0_32BIT;
) d4 G' s" P, t3 y1 k+ T return (AIC31_data.uint);5 L$ P, y% k4 a. a J4 W3 @
}8 U) I* U; ^) K
k. {! K6 ~3 N2 { |
|