|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:! d+ y, s/ d: C9 I O
main文件:
! @' m, U7 }7 [) J% vinterrupt void interrupt4(void) ; m/ k- A1 B6 L! v8 t
{
! Q U8 A9 V" X* d" J. {' P" _ Uint32 sample;0 q! l/ B% k% y% ]& G, d M
. P+ O( P" b- ~9 b2 d9 Z1 @ sample = input_sample(); // read L + R samples from ADC
9 \. w7 B6 w7 v/ C7 X2 { output_sample(sample); // write L + R samples to DAC
( e+ n; t; h% E# i' f; M2 W+ T1 O return;
6 R% B: X( C [8 Q' \6 n}
. W6 H3 ^: B4 d, B
) @2 \; q) _* ]$ y5 g9 }% oint main( void )
# K; z) p, k# u/ M! K{
7 D0 A8 f) D% o: m/ P/ }. e8 f9 Y" N# ]
/* Initialize BSL */
4 g+ i* @1 B0 v: `! T# J0 d# t" e EVMC6747_init( );+ O" `/ E8 I, x5 J& f2 y
/* Call evmc6747_intr function */
h0 }# i7 \- `" k5 A, b: T5 ^ aic3106_init( );
/ D. J% h3 v5 m6 z while(1);
' j$ f) G! Y K4 C5 {/ C}
[( q) s0 B5 G- ]7 m5 m: I+ A+ t1 d* _2 L& d
8 v4 H; R6 H$ f9 a; I0 p2 [
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 ?2 a6 H8 M$ c7 Y2 n' I. [
/* Initialize MCASP1 */3 Q; Z0 I: d$ a3 n f/ `
mcasp = &MCASP_MODULE_1;
2 P$ E4 X/ w6 T( z1 U, ^! {/ P9 F+ l. ~ mcasp->regs->GBLCTL = 0; // Reset4 g: |% L4 W" |* @' m7 t
mcasp->regs->RGBLCTL = 0; // Reset RX" P% w5 R! S+ m! g$ `" i2 b7 p
mcasp->regs->XGBLCTL = 0; // Reset TX( @$ W6 V- |" E+ u" [4 b6 T
mcasp->regs->PWRDEMU = 1; // Free-running
) e! e) D. n) d- o // configure McASP0 receive registers
( Y! D! d1 t" ?! S9 N" N( { mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
) u8 ?# ]5 N- D7 I mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 ^: k8 a6 E/ t# x( e# \ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word4 f2 O; e' h n# `5 n ?
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 q/ X3 n& T* m+ [8 I1 E+ }3 ?0 Q
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
I( n% P2 P, C6 s mcasp->regs->RTDM = 0x00000003; // Slots 0,1( H j; `" S/ a+ [$ R$ Q Q9 |3 {
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 k" g1 k( e! ~- f mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" W; h( h! w' D% p2 o
. X2 q: ` [. ^% U3 N mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used* l. F% J) g' u5 B5 z
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 C9 q$ b+ _* g( ^/ T Q" X mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
0 h2 B8 y* H- H+ a7 V2 Z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& B# R0 j* j- h: e0 `2 o& Y2 y; J! x
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
5 [0 u8 i- Y/ L1 N$ H* J" L mcasp->regs->XTDM = 0x00000003; // Slots 0,1( m- B% d7 I* p8 ~
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit: O3 o4 @) x) S1 X+ `( i: F* k
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 J" L( K3 ?/ m3 i8 }
t; p% Y3 a5 n7 r
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
# O) @! _2 s" I7 W( \/ q mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
# K% @. P( D) b1 z mcasp->regs->PFUNC = 0; // All MCASPs* j6 X+ f0 j4 `: ~+ v+ {3 G2 p
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1- M5 ]; w. X2 r7 A( F( I9 h
, f2 s0 w( Z- [ M/ y
mcasp->regs->DITCTL = 0x00000000; // Not used
, @; a$ j) B5 F mcasp->regs->DLBCTL = 0x00000000; // Not used
* v: V* N0 c, ?! z8 E' e mcasp->regs->AMUTE = 0x00000000; // Not used4 U9 G; X' O& t7 i( A$ d& @ U
) Z4 k" M( o) }& V3 {# N
/* Starting sections of the McASP*/
$ x8 f1 t" f0 L& y2 e( }/ y mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& L6 Z; Y3 F2 L: v- u4 V, s8 | while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 6 s8 r: h# A+ n0 d! u( H3 F8 ~
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# c6 n) F( z1 s; I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );' g) S ?3 h% z; |
4 ]" j9 A; V# {2 ^( G; `7 v, x
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' e+ v' X+ I# g& {% B while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
1 x" @' @- k# ]( M8 w' c mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' `3 E, r& B3 a5 a1 v% l while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; Y; [0 j8 `+ X- C$ f
$ q1 y, {) I9 j: @* s( W) ~ [ mcasp->regs->XSTAT = 0x0000ffff; ! Z# e3 t" e1 O* A3 f
mcasp->regs->RSTAT = 0x0000ffff;
% M- a: f9 l. L7 M8 R# e
% l C2 u. h$ }( f# o' k8 v1 U mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' W! J1 i$ C/ @- F7 Y4 C6 l" W$ q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );6 I! v& M' n; H5 O
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# F/ H& y1 {# w& e# t while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 o* u* I; _. f& J L6 ^
8 V% T" }) J! e8 ]' {/ `+ } /* Write a 0, so that no underrun occurs after releasing the state machine */
4 j0 y3 C2 e6 l mcasp->regs->XBUF5 = 0;3 U( l. }# _ ?$ \
mcasp->regs->RBUF0 = 0;' R4 S) s7 d* u0 `, @
9 ~7 k0 W' y) _% |3 u9 A6 [3 i
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
( f9 c( |3 e: O$ ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON ); `- ^! `' {6 L1 c' j
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 9 d+ y4 E& y D9 o. X! Y- y6 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );) w* [$ `# C& N/ E9 |2 i: d4 w4 V
" }# @- N: `* R$ x- z mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 Y r5 b2 A9 p' ]8 q4 h2 U while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ o2 _8 Z: h3 t" Y, [ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 2 I6 h2 d8 [6 c# B: g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );/ f |: d& S% J0 i( u3 ?- Q
4 p7 C5 ?* r- I
CSR = 0x0000;
: J& ^1 `/ Z( x, ^, d INTC_INTMUX1 = 0x3d;
6 i2 y; M0 k) s- M$ I3 ^3 \ ISTP = (unsigned int)vectors;- \* s1 |8 ~, P3 q
ICR = 0xFFF0; 3 l$ i+ V) s- g' t
IER |= 0x12;
# F) P8 ?8 v8 g/ K$ [0 I8 P CSR |= 0x01;
. T$ K" i; F5 \6 D8 @* m# r% y" R( q& e% J( C! m# l* l
9 G2 P4 d. ]( ^. _, d
9 Y1 J7 S! Y; U) Y0 R5 @还有就是两个输入输出函数:
4 y3 q' k6 w! P4 q, g* L Vvoid output_sample(Int32 out_data)
6 q5 h: B( [$ J{
4 x' R- k* p3 t+ ? AIC31_data.uint = out_data;
8 B3 c* ~* B w8 G9 V1 Q MCASP1_XBUF5_32BIT = AIC31_data.uint;
R& B7 a$ D1 `' e- N. i* ~9 i}& J$ v2 F* [3 R q4 H2 r
! g c9 \* O2 u8 U0 x* v# QInt32 input_sample(void)
. l. c v( b/ i, U{
6 ^# }/ [. z) v" H9 L1 o# U AIC31_data.uint = MCASP1_RBUF0_32BIT;$ |2 @% y" I) t! P
return (AIC31_data.uint);8 G1 p% y0 M7 @# n$ q* {& x
}
9 q, ?1 D/ r! O( u# I' V8 K. }, S$ U; l. b4 X6 h4 j3 s" c
|
|