嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
w9 U. `) y: q. W
main文件:
2 I' @$ v/ ^: U. k- b- A: b# X
interrupt void interrupt4(void)
- D8 e& ^$ ]$ n$ p% [* T- p8 S
{
) f$ d2 P# h4 A
Uint32 sample;
; }1 F. |" T! q9 {
: F7 }; ], g* v
sample = input_sample(); // read L + R samples from ADC
8 l! H. A b/ S
output_sample(sample); // write L + R samples to DAC
' h/ q& O: g8 C- f& e
return;
& | a _& J0 |! J. u+ }
}
Z4 Y" I/ p* ~' f2 u% t
% \7 d1 H# C+ `9 q% y9 e
int main( void )
% j6 _4 k, d9 F7 H q0 }0 P; Y3 j
{
% w- O$ }! o5 M) I
& F$ g/ b8 u3 T: P1 A
/* Initialize BSL */
7 C2 P `6 G' w
EVMC6747_init( );
6 s9 E/ x ^5 M; ~% Y
/* Call evmc6747_intr function */
8 _0 M8 W, Z6 y% ^, |0 G7 h
aic3106_init( );
A- m0 q% k* T. V1 k
while(1);
) C4 G% @+ R4 p; T. C9 ?
}
, s7 x" V/ a) ~) A
8 ~5 ?- A9 L8 E2 _
a0 T1 G+ y5 b a
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 L, Z( C" \! n# F
/* Initialize MCASP1 */
6 K3 Q0 j* U( [2 k1 x
mcasp = &MCASP_MODULE_1;
) d( D: Q+ {' A2 B' u. e" F f( v) r
mcasp->regs->GBLCTL = 0; // Reset
' t( f* r! T# l7 x
mcasp->regs->RGBLCTL = 0; // Reset RX
) k$ p5 ^, R5 v6 @$ y0 f
mcasp->regs->XGBLCTL = 0; // Reset TX
: o& f2 q) U+ ]" ], H0 O
mcasp->regs->PWRDEMU = 1; // Free-running
$ Q# D/ M% K3 y+ {' x6 @
// configure McASP0 receive registers
: b J( G _( `: B6 `. y
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
/ F5 T1 v% y8 K
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, Q- f1 |, M8 s d( p# }9 E
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
- M# S' ?- C- @
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; D0 Z9 d; y' m# m% m% E
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
: T. L) b2 W7 |% [
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
F# ~: u0 s9 ?4 E6 J
mcasp->regs->RINTCTL = 0x00000000; // Not used
o1 P, |- }6 i7 r s# o' B9 I
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
r" z# @ R: t5 J. K
9 Z0 t" N7 _9 f: l- _" d
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
9 e+ ^ r2 w" d) B
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 g i4 L! ?" C6 F8 h
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
! F) Y! u- N5 t, [& w+ S- W& A' F3 d
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) r' r: d5 y( ? d- G
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
$ J( s" d% q T# |/ g; Q. i
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
: x: {; T! s q
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& ?9 L/ h) h+ ]% f4 B
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; Z j) V' y' N- d/ O( s8 `" s5 Q2 H7 A0 \
. J; A& F2 y' B# a
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
! M' N/ Y5 b- }$ O! |* P( @
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 n' r" V& N) Z5 O- H4 _; _1 |
mcasp->regs->PFUNC = 0; // All MCASPs
$ Q6 l w! J* Q. H5 D! G( z
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& f! O; r3 W7 C0 R' L- p- F* o
) f6 t5 P) i( D& o% h3 W7 \
mcasp->regs->DITCTL = 0x00000000; // Not used
" x4 C& m- q( u, T1 l& ?; a
mcasp->regs->DLBCTL = 0x00000000; // Not used
N: `" l/ q3 X/ `3 D
mcasp->regs->AMUTE = 0x00000000; // Not used
5 p4 l; g" @+ y. w
1 b" J; J* X- s" x$ |
/* Starting sections of the McASP*/
! ?% e% B( A8 X7 c, u+ ?+ d! Q l
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 B/ X1 ]$ B# ~% S$ b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% q1 }& m/ j% E8 Y3 @& }" w3 h
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. j8 L& n4 u& |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( w; M, T# A8 j. r
! v( u2 v, i I! m- Z' j6 i/ f& K7 P
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 a8 _4 F" d2 Q% u- o5 Z1 `8 c$ K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 m6 V& [* k7 K; a
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- h4 @- b6 b: o: O% V3 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* |( O$ H! S+ ]% I8 K
3 a! U$ U* j. i( l' ?
mcasp->regs->XSTAT = 0x0000ffff;
+ x" F8 s3 W& }+ Z" v5 _ }. q
mcasp->regs->RSTAT = 0x0000ffff;
! W# n# z& ]1 ?4 Q0 e* }$ f! M
- X: n9 @/ H3 x) h7 J! N3 ^
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- n- n- @; Z9 q4 W. g& ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" P1 v% @& [: C0 @+ q
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' f1 t, I" l! h' {. a3 Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
c5 f5 H) A3 o
. k" U# R, w7 N1 a: x# N* R, Z
/* Write a 0, so that no underrun occurs after releasing the state machine */
6 n' J, \0 c: F5 W7 x% W
mcasp->regs->XBUF5 = 0;
! h7 r9 m& E5 H
mcasp->regs->RBUF0 = 0;
2 _! _9 [0 h G
& b3 T" ?. ]" ]4 {
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
/ E% k; i, C# p' d) Q. ]$ w& k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 t7 `2 s4 Z1 L" ]4 E; F$ V
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
- q" r B+ s7 j# S5 L5 o. Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* l3 r$ |/ A+ S2 m' J' t1 s& A
7 d1 W3 \9 _- x" J" \- t
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 Q( _+ e7 C1 E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ [, a' v3 o: Z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 D B& l6 }" a0 l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
8 `9 B+ Z& V7 L/ X4 p. N
3 }+ v( M& r ?, W6 S$ i
CSR = 0x0000;
$ W. J& N- W/ M. ]
INTC_INTMUX1 = 0x3d;
$ C$ Q5 r p3 D5 C! a e
ISTP = (unsigned int)vectors;
1 ]- v- x; y$ b8 g* ^, R; l; o5 I
ICR = 0xFFF0;
- |) l4 M! A% s8 e
IER |= 0x12;
3 _0 a" k/ L# p: m$ m$ L
CSR |= 0x01;
4 n0 g! {% \+ ^& L8 t# \
6 A3 X! b) b# J) [& B( r
) j; k& A+ K( ~& h7 R
! Y* M# W& u* M+ x5 R4 x" {9 |3 [
还有就是两个输入输出函数:
' Z9 u/ W: @6 Y- V7 ~
void output_sample(Int32 out_data)
; [+ }. |# @% X' H! \- }
{
9 G! T9 R" {/ c) [% N1 F
AIC31_data.uint = out_data;
8 E" m9 I- S8 p
MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 R3 U9 o7 c; J: T8 x
}
) `" C1 o7 y' d B$ q' {0 \5 T
6 \# c" X; f+ e2 @' G) K4 C% B
Int32 input_sample(void)
- b6 v4 y" p; H5 ]3 h) j
{
6 q; L" l4 r1 v) i
AIC31_data.uint = MCASP1_RBUF0_32BIT;
( o: @, N* A+ N- J. d! k! k c
return (AIC31_data.uint);
4 e1 G6 ^- h, g2 k* d
}
' }6 I% A2 l1 z' K' G7 K6 ~
9 ^( H- z( ~6 ]/ w/ J$ x) `
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4