嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! h/ D$ [$ l# b- p* S; `; [/ d
main文件:
9 f: V+ \+ Z* z! S; i- ]
interrupt void interrupt4(void)
$ I1 e! ]; w9 q' J t" P5 H& v0 O
{
% y7 u0 D1 _; I# o. M
Uint32 sample;
4 x( J* \. H6 j6 P5 n
6 |7 A1 c8 k4 V( N, m
sample = input_sample(); // read L + R samples from ADC
( e2 D" @$ l3 g+ a
output_sample(sample); // write L + R samples to DAC
# l- x7 D/ h* z$ `; d
return;
0 U1 |+ x5 c- u4 @
}
5 \# G1 l6 d7 J
# N: X9 ?4 Q0 k1 ]# { s
int main( void )
. D$ H: T0 V- t
{
$ D# S6 x+ v( \1 y! z/ h, G a4 n
* v3 g) [/ F9 L2 R0 K# d
/* Initialize BSL */
3 H# d6 @" e% G1 V, t/ N
EVMC6747_init( );
. {( L6 ]/ _+ f( F- h
/* Call evmc6747_intr function */
4 b8 r! |% e$ Z8 U9 H7 j8 m6 @. m5 e
aic3106_init( );
# p& F) [4 D( h
while(1);
4 g+ I) x- r1 Z: N" }( g0 j
}
# J) M- t) O, G& L- M8 `- X1 i
$ @4 Y4 Z" |; R
/ M, t0 T6 b0 E
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 p: t0 t7 ~: Y7 X
/* Initialize MCASP1 */
& n Q9 L$ B- A7 P
mcasp = &MCASP_MODULE_1;
q' x0 ?2 M& |& u l: q# h
mcasp->regs->GBLCTL = 0; // Reset
5 R3 R7 l% b- @: E" Q7 i% u `! L
mcasp->regs->RGBLCTL = 0; // Reset RX
# E! n6 x& f9 g" t/ q
mcasp->regs->XGBLCTL = 0; // Reset TX
, Z6 z2 J3 c9 k" O1 K5 s
mcasp->regs->PWRDEMU = 1; // Free-running
3 z/ s5 P* B! @) f" c$ j
// configure McASP0 receive registers
0 \ Q3 K4 D- j9 u3 k
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
9 P( V% ^/ @* ^
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 ~/ \" j% P: O1 s
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% V# V( ~4 Z3 K: }& V( k
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
B+ Q. C3 {; N
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( q3 r& I0 d$ Y! g8 G
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
2 h% a" B, \) Q# K
mcasp->regs->RINTCTL = 0x00000000; // Not used
0 ?6 O6 G+ n a3 Z2 G
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& p3 i& {) j, x$ B
' B5 ?! J2 H. b4 ~4 a
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ J6 D9 J& g" ^% O4 I& P
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" \0 S$ W( E, M% r, B% N( R
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
t$ t1 b3 Z) P( h3 s- ?
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
. t( `# Q ^4 F, S& q
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
! L1 \4 O" o: ~
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
% i$ D. d" i; Y- S8 s, @
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
5 g$ i$ S3 U8 |
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 M2 m! n$ e; `6 b1 A9 t% c
6 M y, S8 v+ R' }3 E
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
" q+ r& m" a4 e; ~
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 |2 Y) k# [1 q& p/ p u
mcasp->regs->PFUNC = 0; // All MCASPs
p" U8 w9 _% l2 \5 L- k) E
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" Y; b; L, C6 P# J+ O+ l) b Z
. K9 b, F5 x, M1 D' K; t
mcasp->regs->DITCTL = 0x00000000; // Not used
/ s/ [# D4 k: M$ }7 j
mcasp->regs->DLBCTL = 0x00000000; // Not used
( e% s5 D- S" w- c/ y3 R% n& ]* m
mcasp->regs->AMUTE = 0x00000000; // Not used
. g9 ^* V1 O! `# ?
1 J& _! S0 O4 B5 i) t
/* Starting sections of the McASP*/
+ [, D1 x7 K% d* E
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* h7 z" ~: k/ A, l" [6 T w' p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
1 R* n$ C5 E' m$ J6 z% X1 j; \/ E5 m
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# z1 F0 U! L( h' t* s# j: ]+ X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# _+ z' Q: [5 ]7 D0 C/ j
, }8 O7 w2 ]2 Q# b: n4 I. I; m
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 J/ m; |# T% V7 k0 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! K/ H6 y# d: m( t- B- q: x* N) X
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* t6 f: o: n/ I& f" C+ K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
L2 k4 d7 x& f7 U9 D
5 D K. l D$ {& S; S
mcasp->regs->XSTAT = 0x0000ffff;
$ j1 [# s2 e. o8 _( g; H; t
mcasp->regs->RSTAT = 0x0000ffff;
8 q6 @$ ~3 D0 Y8 |8 x1 E, P6 w" t# m
3 o- T. r( ]& R! @$ V) h; k
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! d8 y k4 f0 ~# m3 X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, s5 l6 F8 L8 Q: v2 h
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
8 a9 F4 D* {' n+ j7 V8 I! M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
4 y' {9 P7 L0 F( v8 r& U
' L+ W e1 T; a& u& v
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ A7 H! ]+ O4 v3 T& `9 O
mcasp->regs->XBUF5 = 0;
) Y0 D' z! z0 P \+ V6 W+ g
mcasp->regs->RBUF0 = 0;
2 @! O; n+ K2 ]9 h! p0 s
& w) X1 I. r+ u9 f" k2 a# v
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
}: f6 f% v6 B. R' q \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' Y& x$ i' A$ b* ?6 W7 ^& y. r
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 O$ \& y+ n4 U5 b' L) o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 G& i) @: D0 }! Y4 k
7 C1 `: h$ _4 d6 y9 e
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, B7 N$ X7 i3 b5 u: A% o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 U# T5 U6 T9 f* S
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
+ }( s; o# I z4 N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 K3 u" ^8 [) g0 ]" E- i
1 d7 a$ h( k$ b# _2 b0 |
CSR = 0x0000;
& X4 O6 ^ e$ C
INTC_INTMUX1 = 0x3d;
) P9 |5 ^) w/ t0 ~& c8 p# J9 V4 V
ISTP = (unsigned int)vectors;
5 R+ b0 P5 \& ~' M* G
ICR = 0xFFF0;
* A8 K' R* {/ r# O7 c* V
IER |= 0x12;
7 ]6 j1 v% j: }3 s8 W
CSR |= 0x01;
& m3 E0 U8 L4 c* s
* y0 g' j4 u( q& c' ]1 \- e$ D/ B% \* G
6 S; i/ ?# |; E# R
# C3 Q3 m5 j& F8 n* {- \, t, S
还有就是两个输入输出函数:
; t0 ?' y% ?# R2 ^' v
void output_sample(Int32 out_data)
. t9 p' E0 r! \0 S
{
, c. V K2 Q" ?$ T$ O2 j
AIC31_data.uint = out_data;
7 M2 m& Q6 \* W
MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ V; }) l" y- z+ I, O, R7 J8 t
}
" J6 m' K( R( W# C
2 A- U4 L0 C/ d; F
Int32 input_sample(void)
8 M: @" W* t' ^& {$ e( i
{
/ G" o N1 D! d& n2 c
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' O$ N" T* V2 P6 P6 O
return (AIC31_data.uint);
: o, o1 ^0 z2 E/ w9 v& V+ i
}
& C( }( A& `) W: q# c5 ?! p
' n" [3 }3 t! Y1 f. t
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4