|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* Q2 T9 d q: q7 Omain文件:
& o. B+ d) z! `4 ^interrupt void interrupt4(void)
# t. t% O& Z2 I- w' r{
/ ]# Z) m& ]5 E' S# }2 Y3 I$ z9 x Uint32 sample;+ k2 y+ N$ B3 [/ q& L
8 ~, M5 D* y' w3 P5 R+ V% Z
sample = input_sample(); // read L + R samples from ADC
2 y/ P9 b6 p# T/ Z& p output_sample(sample); // write L + R samples to DAC
a& p" p/ v- M4 q return;- j- j9 H# J# e% _6 x7 f
}
# [! z+ S% H7 i) O$ V; z5 c9 Q: b# h
int main( void )$ z t3 u! S6 H0 D
{
4 J ]& D9 S9 A* d2 v/ d9 _* l) |! w+ T7 E: k" \
/* Initialize BSL */
/ ~) S0 ^" V' ^" d9 Z EVMC6747_init( );3 q( A( p$ `: J% T
/* Call evmc6747_intr function */
6 K% R3 V5 _9 \! O; w/ [ aic3106_init( );
. Y) p) i/ T) d Z$ C; r while(1);
" {" M5 _# f" u}
, x( F" S% |% h
; M: f( g) s3 c: W* k/ Y- Y: ?/ j( Q" g: q* _2 t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题& p$ [& f( Y6 n: c8 s; b
/* Initialize MCASP1 */
! p# F1 _" Z. G u D& u6 W mcasp = &MCASP_MODULE_1;) w6 R, A: D9 U; g+ C- H& q) o/ d# J
mcasp->regs->GBLCTL = 0; // Reset
# I( P. h* E5 a& i$ Z \1 ]8 q' R6 | mcasp->regs->RGBLCTL = 0; // Reset RX
, ]- p. n8 l, m: g" y! B- H3 j" S mcasp->regs->XGBLCTL = 0; // Reset TX
5 U2 R" J" u: | mcasp->regs->PWRDEMU = 1; // Free-running
9 o( m% Z/ l2 X/ v // configure McASP0 receive registers$ y7 j( |+ }: F5 B/ ^$ ?. o! i/ @
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
* l% a- X8 Y7 R. E1 E mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# b- z* X% W) L2 [, I
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word+ f. E: ]! O, d
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
2 h7 j$ h' X! o/ k mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 D& E1 c' L& W mcasp->regs->RTDM = 0x00000003; // Slots 0,1
/ H$ ]7 A6 x) g3 h: v, g' `: n6 p mcasp->regs->RINTCTL = 0x00000000; // Not used: i/ T+ x! i9 ]8 H; d& Z+ t- [/ w, Z
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; N) X& J% b9 z- M* q, g4 O8 _" L: n9 y$ j1 H9 ?6 d6 p. c$ J
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used# P! N& X7 v8 I: d
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 L; \ \, o3 H6 \9 o/ n mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ R# Q: m3 k! B/ G
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: [( _" Y- d' a" _* i mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK9 e3 O1 q- L' x& [! W5 \- x0 a6 r
mcasp->regs->XTDM = 0x00000003; // Slots 0,1! x( V, M) O% i" `
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit0 A, h* O0 z% d
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; Y; S! D4 r" ]: N# O2 s1 G4 t
U. m7 b2 G4 A8 b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN) {3 w; G: ?) ^7 P5 o: O- J
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT. P$ U3 e5 d% B+ g
mcasp->regs->PFUNC = 0; // All MCASPs
' ~4 V6 b1 Z7 s1 p( z* a) } mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 q8 n& |* s4 ?; R A7 }
% i- I4 G2 I5 r# S1 {2 X* m mcasp->regs->DITCTL = 0x00000000; // Not used" ]$ |7 a) V; m7 G }& L: [; {
mcasp->regs->DLBCTL = 0x00000000; // Not used. n4 Y9 w; {& ?9 _9 k
mcasp->regs->AMUTE = 0x00000000; // Not used' Y# H0 [ ?; I/ C* T$ D. o$ U
" q% u8 w# g8 D7 f9 A; Y& I: x
/* Starting sections of the McASP*/6 l5 h1 D9 I6 n$ S
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" M; z, @6 L' A C. b7 { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ U0 B, j4 N) M$ ^ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; , [7 f; J6 D; V: v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ [/ @' H+ [; E; a( ]
6 v# v, x8 ~( U" |8 }# W mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # F7 y9 ?( J/ _1 c! L4 q5 `7 f8 N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 j0 B6 n# D8 H& `' y# e4 i' D mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 q" o2 l5 l& H+ N) _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! D" B0 G9 |7 N; Q% S5 ]. i2 u8 t9 p# ~, F
mcasp->regs->XSTAT = 0x0000ffff; ' j5 {2 X' [$ c% k: q
mcasp->regs->RSTAT = 0x0000ffff; 2 |/ m* W1 K8 K2 ?" {. J
: B* I, J s2 z6 J: i* s6 K mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;: C( \7 a8 ^+ j$ s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );" O7 N! o3 t! S* [! o) D, Z
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- n6 I# u6 Q+ l; X+ G: t- V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- A b) b2 g/ ?. G# @ h& {/ b. @! m) Z) W! L
/* Write a 0, so that no underrun occurs after releasing the state machine */0 x/ ^/ O3 `$ W+ x: g( y
mcasp->regs->XBUF5 = 0;
: U: b1 D* E* R+ C mcasp->regs->RBUF0 = 0;+ G: R0 G$ t; r; t/ g7 ]7 E
. Z/ ~' b5 f, m% l
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! u& ^: n" o: l while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" \' c- T% C( Y: j; `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
" O. f* X' Z t) a5 Y9 T" { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 R! I" C5 ^; [$ j0 U4 F: b
# Q) k7 I; ` s/ G3 q& o& J# B
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ! X/ q" ~- j5 N i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 o, L* \' p. U- X% z+ E( O* H; |# x mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# @) x& H3 s& n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 Q7 A( P# L6 A+ M- z
: D* G, J* P# A: ?+ [ CSR = 0x0000;
R5 t7 z' Z( @; J8 I& l INTC_INTMUX1 = 0x3d;
1 D9 o# {7 q' ]4 J# c8 ^9 P M7 P ISTP = (unsigned int)vectors;
+ v4 @* r' h: S) ~4 S2 R ICR = 0xFFF0;
/ p3 r* k) L4 Y3 J3 f$ ]8 B IER |= 0x12; 1 H/ D) F. ~' C8 E
CSR |= 0x01;
& O" F2 w8 ^; G x, B; q' l, |8 j" r% z3 @- X/ \
" q5 z; T r; R7 [ m
/ ~, z( r0 r4 G还有就是两个输入输出函数:
3 P; F; N& L1 w" [void output_sample(Int32 out_data)
& t3 j; {9 g( X{
8 O ?1 w% E+ P1 R3 \ AIC31_data.uint = out_data; 4 @; t' ^4 [+ c8 D7 P: t; _
MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 x( S5 X$ p, W6 ~}
. `8 j% j v$ |# C9 n W+ D7 C
B8 ^3 k% h, x. N. g, xInt32 input_sample(void)
0 k$ s& b8 q( U7 z* K7 v5 d4 ]; c4 ~{ - U4 ?6 o$ `7 _( W
AIC31_data.uint = MCASP1_RBUF0_32BIT;, K8 E5 {8 b4 o3 w/ m2 @
return (AIC31_data.uint);
7 ^/ F; `( ?8 }* j}! q' W8 A9 M; M* L) i0 H: A% R; q
g/ a0 C# R# [+ v7 s* t |
|