|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 L5 U& T2 U+ R9 h! Vmain文件:
) |2 J- ^ ^: Q& Z+ v9 `8 r/ v. R Jinterrupt void interrupt4(void) 8 @8 ]$ @7 e: S. ?- P% \
{& F/ s- U7 ]6 D L+ ~ y6 o2 ^" O
Uint32 sample;$ Q6 @6 |0 r' F) L; e, Z. u7 c% ?
1 g. d7 u1 F `7 o! c# d1 {
sample = input_sample(); // read L + R samples from ADC
9 F4 E( r/ ^; `6 W( h1 N! i output_sample(sample); // write L + R samples to DAC
' R% p( D7 \0 W return;5 t+ K& \5 I1 y, M
}3 R6 d W" ^9 g
0 `4 ^ a% F: Y( W8 O+ ~( s
int main( void )
3 e1 ^$ c2 k9 X2 j5 i, O8 J! _{
7 M. `' M# \" F X
# h/ i" K! ]3 ^% Q2 H /* Initialize BSL */& x/ F ]4 e2 u5 S8 p6 R9 P
EVMC6747_init( );% A$ Q* U( d5 d1 V
/* Call evmc6747_intr function */. i1 U2 y2 x% t+ v2 L, } Y
aic3106_init( );! U& N! y/ l! B; r, e0 V
while(1);$ t4 u/ Y- t% @* m
}
( B4 p) s2 E# j/ O0 Y4 h! K) b) y+ K: ?+ ~$ G8 h
+ x# o% g$ ?( ?' o; Oaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题5 R2 s8 n. q H' H
/* Initialize MCASP1 */
" ^& {, p0 C6 @, c% G mcasp = &MCASP_MODULE_1;
5 z# ]# t |; i) e# G' ^ mcasp->regs->GBLCTL = 0; // Reset
% H% L' z8 ?. F. F0 W mcasp->regs->RGBLCTL = 0; // Reset RX+ U5 J1 q4 V6 D2 y* ~% Y
mcasp->regs->XGBLCTL = 0; // Reset TX
9 C J# J( R0 S8 Q: I0 O) ] mcasp->regs->PWRDEMU = 1; // Free-running
- S% T4 \9 g$ W6 ^& i) j2 t // configure McASP0 receive registers6 q6 M# h6 W8 R" ~+ ~' B+ R' _. U/ m. m
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
; J2 C. I. a5 a6 G mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. [/ F- X+ V9 V
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
3 B) ^! k* [1 d5 o/ `1 h mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)4 `' m& D1 x4 r U
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 S/ y, @3 y. f; R) d8 X mcasp->regs->RTDM = 0x00000003; // Slots 0,1 u3 A1 r' p9 c1 _/ x
mcasp->regs->RINTCTL = 0x00000000; // Not used7 J7 ?# X# L1 H9 c. p) p: `" w5 Q
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 k* Z+ J. J9 Y N3 V( @4 g5 ?8 J- z/ j5 z, k
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( B' {; s* D2 u0 B8 w5 |. ^ mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 ?5 W r: u! |# ^7 U5 w }: p: t9 @5 d mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ \; R) W) w% d" \' E) F( z8 M
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
% ~5 Q4 p6 ?) c" v mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK, T; o# |7 T! j5 Y. f9 A. L
mcasp->regs->XTDM = 0x00000003; // Slots 0,14 g: T2 @9 t! g6 J, v H- ~
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. X! Q# Y- e( A0 R' r mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 t) k$ E- t8 X$ K; [% T* J
0 }1 ]! G4 N- B mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 E! u" T* e9 N+ K: X3 ~0 |( b0 E mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
- ]- S+ \& c/ @& J2 A* o mcasp->regs->PFUNC = 0; // All MCASPs
, m7 ]3 q; r9 X) E, n( p mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! ^( X8 F# F8 T9 p u6 [) _8 M
5 h9 F+ Q2 G2 k mcasp->regs->DITCTL = 0x00000000; // Not used3 {4 V8 @7 r$ g# I+ z& L: @6 n
mcasp->regs->DLBCTL = 0x00000000; // Not used
! L& B& a% r( [, }) B mcasp->regs->AMUTE = 0x00000000; // Not used! C$ y, F# O6 K. r$ u( G' |
: M$ j9 D: m3 d% @6 C& v, n. j7 G% h/* Starting sections of the McASP*/
; ]3 A7 f1 I# X( r { mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 3 c5 V! V l2 {. U8 G [% B8 M. G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 4 b4 G4 }' V( w1 n% h3 K( q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 V) |$ v8 t) G7 ]4 c/ G; r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 j* [& \/ E( u( f3 i" s/ t6 M" n, ~5 O- c& J* l' x
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 G7 z& C$ N P3 e! k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );( C+ K5 c& @* H% p
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ B4 g3 t) }% ~8 T1 m& \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 S5 n6 q5 J4 I
1 K1 N/ _- d- k* r7 [& _3 ` ] mcasp->regs->XSTAT = 0x0000ffff; % t/ @! h2 g- Z' ~2 n' R
mcasp->regs->RSTAT = 0x0000ffff; # A/ k. H; p" Q0 _. K/ I) o
- x: A2 L- S% A( G+ ~( A9 p8 v
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- A( i' m8 i# ?5 q# p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 `/ [, R' _5 b6 i. Z/ X. B1 @
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 b, r2 ?2 X1 x" C while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% }& w& L- K" y0 ?- J
' y6 [; P$ W3 N" P$ M, n7 y _! N9 \- v /* Write a 0, so that no underrun occurs after releasing the state machine */
8 x" r1 U' {9 ] mcasp->regs->XBUF5 = 0;
+ @4 p) e+ ^- u' H7 ` mcasp->regs->RBUF0 = 0;
0 n/ y& @& L6 Z% I2 F
& q7 u( S' `0 G4 p* s" e* | mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; , }' Z& g! [+ i' @2 ~6 S& g( ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 l# B, X/ ^8 {* g mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ! U! f$ G8 [2 f2 ?3 f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 T/ r8 S' Z' W) r) r
7 j- [; ]9 z+ \
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 2 g0 x4 m1 Y2 ^* g/ o' ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ o _% c7 U/ g# j7 Y1 n" ^ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
4 z- b7 {- B( Q% B+ ~! Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );3 a$ [4 t0 @6 k/ t3 p8 E1 `' Q
( j. l( Y8 `" ?0 W* @2 P CSR = 0x0000;
% I" t4 h" M$ l d; t. H3 B INTC_INTMUX1 = 0x3d;
" S |% v# r; S7 B ISTP = (unsigned int)vectors;6 C" v; j9 F7 Q& r& @* k ^% @
ICR = 0xFFF0; / x6 U" W7 ~9 l$ {! d4 |+ q- u$ O7 U
IER |= 0x12;
2 }3 O9 O$ K0 f9 b& }. _ CSR |= 0x01;
' [: `) K* T, Y1 h( P" m8 X/ g5 ], V* b; {; o3 M; X/ ~/ Z/ ]
/ i0 v W8 a2 u% l+ }+ C
& D5 ^* }- [/ v1 P* k2 D
还有就是两个输入输出函数:6 h0 f& K2 v8 j6 F; ^; J$ i/ p
void output_sample(Int32 out_data)
+ S" E* ~& x% ^6 {4 J{7 \( U1 g* _: T$ F
AIC31_data.uint = out_data;
9 u7 B1 N; U# U" s& N m1 w* o MCASP1_XBUF5_32BIT = AIC31_data.uint;( ?! `) N: E: B0 L* L
} G: M) q2 e/ `1 p1 R
2 B: d8 p6 ^3 ~3 d" v
Int32 input_sample(void)9 W/ r! U& Z6 k7 f3 Z- y
{
8 [% m5 P; S2 {' {0 e AIC31_data.uint = MCASP1_RBUF0_32BIT;
& X" c4 v: e* n* g return (AIC31_data.uint);
. z, Y/ }. W/ M, M7 C l1 e4 i. \}
2 n# M0 P I8 c# x5 U. p, K1 F( K- q$ k0 L7 ^6 J
|
|