|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- L; P C' @. n" G, ^) T2 _ h, X+ bmain文件:. n! u# D. h- G8 s2 ^6 g, ?+ i* k7 ^- i
interrupt void interrupt4(void)
' N1 U4 i( ]$ R' |" j{" K& a0 t5 r6 P& J
Uint32 sample;
& ^- L# s! L$ I& q% V
1 {- F/ \; V: k8 x: s- J$ L sample = input_sample(); // read L + R samples from ADC- K0 I6 x1 \5 j' B* m
output_sample(sample); // write L + R samples to DAC 2 w6 V) u& b- Y- G
return;2 g4 J9 a. e+ Z; ]* S6 s$ |9 | f
}
3 F% x( Y6 z' X
" v- Y% G' l/ J; d# k: K# qint main( void )
! i2 m" a( T3 _7 m+ u4 }( n{
A# F2 H) h9 o2 ~1 H5 L, @* t/ y( W! ^" f
/* Initialize BSL */
( B7 p2 I0 y+ Y2 p EVMC6747_init( );
5 l& d, R, F- w+ r9 E, j7 {) w, J /* Call evmc6747_intr function */ W+ I( _$ W; @* |( ^0 J: x. V: {
aic3106_init( );- W1 U" y+ a7 h$ \3 ~# T% \
while(1);
: N: Q" J# ?$ |+ ~; H}
% x" q( _; N" x7 T, e, N; |% ?' {, b! H2 {0 ^7 N% I) V
/ S3 E3 J/ M6 Q9 q3 paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
, V3 h0 y6 H' e" Q/* Initialize MCASP1 */: _+ b8 |0 R$ r6 z. S) }
mcasp = &MCASP_MODULE_1;
+ O4 f u: ~1 j7 F0 S mcasp->regs->GBLCTL = 0; // Reset
1 u" Y2 y2 D2 F" h, J d P mcasp->regs->RGBLCTL = 0; // Reset RX) a/ s6 U, u1 p1 \6 Y T# s1 y1 j
mcasp->regs->XGBLCTL = 0; // Reset TX
! u8 r6 ]4 H, j mcasp->regs->PWRDEMU = 1; // Free-running6 j1 I, Z9 x9 N- r5 Q: K- k
// configure McASP0 receive registers
K. @& H+ S$ \; _; W mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
# r0 P( h1 S; } |7 F mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) h$ z6 m* [1 D; I5 I- | mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word* I4 L; r! l+ i0 D; o
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)% B, u1 M5 u# b- I: j" U! I
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)' m3 x% r$ e$ Z% ]& p& \% F5 o
mcasp->regs->RTDM = 0x00000003; // Slots 0,1& b. t- G; V7 O, P* K
mcasp->regs->RINTCTL = 0x00000000; // Not used
8 T# ?) v9 J" H2 d2 h8 i mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 ]; `# U8 O6 Z5 W8 s. S
! G3 d) w9 }! G5 S mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( D8 l! R3 k8 k0 g* |4 ~7 B) S mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; n Q$ e- j, K mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 D& u- V9 ~, S8 Z$ e mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16( |( m4 v$ d; M' r+ D* {3 K
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
/ `$ Q- u+ _, _ mcasp->regs->XTDM = 0x00000003; // Slots 0,1% g+ i! ~5 R6 Z9 S( e& q
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& U; ]7 s8 g- S5 l- W0 j mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. J0 R! C5 r. H' k% s! {9 I, k! D0 q/ W. Q' M8 f0 e' S8 _( i6 y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN- A3 w9 `/ v9 L( L% b
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
; x% |3 v( q3 G3 F+ M% ] mcasp->regs->PFUNC = 0; // All MCASPs
4 P V3 r H+ z' z. E+ r1 z6 e mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ D' @$ y2 L, E: Q/ S( F4 x! s! W3 `/ G
mcasp->regs->DITCTL = 0x00000000; // Not used& J( c+ {6 u/ Y. R3 i. B; ^
mcasp->regs->DLBCTL = 0x00000000; // Not used4 c2 ^3 d" q9 { m9 w4 ?
mcasp->regs->AMUTE = 0x00000000; // Not used
7 H% n9 h$ u a. F0 o+ t
7 d0 d- f* O: C; X/* Starting sections of the McASP*/ b8 M( c, T8 |4 H7 |, q
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 }7 A' ~+ R( R% J; p1 e: j) H1 o" Z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: q. q, {4 f* B1 P9 ~9 n mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* q' m1 j1 E% f/ D8 \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- R X z- }; C* S2 i$ H1 h+ t
8 f6 y$ X" `( M1 L& h* T' G' \ mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
+ R6 n. `# K; m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );! q6 l: U5 s& S
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 U. p- `# ~- a1 y3 W" q3 y0 ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! I5 Q+ v( w* F* Y K: V3 ]
I% u6 N _- a1 H% O6 M mcasp->regs->XSTAT = 0x0000ffff;
7 I/ c/ m# Y' e# d mcasp->regs->RSTAT = 0x0000ffff;
) u& E9 ]/ ^" f1 j5 Q
0 m7 d5 l" H( d/ q% d! ^; |3 @( q mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;- z+ x2 i: v' c2 F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );4 ?# H3 _6 s* u- m3 j1 n8 o8 f$ ]
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
7 z1 r/ u2 l8 Q1 z, X while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
" {& c. r: l4 a; v9 Y+ L# {0 @
. z* ^1 Y' D2 M& N. H% B4 }# J /* Write a 0, so that no underrun occurs after releasing the state machine */( \0 z( u+ s- K
mcasp->regs->XBUF5 = 0;
% t0 y; Z) V% t5 b z mcasp->regs->RBUF0 = 0;7 A' _ S5 \; R7 d
5 Q5 `7 h |) @+ z mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 3 E n7 b" V4 h4 G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- q9 Q/ m& d+ K, b3 R- \ i" O' A mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; & g4 f/ c* c" f% m& H; t {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );: k0 |4 U; X7 F3 P# V8 l
3 h4 a3 U/ e b5 C9 D' L$ P5 M mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" ?* Q- Y; F- d# ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );; ~ w+ i: c, i% t$ C" T3 @: R
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 3 [9 @4 @4 z# I4 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. n/ G) G5 ]) q( M$ e
. W, ^8 R( w0 z' x/ r( S5 T2 G" l
CSR = 0x0000;/ y3 h9 A3 Y F. [
INTC_INTMUX1 = 0x3d;
' S, }7 w& Q3 f/ s. f ISTP = (unsigned int)vectors;
5 e' F4 g0 e* @0 T ICR = 0xFFF0;
) |( t9 P; c* V4 j& A$ y7 A IER |= 0x12; 3 b* l. n, X! I8 P" ^8 }% k; E6 U
CSR |= 0x01; ; s+ E* d7 {( D( E
, p$ ]( x, @1 d) Y7 B
8 C( Q' R! j% l, I$ T+ n% j- I4 o6 m6 V* P* p; k! `, O
还有就是两个输入输出函数:/ b* y* ~9 o$ ]4 h) ?- L
void output_sample(Int32 out_data). F. D+ w9 j- v+ j% B5 a
{
% ~; J+ v3 y) | AIC31_data.uint = out_data; : Q( Z! u8 m2 `' X* g+ m k) W
MCASP1_XBUF5_32BIT = AIC31_data.uint;
( K0 W1 X+ v" N}6 x z. u* G. Y
- W' Q% N" S' o
Int32 input_sample(void)
8 n& n: g8 V& ^* `( \{
`/ [- t$ y3 b: p- W AIC31_data.uint = MCASP1_RBUF0_32BIT;0 B1 v" n7 c' [6 K( J+ L3 r1 s
return (AIC31_data.uint);1 q1 \0 b% b1 K/ ^% _/ R. _
}. ?- ?7 y8 L1 D* x0 i
% f; k4 B) C$ j
|
|