|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:; v# |+ c9 A' S: r% @
main文件:
; J& C# g3 T: k, d$ rinterrupt void interrupt4(void)
- x4 M, a' z/ {# g5 Y{/ y3 G7 G5 R0 H0 `3 `
Uint32 sample;
$ D' B8 Y& y* Y. h: q. U
* k% C* E9 P& u$ ^) k r9 v4 w7 l sample = input_sample(); // read L + R samples from ADC$ X3 d- w% ?, { s
output_sample(sample); // write L + R samples to DAC
3 c1 k- r7 L, \9 [7 m$ L1 \ return;
, h. G) @* a6 w; h( |5 q}
! H; y6 `: B) ]# k. m8 U* N |' m' o
int main( void )
* X5 g7 [3 k8 u" p/ w: @{. q2 c* f: X3 I% Y
% f/ V1 I) Y/ j. V5 Q1 L* w
/* Initialize BSL */
7 d) k9 a' S; b5 C" r9 ~; _& k EVMC6747_init( );& \$ | I( _+ ~. l+ q+ F- M1 y
/* Call evmc6747_intr function */" G; \! g/ }7 E) V2 Z5 P
aic3106_init( );
( \' o8 Y- U) ]- o' u while(1);
" w0 y3 s7 C+ C( m7 h}8 ?1 b* t) Z; c
( \: V' Z3 i" r3 Y/ O% B' V" M ]; [) r( b- I7 u+ P" C
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 @9 H' h" ^2 v/* Initialize MCASP1 */2 l2 f }# x1 W6 G* M) B; N
mcasp = &MCASP_MODULE_1;; y# K# C+ I4 ~9 k
mcasp->regs->GBLCTL = 0; // Reset
. g7 g; t8 O' P" {, S! ^6 M mcasp->regs->RGBLCTL = 0; // Reset RX a% d$ ]& B; l3 M! o) [1 J; {
mcasp->regs->XGBLCTL = 0; // Reset TX
# t4 ?" N6 v8 t4 G9 f7 C* \6 ` mcasp->regs->PWRDEMU = 1; // Free-running3 u9 Y9 U+ d! ~1 }3 ^& D/ ^
// configure McASP0 receive registers0 w* T& _/ S2 e" s( X
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used0 m% y8 q: Q0 D/ A& M4 I& w
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, m9 x7 \7 \/ Z, y& h& c5 U mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word( M0 \: R9 h8 o. W2 I* S- b
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 b( ^1 d) r; q3 V6 e; I mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)( g- K( L" S+ p' t3 \
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: q# [, a1 Z0 C6 X$ ] mcasp->regs->RINTCTL = 0x00000000; // Not used
( Y1 A' [! `% x; x mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! c3 e/ c; I% A6 L! K/ b! O" p$ n0 T7 S4 [
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used+ o9 O: V8 U' A$ P; u
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! h( L. |- l; \+ [4 \ M ` mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ A1 c! H$ r; r* R) L
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-162 V% @0 Y5 U3 C2 O0 K7 g
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK0 n! b% @2 x+ t- h5 ~
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) ]2 h" ]4 N7 d4 ]/ x- O mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. C: O2 m5 ]' d% E* M mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( I4 M: e) A1 ?' N7 j6 o
# l m1 o" u! |( M, S mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN& F- ]" ~% O+ v- `$ F# C
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 X0 o" k& H# c5 g) j mcasp->regs->PFUNC = 0; // All MCASPs0 b& r! I, `2 N, w
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ T; O" G1 x0 u) J: k; N% a& C! F, p, `# @; f) j
mcasp->regs->DITCTL = 0x00000000; // Not used
h% A# Q+ S& Z, v f: S mcasp->regs->DLBCTL = 0x00000000; // Not used, Q& r- f7 D# K4 N: `
mcasp->regs->AMUTE = 0x00000000; // Not used k# F% d1 x4 t: w" P
& S4 v% O6 { j, u1 w1 }/* Starting sections of the McASP*/9 Z; W0 J% M/ z) {7 `
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ( z4 t. T+ Y4 { f: a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 7 | P3 Q. Q) K: e
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * S( O1 B& k, r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ v/ \% E0 L; X2 e$ q- h* Q- g5 T5 x5 z5 ~; r" H6 Q
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % I, j9 g8 [. j+ g( d" h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );$ h! S% M2 d- T n. Q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 Q6 ~, R8 \* m1 E/ l/ [ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );( p+ `( N* b5 v5 b
0 M$ u7 ?: u( i G. Z2 P mcasp->regs->XSTAT = 0x0000ffff;
4 Y8 d) N! l2 I7 ~- Q7 P mcasp->regs->RSTAT = 0x0000ffff; 9 x! l6 U* ^ r
1 |" E' P! d! i$ R; `& N+ Y* q mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;/ r3 I3 P9 V3 u m( a0 O- _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- ]5 V) N. @! k; C2 ]3 S+ n# x
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; - l! p5 m, R' @6 c; W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );5 u+ ]" i: K# `) q3 T
; C) i) p$ h( U2 o/ r
/* Write a 0, so that no underrun occurs after releasing the state machine */
) c3 O1 j! ~" ?) l! w$ _1 [& K! O& _ mcasp->regs->XBUF5 = 0;
0 ?! P( {# w( Q) o4 B$ T% _3 I mcasp->regs->RBUF0 = 0;( a7 i3 M2 b8 M, S0 h& H7 n, y
( U) o; c" P* {8 g8 D6 ], D
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 3 f5 {% P& W& I. A% W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* D# U/ b1 C. k0 p8 D mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
. p: K5 W W! R/ Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );: r7 H6 K9 _: [' U/ k$ q
8 \- U6 d/ q4 Q1 @ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# t" }, f9 s1 z4 a2 u6 M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 u9 N/ ~8 r' t5 ` R5 r5 m" @ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' c+ A, M& C2 c4 J K. ]0 B while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );/ n3 Y3 I! n6 m. q1 b, R% s
+ w9 |9 O6 {7 o CSR = 0x0000;
" {; Q0 ]. L: u8 q [ INTC_INTMUX1 = 0x3d;
2 Y7 d" n* r' X7 r7 M ISTP = (unsigned int)vectors;# d6 |# ^5 b P$ K5 c
ICR = 0xFFF0; - Y, o* }7 J" J: z* {! w2 _
IER |= 0x12; # o- v' N, n. z0 T
CSR |= 0x01;
4 v& a& l: V$ c: e; l' o: _8 X6 Z/ { V. A
( O) k5 [2 G8 \8 ?% `: j0 p/ a1 V) b9 w/ j: P% L! r
还有就是两个输入输出函数:: X8 q0 J5 u+ H% P" D: V
void output_sample(Int32 out_data)6 W2 s3 O' X0 N, H! W/ g. h# F
{1 n0 k3 K$ E8 k$ O8 _
AIC31_data.uint = out_data;
) b' y# N% ]: v; h MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 q1 |: Z S& Q$ A; b}
+ ?) `9 M9 ?) Y0 } B: \* b. T' Q0 Y% z: \ p- O8 W3 ]5 E; Q3 O+ t
Int32 input_sample(void)
% T3 }& l7 \# j3 A7 t% O{ 2 d6 U8 k5 @! x; N l% g0 c
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ A. F/ I! Q" y2 J return (AIC31_data.uint);8 z7 c# F2 m4 k7 `- g
}
8 `7 ~' U1 |! e, T4 X/ u: r
6 ~3 T, e) I X' i |
|