|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# A) T$ O- C1 q a8 s' R( W5 {
main文件:0 ?0 N9 ]6 Q$ P! a9 z2 A
interrupt void interrupt4(void) : D, x5 O( \! v6 D
{% p5 p i, Z( Y
Uint32 sample;6 m5 K9 W: G) ?. n1 B
. m+ T7 ?0 d7 {" j8 L, ]6 Y" } sample = input_sample(); // read L + R samples from ADC5 Y( {7 x* p# r3 |& o
output_sample(sample); // write L + R samples to DAC + _1 Q+ n0 T3 y- l( Y9 d8 N
return;
7 H8 \# o7 R& U9 ~+ J2 S6 m3 B}
0 d6 ]+ @0 j8 m1 t/ P# C* e0 i7 h9 N! K* g4 S
int main( void )
2 U# y) Z$ T3 a& |{/ m/ v6 J, `4 }
/ W J4 p* |+ Q0 o+ b, a0 } /* Initialize BSL */
+ {8 ~8 \, G: I" y6 d1 A4 V EVMC6747_init( );
( s& a$ G# z" n3 M' @' d' o /* Call evmc6747_intr function */
! j! q, \7 D0 m6 C2 G" {7 X aic3106_init( );
8 R, G# p3 K8 d" ^/ H while(1);: w' W# x! v+ C2 Q- {" |, L: n" u
}
2 k U! p, N4 _1 F& l! ^
# d8 C8 i# z$ q6 _1 a4 i. B) Q( s6 |
2 S' E4 P( c. \2 O& naic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
4 y9 X, J2 q7 J3 ?9 V7 t/* Initialize MCASP1 */5 M0 I& \+ P4 U$ ` \" R
mcasp = &MCASP_MODULE_1;
/ e+ D/ B0 L! n: i mcasp->regs->GBLCTL = 0; // Reset
- O: v; A, x r6 F8 j0 `: L( _ mcasp->regs->RGBLCTL = 0; // Reset RX
g! r/ G+ z4 X1 H' w mcasp->regs->XGBLCTL = 0; // Reset TX, |6 ^$ Q; D$ \
mcasp->regs->PWRDEMU = 1; // Free-running4 ~5 G( Q/ Z( l8 @% R0 o" ~2 B
// configure McASP0 receive registers" `. Q J0 t7 y8 q* ~3 {5 r: S3 w
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
3 u- ~7 C* t+ m1 z& W* A. u- w mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 _ [( Q6 j( v
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# z3 s! _9 G4 X. d1 P, x# p3 T mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)- l; p3 n2 {- W/ s O
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side). D: a! \8 r5 l h6 H5 F% |
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ s- W- a7 C0 i2 e mcasp->regs->RINTCTL = 0x00000000; // Not used
' [! V/ I, ~5 ?( @8 x mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 d) v( A& E7 }8 d" |( x) A
) M. M, o( }# h: `2 Y( Q) p/ H0 g/ d
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( r7 d* h2 w+ m: P4 B; `) O8 d mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 g# E% U7 h7 i: F7 Y mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( F' r1 B+ U) w( N l mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-165 {, o1 H, B4 t6 U
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
5 `1 t! Z$ E! S/ s+ c% y; u mcasp->regs->XTDM = 0x00000003; // Slots 0,1
: t% V( Q" _9 p: ]! m' E4 N mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
: T6 j1 P# K( ]' @6 _! M mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ X, F @" `- C3 i0 [
+ \& i+ A) t9 h. q mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN8 |( i, m) j: }6 s. H7 w
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
: W% i1 Q6 U+ _# t% L mcasp->regs->PFUNC = 0; // All MCASPs' ~* V$ J: } R1 j) y3 b6 n
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1* x+ M$ S/ j- y
+ z" Z X% H8 X$ n5 v( Q P q- Q, ?
mcasp->regs->DITCTL = 0x00000000; // Not used; y: x" I9 u* @0 b% {5 f
mcasp->regs->DLBCTL = 0x00000000; // Not used
# h8 O; V: A K4 p% A8 M mcasp->regs->AMUTE = 0x00000000; // Not used% O% Y2 |* d' c/ h c* G. x2 O; g
' V+ T* U6 y" L2 B. |7 p/* Starting sections of the McASP*/
T+ _5 B- h/ m8 r6 H0 G- ]) R mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- r6 F# b& [0 h5 z' Z3 o# W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 4 R0 W( o* F* C( _; `; o
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( j2 l2 T6 b. B u% K, D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );" k9 Y1 m! \. C0 R$ M3 R
6 H* B6 x/ j6 K# v$ Q0 ~1 F+ n mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , S& F6 L3 g; X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 P( q7 Y+ c$ X
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; $ w9 {2 S" d' b# T: O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );3 K3 I$ @: J* j: F3 [% n* _
6 K9 M" L* R& ?! f) [3 O8 L
mcasp->regs->XSTAT = 0x0000ffff;
% r4 S( c; p0 W+ w- [ mcasp->regs->RSTAT = 0x0000ffff; 7 r/ c$ w% Z1 `* n
( X( T, m% J3 O1 u0 m mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;# R4 h% T/ F4 c' S" i4 k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );( t# h+ P2 W; \; h7 _+ F4 i, d+ j1 o% L
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 l& |! Q/ Q ?, B$ ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; ?. D! J4 S% w% U/ @) _ ?& W, t+ O# \$ {
/* Write a 0, so that no underrun occurs after releasing the state machine */1 V% X& P4 p- }& i9 A2 d
mcasp->regs->XBUF5 = 0;2 `4 y, W6 y5 w$ J5 J# ~$ a
mcasp->regs->RBUF0 = 0;
! u8 c( U' h7 G# L/ E+ \" }+ h$ a5 y3 W7 K0 M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- ^2 H- C7 @1 I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );0 G) d! M m8 `* W8 k% C
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: o9 x. V, [3 Q' t8 k0 d, X) w while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );: u0 l( A0 u6 O7 o; F8 L
" A7 I9 Z/ u3 F$ z; d1 B, Y2 u
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( Q% x R% M1 K1 F9 f5 m" K7 i1 I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );! R' q" v2 m8 I; {/ c/ z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
, w/ j0 e2 }, l/ x7 r. ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* d! s- t3 i" ~' z F) f2 x9 C4 Q4 z2 U* a" @
CSR = 0x0000;- c! K8 z, D/ C6 i' o6 s
INTC_INTMUX1 = 0x3d;
2 C) M7 E( D# m! u) C$ T' m ISTP = (unsigned int)vectors;
2 K* P- m6 _, L& f( a; } ICR = 0xFFF0; + r# J1 O) @/ R. ^$ E
IER |= 0x12; 5 U; a' d4 k$ I3 N' m- O( M5 S
CSR |= 0x01; 4 q# G8 {8 g3 s, K6 e y
8 F, I9 N, N/ `$ U7 f) f$ O
* ^) l# I/ y& {8 [# N3 K4 e8 ?$ K) P$ I: u
还有就是两个输入输出函数:; O2 p! U4 o" s. u! E$ j% |
void output_sample(Int32 out_data)
5 B! R5 f- ?. n( U2 T) ?/ h3 S1 y{
$ ~3 u( o; o3 h q2 z0 ] AIC31_data.uint = out_data;
, _! J: |, r3 {. _6 ] MCASP1_XBUF5_32BIT = AIC31_data.uint;# P, r7 P+ u% F, ^
}# c% }0 z; \5 W$ x! |
1 F0 |$ o. V# Z( M1 @9 s9 X. gInt32 input_sample(void)) j. E: F0 a) Y t! J
{ " t0 a( l) l9 F- ^/ c" L
AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 ~7 n: I$ M0 B0 f/ Y return (AIC31_data.uint);9 L* r+ Y2 M* b) w; Z; }! F6 I' Y
}8 q6 n% o5 c( V4 ~
% _4 R8 n0 p" s( l0 X |
|