嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ M# C* c: [9 k% }+ u* G
main文件:
! o. I3 ]( _4 \# F2 j! g: Y
interrupt void interrupt4(void)
" k/ g- _8 K8 d4 {3 j0 m T
{
, X. j6 D( [; _7 `* n8 h2 N% N' l
Uint32 sample;
/ [& j# i# c" w$ s ~9 M
, s1 f" Z' T/ \4 n/ W+ h
sample = input_sample(); // read L + R samples from ADC
! ^0 `8 ^( T" [. \# h7 e5 w
output_sample(sample); // write L + R samples to DAC
, m- @! a% R6 X8 P6 A$ [) E* c8 ~
return;
6 w; G* ?' B' i0 v+ N. {
}
+ T1 r" g; M$ i- j+ h
. X2 z% [2 E+ _! p: k
int main( void )
9 M4 n+ g! [" M, L, o6 `( `
{
N' j: [- l* Z4 _& ]
2 a5 ?( r$ ^, q) o- r2 f
/* Initialize BSL */
, a. }4 B# A9 G: S2 [
EVMC6747_init( );
e5 a& x" ?( T7 b
/* Call evmc6747_intr function */
; j+ O' Q' q/ m9 V
aic3106_init( );
' ]+ L W2 e6 S1 v' Y( m3 f
while(1);
0 ~) e( L/ x3 y" m# {/ n3 L8 ]) J
}
/ N) P8 z- X" X% S! }" [* b
/ y' z6 k# e$ b
# Q2 U$ R+ I9 s9 H4 |2 H W; A" G
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
m% Y$ X7 N0 s, S6 O
/* Initialize MCASP1 */
1 o2 G, Z9 R+ e7 j
mcasp = &MCASP_MODULE_1;
- i0 s$ a6 j+ Z6 {9 Z- s3 a) j
mcasp->regs->GBLCTL = 0; // Reset
8 A# C* U+ Y; {6 X' V5 _$ @
mcasp->regs->RGBLCTL = 0; // Reset RX
Q# M+ ^8 ?) c
mcasp->regs->XGBLCTL = 0; // Reset TX
2 e$ K# u( C# G- J! S- O" {. Z! x
mcasp->regs->PWRDEMU = 1; // Free-running
5 q s4 k9 P; {9 E. D
// configure McASP0 receive registers
$ E) `) ~( H! d$ ^0 O; r
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( U* j! u4 X7 U/ B
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) E9 E( P' i! k2 @
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* D( Q8 \0 m" u/ m
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# R5 W; z0 f. s
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' ?- K. t. x1 x+ m
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 f9 \- s, ^' T
mcasp->regs->RINTCTL = 0x00000000; // Not used
8 W. \' h# r9 _$ I/ h' |. c" g4 Y) |
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 P7 Y. m. Y. L7 K8 O3 k* Q
# d; Q* K& l1 S5 H2 }. }
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( }) ^' [, i# N' b6 r
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 V9 ?9 T) `, e6 F
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 i# ^- n" D! X8 \1 d: j4 \( C
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, Z% v( G; Q( w5 ~3 t* j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# s- \7 N# M' M# G
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
' m D/ d3 g+ S2 `& |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
7 K8 w! R* D [, g& }
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' e' b3 L: q6 O1 C
- Y# ]! l3 h9 t u, i
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; S$ p% K7 q: F/ j2 _
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
- {3 X$ B% i- y) C4 b4 \% z+ h7 c
mcasp->regs->PFUNC = 0; // All MCASPs
6 Z5 w/ b7 X# j4 _- Z! o
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ z4 P) I t8 {# ]* d' R8 c
! l% ~8 ]2 }/ z% Q; d. D/ E
mcasp->regs->DITCTL = 0x00000000; // Not used
% ^+ S+ z; d1 Y, J: F5 W
mcasp->regs->DLBCTL = 0x00000000; // Not used
, x, L7 d8 @: D. Z( O7 r0 K1 r6 }: M
mcasp->regs->AMUTE = 0x00000000; // Not used
8 S8 d9 ~9 L5 c H1 M0 W- L; X
5 h7 ]! X; e+ |8 t7 f! G* c% d
/* Starting sections of the McASP*/
t* S! H! w+ t$ K6 a: r* D
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! g$ h% ?( }- m4 @9 r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% E G' ~1 ? s/ s( _
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% c- ^1 p9 J& @ X, ~' N2 N, z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 n; a/ ?1 |( I' }' i
; G. w3 N8 @; @, [8 {
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 i. n+ b( E* |. V0 F* ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ y0 p: `# w. g; ?3 o+ {
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( J7 n" s: h+ e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 F: A9 b, j" D$ E% V* }' k3 S
5 @/ @9 V; C9 h4 v
mcasp->regs->XSTAT = 0x0000ffff;
- l+ Z2 h2 Y* U& A9 m
mcasp->regs->RSTAT = 0x0000ffff;
4 m& g7 e/ ^8 C. V
+ M) [8 v$ G: K. {4 K4 B. T0 R9 F
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 E/ Z1 m6 i5 k1 D6 r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( r* i5 W1 n; |6 ]+ }3 b' s/ _
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 N* D& k: J( ^, `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 Y) b1 S. i/ Y$ f0 g
9 L' Y9 \9 w4 Q) O
/* Write a 0, so that no underrun occurs after releasing the state machine */
, g2 {4 ]: X* J* \
mcasp->regs->XBUF5 = 0;
3 l c `" J5 [. p% O a* e
mcasp->regs->RBUF0 = 0;
6 Q( H8 K1 w9 X" i5 y
7 \9 n, k. X7 y# x* y- o
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
' d1 Y( ?) o) F; v, Y4 z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, `4 x: v/ J5 ?; ~8 {0 }8 l
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: U; `; {4 O4 p. `) N) A3 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
6 K, ~9 p5 r1 i M" n) t: `' H" s
/ U( r0 i% ~" v! [$ @
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 Y( @% \% \/ f# I" Z1 \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 q/ `' E- H+ ~
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
l- H8 v& {% w; w' s3 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' S$ C# Z- L: `) e. a+ [7 [
4 q, ?) J& t/ I# x0 M! Z
CSR = 0x0000;
0 S8 z. m* d6 E& H a0 [
INTC_INTMUX1 = 0x3d;
, e, ~- \8 ?3 z# e9 |+ ?
ISTP = (unsigned int)vectors;
4 ]1 O$ G3 o) O T# `9 z
ICR = 0xFFF0;
- P0 Q$ S2 }5 r' l9 {
IER |= 0x12;
; ^9 v6 t& t5 i1 b3 A3 z
CSR |= 0x01;
3 D8 `! D+ L/ E
7 ~0 c# v$ A i
, q1 x+ L; a* g( G: X9 m
" b6 F: g& d7 {, P3 A# G- N" ]
还有就是两个输入输出函数:
* p& N. P Z" d8 V
void output_sample(Int32 out_data)
5 V' r s: o. \2 a0 C/ j9 h' }
{
) u: T0 v% E6 _/ u' g( \
AIC31_data.uint = out_data;
# w, Z) j) W5 {, H X3 a0 U
MCASP1_XBUF5_32BIT = AIC31_data.uint;
- X( W0 O4 Z$ G0 U
}
- }% N, {9 ]# e- s# q7 y
/ a* j5 p! w* X4 N. A2 `! l
Int32 input_sample(void)
8 G% y+ _2 ~' Y" D
{
l' m1 { L. ~/ d# v
AIC31_data.uint = MCASP1_RBUF0_32BIT;
3 N5 _0 e D! M* B6 y0 C0 w1 z% w
return (AIC31_data.uint);
. |0 O. Q8 l3 Z7 {7 c# V- F
}
1 j, r3 g4 P1 A4 c
& c* e& a. \. d" h( s& r
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4