|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
/ G/ Z6 J0 e6 v% r$ Mmain文件:
8 k3 @: A& u& O0 h0 ninterrupt void interrupt4(void) 5 L1 D T- w- R: z. o9 m
{
. `4 U, `$ N( w# g2 v' ]$ Q Uint32 sample;7 _3 ?) w6 N* s6 c
3 L3 i+ k. I$ Y
sample = input_sample(); // read L + R samples from ADC6 p. K+ A( k7 H j
output_sample(sample); // write L + R samples to DAC ' R. r; C0 n( d" D. I2 K
return;$ S" H# ~" i# Y( j( E5 j+ L# Z
}
6 l- B4 N1 o3 L/ K
4 X5 Q& @9 m9 D9 X3 [int main( void )
/ i0 W8 ~: t) E1 \{( x [5 T* q3 Q8 Q+ s( f. ?# s
) L6 t* ]2 M/ C1 t0 B9 F& A5 Y /* Initialize BSL */( S! U6 j2 H( Y$ a q8 ~
EVMC6747_init( );) r9 ?+ I3 v7 t# c$ i4 t8 c
/* Call evmc6747_intr function */
3 M; c- O. W4 X' L* c1 c aic3106_init( );' D" T: I& K: A: n/ Z5 l
while(1);
8 O% P3 o% u# n" f/ b* T1 P}
9 H( S. w; o/ p: t$ y& D" s4 ?/ J, ]; f: n2 ^% l e& d
, L4 R% y5 z$ E) }# n$ Qaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
( v8 H9 B# \6 Y. w+ [# R* c/* Initialize MCASP1 */) Q. H$ |, x- c) [! e
mcasp = &MCASP_MODULE_1;# @$ `9 ~4 ]* y5 y1 h
mcasp->regs->GBLCTL = 0; // Reset3 ^! ~9 U0 F7 a6 b, i; T
mcasp->regs->RGBLCTL = 0; // Reset RX4 g( v% A" r' a$ u, P
mcasp->regs->XGBLCTL = 0; // Reset TX ]! P' E' X7 ?7 s6 G, e
mcasp->regs->PWRDEMU = 1; // Free-running
0 z K5 q- j9 `2 w1 [ // configure McASP0 receive registers
( }6 f6 V2 }+ y, h; u1 H* |3 n; T# U mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used6 t/ G& s2 F% ]- V4 R
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, F9 ~+ s6 O4 M; l mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word1 f% `: ]% Y: Z- _* }7 q
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ f# D9 g8 q! E7 j t; m mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; ^* E7 e) [& V- z1 f+ D8 S8 H( { mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ i; W' D: s: v; S6 e, j mcasp->regs->RINTCTL = 0x00000000; // Not used# W. J+ o/ H0 h% P8 _# b
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 ~8 I. T: ?5 x y1 ?. |
3 F0 G; N& q5 |# h; P9 d m; z9 U mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
, K+ m. d% R E% F+ f2 T) G mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ D/ `8 u4 r7 E& x& ?& Q6 j0 c, B mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 s( V. S) d2 q) y
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 [6 H. E$ q4 i: b( u
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK+ q. ]% M& E" Y
mcasp->regs->XTDM = 0x00000003; // Slots 0,12 f, V3 k: w Z5 E5 G, v' v
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit! o2 d: m0 o- Y6 F0 t0 V( N
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 l6 K; a8 @ N; W, w
5 x+ Y+ a6 N' N) l1 U6 x: G
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
" D M4 D% F7 G, p7 |; }9 G mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 i! P3 l) Z2 m8 J) ~: D mcasp->regs->PFUNC = 0; // All MCASPs
/ v( Q" V: X/ q/ {8 j' o" L mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 n' n% A3 v% T! S& G% X
- z. g; h) x* J& t mcasp->regs->DITCTL = 0x00000000; // Not used5 e P1 G) X( u) ^6 U
mcasp->regs->DLBCTL = 0x00000000; // Not used2 s8 i! d6 u9 a
mcasp->regs->AMUTE = 0x00000000; // Not used
+ u8 Z5 T- M( _& d6 B5 R: s# z& r( J+ F# P. `- M% E1 L
/* Starting sections of the McASP*/& D( m& b% \4 O) _; [# U3 }; t( S
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 5 T' ?6 m* h1 `" Y/ [- v+ q. e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
, ]- W7 @; E4 N* _ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' G. z# s9 e5 b/ q7 D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& A5 T* |$ ?' K+ ]( B7 @$ G3 [, u1 K8 I8 _" l% W# B4 v2 ~' y/ z
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& e6 T% k0 J+ I$ a2 n% z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 f( X6 Y9 y/ A2 G0 a
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
6 T6 l( m6 S! h0 h while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 |% \8 Y1 N# p- o) h! i! H. I8 s, a1 ^" N+ w& G4 W9 n
mcasp->regs->XSTAT = 0x0000ffff; 5 P1 t; O% }1 ^+ p& U7 n0 }0 c
mcasp->regs->RSTAT = 0x0000ffff;
2 W9 y: Q3 p- V8 @% w/ O( T4 Z" V1 @0 W- v
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;' A7 ]7 a8 {+ E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 t9 \) K7 D5 U& L/ ?7 R0 _2 G mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 6 n! i/ [7 s0 [1 F& A' @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 K8 K# u- l2 K; I% W
2 O/ P" k& h O# N+ U /* Write a 0, so that no underrun occurs after releasing the state machine */
[. H( {/ r& ?, x mcasp->regs->XBUF5 = 0;2 y- V2 e5 k( |+ J$ d) @; }
mcasp->regs->RBUF0 = 0;0 K" c% S f5 }- Y
/ `9 s" f9 o% E8 C; ] mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; . n: u+ Z" p v+ Y8 x9 x6 m+ p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );" k; m& h* o8 r1 {% |
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% `% o( H3 x; `+ Z$ c2 L1 t while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
" g: R7 E7 l! a4 B- Q; c) Q9 C% q! l/ Z5 ?, T
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # v! h: p: M! x0 d5 }' l/ e2 p: Z6 s, X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );7 t7 P4 w" D# N: _" z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! ^% @' D, n/ I$ N9 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% c/ o/ \! \4 ]6 n, \
X/ V7 q2 P c* p
CSR = 0x0000;: F9 f+ S, n1 l4 J4 S
INTC_INTMUX1 = 0x3d;
( v' e+ Y$ a* T3 c1 K, T ISTP = (unsigned int)vectors;& n7 ?7 d4 z. m* s8 V
ICR = 0xFFF0; - Y4 G d4 e% u3 A7 c- u$ d
IER |= 0x12; 1 x! J6 {9 q2 R! v$ H6 _
CSR |= 0x01; & Z2 m: I% Q: ]; `$ L
! d+ v2 p& z9 S+ `, E7 Z
9 ^$ T$ y) b) J8 o8 ?6 O7 E+ u- K- Q$ m2 t1 n% A
还有就是两个输入输出函数:
) `# o: x& z: Rvoid output_sample(Int32 out_data)3 v# Q7 \! z* B$ j( j. Z1 P
{
1 N6 _* p# z( _1 n) I AIC31_data.uint = out_data;
5 \1 a/ e- Z% G2 n1 K MCASP1_XBUF5_32BIT = AIC31_data.uint;
" ? [% b; c) I- Y/ \9 P}
8 y$ l+ y2 u( q4 a8 F1 `, F8 p
2 D) |4 K) A- m& U6 jInt32 input_sample(void)
5 @5 l9 v7 N& [$ j* N{ " ?$ y1 x, P Q6 k
AIC31_data.uint = MCASP1_RBUF0_32BIT;
. B H& @) L6 P7 I return (AIC31_data.uint);/ Y# c4 G# |! A! ~/ v6 r* O! i8 d
}) Y3 `- t# A! D3 b
& ]9 T$ m2 Z0 b9 Y |
|