嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 M' [8 b- d2 j: R3 M
main文件:
3 B% [. w4 R2 x
interrupt void interrupt4(void)
9 o& o9 ]) r7 U: [, ?
{
4 S+ m- ~' B+ O8 y( ^/ ]5 `* \# D( O
Uint32 sample;
4 z+ | J9 M% a* g
5 X$ {5 V1 A6 Z4 o
sample = input_sample(); // read L + R samples from ADC
$ V, P, K# W7 f8 O5 Z. G4 K
output_sample(sample); // write L + R samples to DAC
, U9 Y: r( |( A' b" j# q
return;
* w4 O9 g5 k2 Q/ ?: l4 R& `
}
4 y: P) v" e- }6 r1 J
* c' P) M5 ]% Q4 l* h8 h
int main( void )
- E0 `# `# c* w0 u4 G2 X
{
; M# o$ R2 i1 a
3 k/ j$ d6 B3 X, i2 K$ p
/* Initialize BSL */
& V, |' m7 I+ z
EVMC6747_init( );
5 Z# G6 T* N- I. j
/* Call evmc6747_intr function */
, P# f ? U8 {* X( X7 G
aic3106_init( );
1 }( H9 o; b( d
while(1);
B! r3 R! |$ E u O3 w& o
}
# u5 O) t" n2 G4 n; J
$ w7 w' M' M6 K5 ]+ s
0 w0 v" T) Y h! c2 y( f
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 z1 D% L: o5 D" i1 W' B, R1 r
/* Initialize MCASP1 */
1 e: U- j2 k2 z1 t$ W4 B
mcasp = &MCASP_MODULE_1;
; X' U. e- K6 C" e1 p* L- V# [- l7 B
mcasp->regs->GBLCTL = 0; // Reset
j) m8 ~, ~ _4 F( w, v* U; s
mcasp->regs->RGBLCTL = 0; // Reset RX
) e8 f# J& X3 V
mcasp->regs->XGBLCTL = 0; // Reset TX
- t+ R3 H* o: J1 I1 Q
mcasp->regs->PWRDEMU = 1; // Free-running
; c8 m3 ^# G: `8 W4 C3 C# z1 [* ~5 q
// configure McASP0 receive registers
0 u4 W# a3 D$ z$ a) X: w. t
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
7 o6 K( f8 G: L
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# `: H( H5 Q# @+ q3 x, g9 V
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
& _% n' h; [2 t8 i5 d% n& C- h6 n
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, {7 `# ]3 g0 N* H4 b! q
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
) o1 ]' x& q) z V& v
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
0 i' i8 Q, @8 {' I1 ?2 [( @ e
mcasp->regs->RINTCTL = 0x00000000; // Not used
$ {; g8 r7 z- L' M" V* a
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 H8 F8 R" c% D4 k+ j8 T7 g. ?
c3 \4 u7 q/ _% U2 a [! U8 v
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
% W$ [, t b9 R) z' {
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 U% h+ b8 f& B3 d' C
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
Z" ]& o( A6 }+ V2 l! ]
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& z$ ]2 [0 U9 @4 f0 `. X: \' [
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- B" b J2 o: [4 U; f6 u5 m7 u
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
: ~) l& x% o& r% Q! M$ B
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. Y6 A/ p: ^* I6 i- j, K$ J2 c
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 p K- M$ Y" P% d3 n% G
: `/ L; W4 i: W- ^# p1 K" f& K
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 R& b1 {# z- a5 h
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 S5 R* q* C: ~* t
mcasp->regs->PFUNC = 0; // All MCASPs
1 {; R) o3 E! W1 ~
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ t6 B% `8 T( q/ ~
E1 ~0 I2 o2 ?* }; ?! S; @' E
mcasp->regs->DITCTL = 0x00000000; // Not used
& b! C! p0 b4 z
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ _! a4 U6 @/ T4 f0 s# B7 e' E
mcasp->regs->AMUTE = 0x00000000; // Not used
& V1 x1 g! T, A
8 S: p$ ]- ]6 I
/* Starting sections of the McASP*/
. {- d6 q' \" V: f
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' ^ B# t! v7 b& C" n* x9 O- x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ h* ^5 Q( t; P+ S0 V! H
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( [% d) |' l5 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
; ]: c( j- {4 [+ S/ h& ?/ f; a
: y4 z' d3 Q( W
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 V2 R& ?6 y3 \* D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 R- } j6 Q* W: t% i5 g5 ]9 s
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* R( \( J I+ p5 a$ j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
9 a; f0 d4 o+ z n9 x' s. _2 s+ e
( s2 t( o6 l. y
mcasp->regs->XSTAT = 0x0000ffff;
; Q' c# M8 [8 Y' F: J* C
mcasp->regs->RSTAT = 0x0000ffff;
! a" U. E- z: U
, A5 ?1 Z" k2 |- }9 T
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% E3 O- W+ d+ N6 M; C. }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& R( v+ i2 B( T6 ?
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 q) m w; a7 Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 G4 y8 E& f( y+ D& z
- l8 c1 }: b! B4 Q5 m. K: D
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 \7 d: c! t* Z ^% A" B) M* ]
mcasp->regs->XBUF5 = 0;
0 b4 {( H7 s+ w( |
mcasp->regs->RBUF0 = 0;
, d& k( \" I. x7 @$ u
+ j, `* _# `0 {, R
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
. h: Q. m r" A& n' _# H+ P/ o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 y3 z2 a! s& R7 o1 b' [* Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 M& l: L8 B9 X) J1 u4 z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: M, ?+ S U. x: W0 ^
8 o) [ c/ b G6 i) G
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ R: J$ B7 W: G" O9 K" x) f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 P: k4 E" t) u' {
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ |# x5 T; Z# i3 {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 e' g# q' A/ E& L: ^$ q; E& w
" N. A v: {4 z8 i
CSR = 0x0000;
3 v" k: B6 A1 G/ [: b& G+ Z- m
INTC_INTMUX1 = 0x3d;
1 E4 G; m q# p) f$ x; ]" P. c- V o
ISTP = (unsigned int)vectors;
6 I" P5 u2 t G w4 s
ICR = 0xFFF0;
$ t. V8 Y. }5 f4 T1 x
IER |= 0x12;
) x. ]2 {5 @3 c% D
CSR |= 0x01;
. | h) M# x1 Q: V V6 b. l
& N0 M1 n3 H( ]! }4 F) I' T; n' {
! c. C! q3 S4 H! i" p' d4 s
; U2 U6 I; M1 g' G
还有就是两个输入输出函数:
8 S3 m' G4 d; f5 w$ f$ r
void output_sample(Int32 out_data)
3 ^" E" X2 g- T7 }
{
5 R. o7 X( V/ P# s" _4 y6 B
AIC31_data.uint = out_data;
0 K! R, c: K. s) u% m9 x) q
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 E% x6 J d8 \$ W/ W; y+ [7 d7 Z
}
4 f9 a2 W. K' V/ w% u( s% o
- A3 m, I) w7 m8 }
Int32 input_sample(void)
; B$ {! l+ ^7 v5 V8 C
{
# Z' O; B3 x" R" K* M% p6 G" ^
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ O+ \- h R% p
return (AIC31_data.uint);
, n/ b( g! w1 r& A) G
}
x0 [; a5 _& y' S" f' X
6 c" K. |# F3 e, W8 l$ G4 ~. j3 p
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4