|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:( ~, B- e$ C. m# u. x" j
main文件:
, x8 h( a3 P4 b- {# s0 Einterrupt void interrupt4(void)
! r! E+ B) I1 z2 T{- z, _* d; {. ~) ~! u& T
Uint32 sample;
2 s% \' k% ?$ S# G+ j! q$ U4 c( L" g2 d8 Y3 U
sample = input_sample(); // read L + R samples from ADC
$ t" g: q# O, U& D4 P% d output_sample(sample); // write L + R samples to DAC ' S. H4 g+ P- ]1 H# n! S+ y4 s( A
return;' _, C5 l5 O( L/ J# l' m' s I
}
& G5 {, u* n# p) p5 m! C$ t; _- [, Y; Z# [; w7 j; N
int main( void )
3 V& b5 R. I7 ~{
) ]+ v) }$ {3 N4 c) ~; I3 Q9 Q }$ w8 o, I3 V/ ^0 k5 L
/* Initialize BSL */6 {/ V2 B. s! B8 [& v
EVMC6747_init( );( k3 _* [2 Z4 x* S7 i8 R+ f5 ]4 I
/* Call evmc6747_intr function */
9 L3 @( _/ g& t( b4 r u& | aic3106_init( );8 {) `- T& a u
while(1);
3 e1 v! E% k4 p% S$ R5 n. D2 f. }}+ q+ b! U! @1 Y; }0 m" x* c
; h( d( p/ v. s) {: }) ^1 Y( L- ^" _2 P" o: ~/ z+ g
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题8 m& l) p# k. ?5 A
/* Initialize MCASP1 */
; `+ j1 L l3 H; L2 c2 B mcasp = &MCASP_MODULE_1;
5 w' e1 H) C8 K' b9 u mcasp->regs->GBLCTL = 0; // Reset( [: k8 Q& P" J
mcasp->regs->RGBLCTL = 0; // Reset RX5 e7 G3 U6 @, W% b$ a: t1 E. H; G
mcasp->regs->XGBLCTL = 0; // Reset TX7 X7 y9 o4 S% ]1 j& [& O- v
mcasp->regs->PWRDEMU = 1; // Free-running4 C3 f% {9 @1 ? I4 s- z5 S
// configure McASP0 receive registers
2 p4 d8 t! ?# z A* R mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
; @/ f- g$ ~! V/ G2 ^' H/ \% J7 p$ D( Y mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" A. s, N' ^1 y( H0 P2 z& L mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word+ V/ ?) V" o' t& X3 t4 r8 |9 v' S- _9 Z9 b
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)3 h, x2 A& G2 q* ?/ |% y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)4 @3 T2 j9 k+ z9 |+ i
mcasp->regs->RTDM = 0x00000003; // Slots 0,15 p, i( s1 y0 w/ ~
mcasp->regs->RINTCTL = 0x00000000; // Not used+ m* D1 O0 y1 U
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( @! h$ `) `( K9 w0 q0 H
( Y! b8 B3 ?9 E! q$ O& s
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used K# o1 [2 M6 K9 F
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: l0 @/ p4 }8 U mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" a- |+ r) r/ x7 `- i
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ C7 P) [0 D5 {) }: \ ] mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" ^3 n" @3 F! O; T mcasp->regs->XTDM = 0x00000003; // Slots 0,1$ l: U, C, |/ x T. i
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 A6 _1 c- F5 c3 ~! S: B mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 q0 [1 P A/ k3 e+ k3 X* X) j
4 m7 _ v7 u8 l+ m) |8 `( | mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN5 N+ v" p5 p$ \" b _9 j
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT- l' p6 S; }5 S4 c" q
mcasp->regs->PFUNC = 0; // All MCASPs
$ _% b" X- I# h mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( v- a# r) _3 [) Q: v- C9 ?, m3 ~$ Y6 C8 Z: q
mcasp->regs->DITCTL = 0x00000000; // Not used
2 I( \5 g6 t& H4 P mcasp->regs->DLBCTL = 0x00000000; // Not used
' X E- Y* b2 @ y ~8 C9 |0 d5 x, M mcasp->regs->AMUTE = 0x00000000; // Not used
) |0 O* B8 `) O$ a9 A5 \8 Z- B q0 U/ ^
/* Starting sections of the McASP*/
G# s/ W& ^8 ^ N O3 E2 ~1 _3 F$ { mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 u6 E$ i7 u( c2 u! f7 J) _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 1 w. E: Y; m/ h) E2 |& \; ]; S
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & x. ^7 y" d* K5 M) K# P* X. P7 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );$ r& N+ O+ t4 @! B# a" a
7 T7 E( f$ ~" x0 [
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 D3 E, i% I z: g7 v7 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );. r! D Y3 h+ t% n+ q! r
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
9 B6 K: s( a: @# R6 _: { X' ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 \* q E5 W& S: N! a' V: I8 Y7 u/ ~3 z
mcasp->regs->XSTAT = 0x0000ffff; / ]/ X+ R6 J" j
mcasp->regs->RSTAT = 0x0000ffff; 5 M9 s$ o; D! F6 n
6 g, b4 d- }; o6 a" K! b7 Q) a8 F8 i mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 n" ^. U) |2 d* Z% o% x( F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ |9 T5 s# A( u4 X* D* r2 M
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
8 I1 B' x- h- }! Q* p( j! E2 {( O while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 i p7 Z z. T5 i( n
. i" Z x. M+ e* X5 F! N% q1 M8 H
/* Write a 0, so that no underrun occurs after releasing the state machine */0 M- C! ~3 W3 `0 `
mcasp->regs->XBUF5 = 0;
6 z# c8 R5 ?" h/ T8 m8 S( B mcasp->regs->RBUF0 = 0;
/ J3 s4 H& h& y3 U( l$ m
5 B8 w& o! z' s, | mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
+ E( n9 Y9 [+ Z( u- G while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
2 |8 s- J* X- a3 K mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; . V5 K' ]- L7 g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# y1 c) Z s6 a4 w5 O
' Y" U2 J2 E- s% N! @: n6 O mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 x4 h/ F" A; Q3 Q& p- M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );" R# d' E4 j. L$ W0 s" |
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 K' a. Z0 t3 B u" K I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ {7 P! w! c7 O- n
& l* {5 g, f! e5 r CSR = 0x0000;& ~0 H! W! L: b1 {6 ~+ h. a
INTC_INTMUX1 = 0x3d;* G/ p1 `6 f) B. V b. e
ISTP = (unsigned int)vectors;
3 X. J$ x. c# ^+ y; s" K) H ICR = 0xFFF0; : O$ ?" j. w# s9 C9 H' B
IER |= 0x12; ) H; F) @2 ~/ c5 ]* s0 c
CSR |= 0x01;
: \% g0 l% b" d; `
& X+ f* ^5 ]( }% d
. @" J' V( f' g: _7 N4 D7 i9 p9 F6 Y2 P
还有就是两个输入输出函数:
# M, x# ]: C$ L7 P+ O* d8 U. }( q% Pvoid output_sample(Int32 out_data)9 G/ j2 J2 k7 i- ^( C4 n# ~
{
L! G' P; o4 Z1 C3 u$ Z AIC31_data.uint = out_data;
& h/ ~" T% y U+ g: v3 i- p MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 z% a/ L5 a- n# o3 }}
$ ] m1 E n: w% ~% H- `" Y- z K0 c
Int32 input_sample(void)) Y( D7 v& [: x! @
{
; Q1 u1 g6 l" f8 U/ B0 F3 { AIC31_data.uint = MCASP1_RBUF0_32BIT;* `9 C4 I! f# g L1 k2 t' o
return (AIC31_data.uint);3 S1 \1 i" w$ ~3 [' O
}( K1 B8 [6 g8 l7 G/ o$ o
- s3 s8 {' b7 l
|
|