|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* Y5 `- @# p# H P8 E! nmain文件:
' ~0 j2 D3 k& x+ K' ? [interrupt void interrupt4(void) u7 o9 R! K* \
{4 N: B, u: a( J% q! K) m
Uint32 sample;
) ^) L9 O* W! @' S! v1 P; A5 E; a. p& ~2 M
sample = input_sample(); // read L + R samples from ADC
1 M' W Y5 V: g4 @$ J R3 C0 p* [ output_sample(sample); // write L + R samples to DAC + v! r! J, S: x3 h
return;6 K6 S8 y2 D' P/ C; L
}& F9 p( G, [. B) `$ x: h1 l
1 l9 D# C) Z* a
int main( void )
; ^1 Y5 g4 [7 I4 i5 \- V9 B{
/ |: s- P! R J% W6 l1 u! O* C" `; L7 _
/* Initialize BSL */( M9 E! `; l- |. t
EVMC6747_init( );, ^* O, h3 F, k9 b
/* Call evmc6747_intr function */
+ K# W3 H [( v aic3106_init( );3 X- |' [* S" y9 v( S
while(1);% u: u% @9 }+ c* F/ J. _3 q
}
_3 i* ~4 I7 f" I5 n# M. e$ Z- z6 I
0 Y5 g& m! G) x: y# C6 Jaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* m/ F3 A, b ]+ d2 z% T: U7 Y4 r0 q/* Initialize MCASP1 */0 h- @& z0 Z0 {+ \; c7 L
mcasp = &MCASP_MODULE_1;. W) T2 `/ J" @6 T6 ^
mcasp->regs->GBLCTL = 0; // Reset; s: h/ `8 V r3 o( w I+ d1 M- t
mcasp->regs->RGBLCTL = 0; // Reset RX
3 Q2 x, H0 e; u" p9 z Y mcasp->regs->XGBLCTL = 0; // Reset TX0 x6 B, G0 S7 ^9 l! g# h
mcasp->regs->PWRDEMU = 1; // Free-running
5 j# S# z2 c! U1 U0 v; \7 j( r // configure McASP0 receive registers
3 F& ?# W0 ?' L6 I1 I mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* n$ O* O1 _8 D
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! ] r# N4 M5 u# y R
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word: c' Z& ?6 d6 B1 y( v5 E, o" R% `
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)9 ^% A+ Z; |" Q3 Q% v7 J
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
& g# N' @2 v' Q* G" ] mcasp->regs->RTDM = 0x00000003; // Slots 0,11 J* P, ^$ e0 M% y
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 u# E3 v) ~# P$ ~ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( l1 |/ j! S' O9 u: D
# M7 B; }! D5 q4 Z: p% l7 ?, o mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
, {7 \5 T; S5 m* j6 R: M# u mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# D! l( d. b8 _! |; ? mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word6 _3 A; \6 v g' F- N) ?, f( e
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 E$ L6 N7 e$ @) Y* Y mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK5 M' u$ r9 |6 D; Q& t
mcasp->regs->XTDM = 0x00000003; // Slots 0,1- {4 H/ f- }& k1 M2 J7 }
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 G T. k# [$ P- A mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: ?5 u& t. E! A& J4 F0 d* E5 p+ k1 a2 E
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN7 E! `- q1 W1 O A! n7 @5 T
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 P4 H! u$ ] K$ R5 i! a mcasp->regs->PFUNC = 0; // All MCASPs* O7 p S8 {+ C( V! K# \
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& F. P; e6 q- C7 i5 r9 _1 K- D B
" j+ u; d% A% d- E9 X& w& I R+ d mcasp->regs->DITCTL = 0x00000000; // Not used; W7 h% s, e# R+ _, w2 \/ Y
mcasp->regs->DLBCTL = 0x00000000; // Not used
) F! x2 g/ K/ F! D- m. T mcasp->regs->AMUTE = 0x00000000; // Not used# {$ o: j' e+ |7 r9 B- j5 ~
* N7 v1 y4 Q1 R* V/* Starting sections of the McASP*// e( S8 r* S' e9 z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; E+ z$ M- x: U c! Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
8 I5 t$ n% b+ p1 b mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; , o$ a% [2 S2 u5 E8 | v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
q V' n4 A# U( y$ D, A% s. E2 S' R5 b7 {* l- {" }' F
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 H; y9 w8 ?0 o$ |, o while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 T, u9 L" ^) P9 M% r! I, O mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
! y- |3 T5 E6 o2 l: J- ~ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 T2 I0 N+ u5 u8 D' L |2 j6 h/ u+ p. a
mcasp->regs->XSTAT = 0x0000ffff;
7 K7 S5 y2 d# c/ I mcasp->regs->RSTAT = 0x0000ffff; / \5 U9 i/ g- A2 d/ r' ], l
/ g# Y3 D3 N" B" _4 [ ?' \
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 F8 p% w3 C- t. I6 f. y while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 T, r7 [4 _. C6 v mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 T9 g9 f. R; u7 `7 e while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 x. }$ O% G# N6 ]8 S" V; [
: B& J1 J/ O2 U; T% H! g /* Write a 0, so that no underrun occurs after releasing the state machine */
7 Q6 A( r+ ~0 ]. j4 I mcasp->regs->XBUF5 = 0;
/ ~1 L, J8 E1 {5 K9 F( X, b4 I mcasp->regs->RBUF0 = 0;
% Z; h$ T; K8 l6 a o% B
+ a: x! E% ? t mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; : J0 h, g/ Q' M% ^8 z V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% U" `; O# o$ F& T
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 9 E/ M/ L. r1 n7 O# t6 v4 Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 p8 G9 v6 r r. u
1 f& e9 T% ]0 f5 _ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; + [$ U) o* I9 N% E7 [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" j1 d3 I) K$ I$ H mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
% C6 e- R* W$ C+ o6 s/ `, c! ?1 e while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 S6 Z T! o* |7 R6 C( [* w# a+ }' r/ p
CSR = 0x0000;
0 r1 y |6 l( i, P% v; I8 h INTC_INTMUX1 = 0x3d;
: i! [( [( e g: F3 H ISTP = (unsigned int)vectors;' v& J. X& W# J" u4 E0 g2 G; n4 q
ICR = 0xFFF0;
, w) y8 \) i0 X1 W4 o3 j3 c IER |= 0x12; / j0 F j! s8 e4 u( v+ s
CSR |= 0x01; 8 V; k; z# [, i' u
5 H5 c; j, W3 f$ O
7 D: O; J3 _4 N4 g
' N) P: i( \2 v* I/ x还有就是两个输入输出函数:
! R) ^- e! z7 x" Qvoid output_sample(Int32 out_data)/ J! C+ K f3 t! z' ?2 U
{: \. c5 m- H, D7 q% c
AIC31_data.uint = out_data; ' b8 E7 O1 t. Z$ q" l2 b6 ~/ {0 l
MCASP1_XBUF5_32BIT = AIC31_data.uint;& t6 c! x; t0 g3 x) b
}
) w% d1 d4 k# g- e8 X. w4 _: D/ L! z0 |/ g C- Y/ m8 z: S G% J- q
Int32 input_sample(void)
0 G' @3 R, _! e8 h5 b{ : z5 g% @& r/ K& X2 Q
AIC31_data.uint = MCASP1_RBUF0_32BIT;# v9 N2 ?! V, x
return (AIC31_data.uint);, v0 @" G' }3 a8 E% h
}
* A* f; w2 ~3 U' B5 l0 s
8 B7 r2 _" q' ^ |
|