|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:+ m! t! i) A6 ?" c$ E' v) D0 T
main文件:
2 P1 ~3 M0 S8 R: v, h2 { [$ jinterrupt void interrupt4(void) ! P+ J* R( B9 z/ H! E( ^# o
{
: C( L4 n) V u$ `4 s" n- f- O3 d Uint32 sample;! F- N- {2 ]' _! J0 D
2 y, z; g3 u2 e# ^( p sample = input_sample(); // read L + R samples from ADC
' _8 ]9 b* d4 M$ Y output_sample(sample); // write L + R samples to DAC " M% ^- d7 I6 _& U7 z
return;4 r8 `9 B, ~( A* r% `
}* i6 F+ b: G- b0 Q7 f, L
. I* ]. k3 t( w* Z+ q9 aint main( void )
( W5 j; W5 i+ A* Y, v5 A; B{3 H* F1 ^" l3 Y! ]
# h% m! V- L; u( x
/* Initialize BSL */
4 h$ e. Y( S$ l; ?9 T+ v) r7 U EVMC6747_init( );
& i' w- I' G9 Z+ F5 y /* Call evmc6747_intr function */$ l! K: d5 E$ s, B6 O
aic3106_init( );+ K( z5 P: z( ^4 j9 T
while(1);* P$ p' f, `8 F9 ^; U- o6 q
}
( I# s) ~+ ^+ p, T1 b; P1 r0 v, @0 i
! F3 N% U. a& iaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题! l" J4 r2 n+ N3 A$ j. h
/* Initialize MCASP1 */# c+ E% Z4 ]. x& h, Z1 o0 v
mcasp = &MCASP_MODULE_1;
$ i& C: {# A0 e mcasp->regs->GBLCTL = 0; // Reset
+ \8 m2 O- }! z$ ?) [5 @ mcasp->regs->RGBLCTL = 0; // Reset RX% k0 u) d: u$ G8 J: K. F: U" u
mcasp->regs->XGBLCTL = 0; // Reset TX
: j/ O: d: T* E* @+ V% s mcasp->regs->PWRDEMU = 1; // Free-running
# O- |9 t# D$ N2 E: m- C // configure McASP0 receive registers& l& p- b% u8 E- p& @. J/ L
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used' k$ R9 `2 H. v% Y" K
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# q& W7 I, \5 Q) F, U9 i mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
0 _/ `& L/ y! M4 W/ ?! h3 ? mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) X5 f% `; s; q) n; x2 y2 C8 l
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 v& T9 ~! S- P$ {9 f" @6 E& [! a mcasp->regs->RTDM = 0x00000003; // Slots 0,11 S: r6 I* K: S+ v
mcasp->regs->RINTCTL = 0x00000000; // Not used9 o/ ~6 ]' |" U* _
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 {# H9 k& D( ?3 L
7 Y8 U5 S$ G) f# K: v mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 L* c- ?2 o% u0 u$ e* o mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ o# N4 O, h3 M2 x( H+ H4 O9 E; t
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* K2 P0 P2 `$ ^ z7 J% F4 z
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: C0 t6 I' T- E/ a
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 i1 D; j9 P% N. x mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; a1 I% F& P3 ]$ f mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
% V& A. a) a; R4 @2 a mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 S, M" J" K# | N1 E* p
; T" }- b* T) q2 {, G
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* S3 F. }! r. N( n b P0 m mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT9 e& F3 H) } b# s" T- ?/ X8 r3 G
mcasp->regs->PFUNC = 0; // All MCASPs' C$ C+ g+ C. [' U
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" O3 _' B' e5 j6 t5 L: n* t7 b) S6 e( i7 B
mcasp->regs->DITCTL = 0x00000000; // Not used
8 t- n+ b8 @) `# { mcasp->regs->DLBCTL = 0x00000000; // Not used
. J. ~( C8 p, r3 V, |6 v mcasp->regs->AMUTE = 0x00000000; // Not used
% V% ~/ }7 y- f7 H5 M0 y n4 E$ g8 t
/* Starting sections of the McASP*/
( q7 p# k, U9 X2 W mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& D: {& q; S1 d6 {5 T; X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); , `0 r0 F# O. Q1 T
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; % N) ~( u3 Y) [2 ^% F! S0 o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- _6 P# e. Y6 K# Y: Y# D# }5 J, U! O) S, e t% c% c
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; + g7 c- L8 P: E; [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, e' n a1 s4 m3 H$ n! d2 J mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; p# P% e2 C; f M% I" ^! Q) S while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );8 [. O& T. @$ |7 K' c
% s* W2 \+ D/ n6 V# u* T$ q mcasp->regs->XSTAT = 0x0000ffff; * v( v' a! }2 Y1 Q
mcasp->regs->RSTAT = 0x0000ffff; 6 |2 `; g/ J& M/ o6 R- ^8 c& I
+ N, r' S, ~ E6 `% E5 X+ _: r" h
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;% H I6 f3 P# K* O2 \0 t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 k3 y: w! x. D# ` mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, S8 I; U7 }/ p9 W; c' q' k& I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );# f y2 v7 M' E. _' L
7 Z: }7 |3 e$ x: h' L8 ]/ ~+ x/ N; v
/* Write a 0, so that no underrun occurs after releasing the state machine */3 k- b: A1 S5 I1 H$ X
mcasp->regs->XBUF5 = 0;
' j/ {1 M0 A5 B8 A- W9 [$ ~; _8 \2 ? mcasp->regs->RBUF0 = 0;- E `& z: S: j$ z
; d3 `( O# Q0 C3 |: ^
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
* P- f+ u( L3 v6 N7 w5 Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );9 m& v/ r! q: ^3 k8 m) w. p
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 0 ?3 P8 @9 N' D1 O2 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );+ e) h4 t6 V! @0 m* [, Q4 |: o
- O% F' M$ l( U$ p& i4 @3 z
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 8 \% ~# K" t5 P8 ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 {# P: \2 ~( v, r( ?( H5 {: ^ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
M( M, H, S% Y1 {% @# M: k0 N while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. m7 v Z/ N! h# P- H7 q1 `7 Y: |1 }3 `8 C$ _7 b
CSR = 0x0000;. \: c+ R$ e1 y8 {; [8 c! \( R; }
INTC_INTMUX1 = 0x3d;
6 ^) C6 `* n) x! H( w. J" m [ T9 R' _ ISTP = (unsigned int)vectors;
1 a# O. }) e; ^* T ICR = 0xFFF0;
: J) Q, \& F/ P3 Y IER |= 0x12; 3 j3 q9 c( s/ l `6 U
CSR |= 0x01; 1 I$ L+ Q, t9 N$ A/ b" ~
" u0 S( _8 ~3 N" Q @: B7 H
. e0 v7 v7 } S; x; z: F+ z' S* ~( B
还有就是两个输入输出函数: L- z W1 `% Z2 G
void output_sample(Int32 out_data)
+ Y$ f$ p/ q' w{! M6 f9 k( p' |' k' h) T$ d
AIC31_data.uint = out_data; 3 \( o( o" ^- j4 ]
MCASP1_XBUF5_32BIT = AIC31_data.uint;
' K8 r* K" G6 D/ |3 v: |; i}7 H$ z# Q9 p; y# N" C: u
7 i/ Y; }7 Y: S( b+ v0 jInt32 input_sample(void)
. e) r5 K! ]/ C: S' l9 _ Z{ $ d v8 |4 Y! T
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ C' C8 Y `" |$ j, b3 ^ return (AIC31_data.uint);
$ E6 @. K U* U2 p}
* _$ K7 T5 C+ N+ K% [
' k3 F0 r3 z; G5 d |
|