|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:3 L- W3 p% N, p0 Z9 w
main文件:) ~2 J" M: c) |/ V; I/ F0 b& l$ I
interrupt void interrupt4(void) 1 W4 A* c. l+ I5 `
{( M1 d# c9 s! E
Uint32 sample;
% t* d6 f' Y) I& _( D7 A O, t# i' }- V; E
sample = input_sample(); // read L + R samples from ADC" c$ O) Y8 R2 E c' s" Q
output_sample(sample); // write L + R samples to DAC 5 S3 g: `1 {3 K
return;* V4 ~; M# F7 a! |$ ]1 y
}
: Z: f; c& C& k3 t9 g& V; b0 Z% `' _" [% t+ k4 v
int main( void )
) Z; y* J9 `3 ?: M1 g; G! t) b{& M5 K0 m5 g- c5 \' q
% e! ]$ _# d) ]7 s+ V* C3 W3 k
/* Initialize BSL */
8 \% c/ E5 t/ H' Z# D+ ~7 `$ ~ EVMC6747_init( );" d" r+ \" K) S$ s7 B3 x+ m$ t
/* Call evmc6747_intr function */" f" s* U' H( G/ e% @, n
aic3106_init( );
& C3 t- t* i$ B while(1);2 I" P0 K# K& W2 p# C
}
' r: T8 r& I* Q, l( S0 }
$ s# j8 {/ z2 b4 t* [
1 q5 _1 Y+ @5 z' Oaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题! y: a0 X ^: j8 Z% X e- C( d
/* Initialize MCASP1 */ x' i1 Y- W+ l: F% W' h
mcasp = &MCASP_MODULE_1;
1 J! \! E3 A8 O' ^7 h/ |0 Q& U' r mcasp->regs->GBLCTL = 0; // Reset$ g; C" w6 X J" M, P6 w
mcasp->regs->RGBLCTL = 0; // Reset RX
* `0 x8 r7 I: M, |# e/ c mcasp->regs->XGBLCTL = 0; // Reset TX. {4 f$ v( O8 m7 |( `+ f# Q( y
mcasp->regs->PWRDEMU = 1; // Free-running
4 C0 x. \2 C2 i/ V$ S' I0 s4 M // configure McASP0 receive registers5 G- I8 K; A. Z3 T/ `: b
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used t7 Y% t( q, J( V
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 o& k; Q' K }" l) }
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
; B& |+ _6 ?8 {% \ mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)" @( A# a, U) ~: d: ~8 [0 `7 N/ D
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
: u$ N( J3 n( R6 |+ L2 L5 y* g mcasp->regs->RTDM = 0x00000003; // Slots 0,14 `0 u0 X8 B' @1 E. ?4 z, ~
mcasp->regs->RINTCTL = 0x00000000; // Not used
3 {6 D$ ~( s/ n& I; e6 ]& _ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# i' r9 O9 q: k; Y$ k$ e; z
6 ]0 ]1 I& t& T4 e6 ?+ G% v% d mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used* ]; I0 o8 `" M% O. }' Y! w( p
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 v% l/ F% r Z3 W+ ~) j$ l mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word; C9 t5 j" K5 @$ R
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16/ x! y$ Z/ G. e
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK8 n0 r6 X* f* g9 m0 {2 X. {
mcasp->regs->XTDM = 0x00000003; // Slots 0,10 R' U' ^- R+ _
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit8 d0 ?7 c k* \! [2 j& ~
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 u: P% R# _- J) Z; e5 L
; m, e4 b0 z! W
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN. _* l% l! ?7 N$ i: I6 A
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT o! W2 n. v: g' R: r6 p: T
mcasp->regs->PFUNC = 0; // All MCASPs; T4 t+ I+ R7 p" Y+ U
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 d0 d# |7 b7 D) `' ~$ p
1 M8 C9 r* D. ~ `" W mcasp->regs->DITCTL = 0x00000000; // Not used$ I; g- J: h' D
mcasp->regs->DLBCTL = 0x00000000; // Not used {9 C$ ~2 I7 A% l, t& \
mcasp->regs->AMUTE = 0x00000000; // Not used7 F3 l0 m& q& M) H: E& l. H
, S. s" N6 n/ b1 e' C H
/* Starting sections of the McASP*/$ M' I* L G4 L. Q, A7 f& l3 C# ^4 r
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 ], W+ C) g1 B- q0 c$ r# u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 2 p- ~; t& |# }4 B2 C
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 4 f. o/ j) Y; B( U( i* O: w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ f: a5 J+ K5 q+ m. K
1 p0 @) y4 c+ S5 n9 c0 ~ mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; n) U% H- Z/ w& a8 e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );- y! w+ X' j. \9 l( @: E1 f
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: A1 n$ b, A: ?, t$ q4 q# Y1 M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" [' S+ \" j4 P$ A5 ]- s. V/ ?4 r: P5 b+ R
mcasp->regs->XSTAT = 0x0000ffff;
: n1 J; Y" B6 x8 _4 n. w) {( _ mcasp->regs->RSTAT = 0x0000ffff; : [: _- n1 B# S5 |. A1 Q
" i: c% u8 z8 k# Q- Q. |" @
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
3 [1 P0 `- z8 Q$ V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 v' D6 }( n2 Q
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; * C* f, s6 A3 j1 v2 j4 n! h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );4 f2 M# a. k1 a
5 ^. r& v: y+ ~( T /* Write a 0, so that no underrun occurs after releasing the state machine */
6 M4 @) y2 O* Z! R9 z. e9 F mcasp->regs->XBUF5 = 0;2 G0 E9 Z$ ]# C# o" N4 A, `# [ i
mcasp->regs->RBUF0 = 0;! ~0 T# L( r# v) D$ C' J' D
% H) c/ K1 M6 }
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
[1 w$ b5 f9 j$ k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 l; y; @' w( B mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ! Y2 a' x/ y) @. G- R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );7 M9 I$ @. @$ M) a& c& e. s
& C$ A1 J' J" H R mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 [) ?* ~9 \1 @: m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );* T6 Z0 l2 X# N5 C6 f8 b
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 p0 ]% q( B0 `0 W! A1 K4 d+ x6 t while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );; O$ Y" b V$ a
" u; G5 i h) y. v" c
CSR = 0x0000;: L' o: \$ S* F+ Z$ z; \( w
INTC_INTMUX1 = 0x3d;! v& @" n/ D8 j! ~+ X- E# D0 [! ]! U9 d
ISTP = (unsigned int)vectors;; k9 \6 h$ \6 j1 N
ICR = 0xFFF0;
, G7 V& x5 q: q/ G1 n9 n, O3 B6 S" ~ IER |= 0x12;
, a9 I/ r: Q; w; i4 n CSR |= 0x01;
) U. L7 t* y" V/ f! |% D. L$ d
7 ^, |/ W4 z/ v" z1 {, n( v6 A, J/ X3 C
& b$ f3 s7 s& A- m: s" w
还有就是两个输入输出函数:; o- E; R) O+ C- M6 K/ |
void output_sample(Int32 out_data)% Q& l3 e2 e- o/ e5 S- h$ B% y
{ f& c% d& J! N3 s e9 G; |( I
AIC31_data.uint = out_data;
; m% S1 _4 P9 ]/ m8 |' J) @1 W MCASP1_XBUF5_32BIT = AIC31_data.uint;3 l: Y, J3 {* u: @3 p! H: o* t
}
1 e+ ^) ?. O9 J3 z$ ]9 c% d- o( f2 o" `, q8 f; ^% G7 {& s
Int32 input_sample(void)& {7 v3 z& I$ b9 W4 ]) m
{ - o9 v8 I, h9 {- {
AIC31_data.uint = MCASP1_RBUF0_32BIT; j! k% P+ q1 m3 X% P1 }
return (AIC31_data.uint);, `/ c$ c! y+ M7 f" U* F* }
}* T, |3 v( P+ ]# Y, [1 d6 o
. H8 e* Y' ^0 t, L/ L3 J
|
|