嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 H6 r2 e" u6 b/ K3 w
main文件:
6 k8 p$ ?) q8 C
interrupt void interrupt4(void)
. c- ]# R# S) M
{
' d# s4 d$ |5 o" P6 {
Uint32 sample;
' f4 [) B& K5 }3 Q& ~: t
) Q& k) r9 D& V( X( E
sample = input_sample(); // read L + R samples from ADC
- \8 [, N& g* Z( |, {
output_sample(sample); // write L + R samples to DAC
l j |1 w' x+ w$ v% R/ q
return;
- q1 j) `/ p4 p, B
}
: K* O+ N! F9 M: H0 W |
; l5 e9 E, }" S4 g: a
int main( void )
! F1 z$ b1 ~- f' A
{
9 I7 H, h7 r8 D. ]: ]2 f
F: H% F7 ]2 d% T a9 D
/* Initialize BSL */
2 U" o( P' x& d) Z3 k% F. C
EVMC6747_init( );
' s n2 c) \) W' ^' @
/* Call evmc6747_intr function */
# p, P$ |8 V, I0 ^( m: P
aic3106_init( );
5 u) @& J$ G1 H ~) Y' w [
while(1);
7 E# B( d# d, v; m& O# K
}
1 [5 d |9 { Q5 H' W Q; R6 p% s
0 C# p/ t) X0 t
4 S) ^; n* k1 S9 [) a
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
% i/ Y% g3 A' A: |8 g g! {
/* Initialize MCASP1 */
7 a, v4 P* M: M) S% t) Y0 v
mcasp = &MCASP_MODULE_1;
* C& e1 t9 `2 h( b
mcasp->regs->GBLCTL = 0; // Reset
+ Q& G* w2 r$ u; }- c0 `7 n
mcasp->regs->RGBLCTL = 0; // Reset RX
! a6 q f2 l0 p! P
mcasp->regs->XGBLCTL = 0; // Reset TX
5 f9 z! b2 m* i# }! G- s M+ O
mcasp->regs->PWRDEMU = 1; // Free-running
# V3 S. y# Z1 _: N
// configure McASP0 receive registers
% O$ a1 o: k" V4 m2 E0 d4 ~6 Y
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
9 ]! \5 Y( g. I0 P; s- k
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, w' U% Q. A9 i9 f, T
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* L4 ]3 t. f4 L9 ?) }% z
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( V: u0 t( p+ e0 a% y4 Y1 Y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; k* _$ h/ d; w6 G: f; C2 N
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
2 a- | v: ]# V5 J% W" h4 g8 O
mcasp->regs->RINTCTL = 0x00000000; // Not used
- k( |9 ]4 m! w5 d/ u" X* {
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- k L& [, E0 |- \
0 L6 B/ H- w- a. G" u4 w
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" s7 d3 O3 q; j( \5 e, ?
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- M3 `, [4 |2 R) D
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 W" I6 O: o W0 x
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* D( t8 ?0 d4 N. ]% G# R
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
( f3 r$ H& J4 B! S. C7 \
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
7 x- U' X4 ?2 ?: e7 i+ c/ x+ x
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
7 s( z# W9 }0 ^6 v
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 a( w2 U `% S9 G, m* O
. ~* o' ] Y6 Z# `4 G
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; w- m: d* f6 A0 R( z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 l# V5 W" C! M# }' T! `7 m
mcasp->regs->PFUNC = 0; // All MCASPs
% y/ }) |% y! y
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( q$ N/ G: j8 \, j
& h2 J. |' F( p' x+ S. E
mcasp->regs->DITCTL = 0x00000000; // Not used
4 e2 q" ^8 p6 s4 k# w8 h4 D3 s
mcasp->regs->DLBCTL = 0x00000000; // Not used
2 q! ?4 C+ _; j' R/ \
mcasp->regs->AMUTE = 0x00000000; // Not used
: C+ l4 x7 ?- R5 Q. n7 E
6 {$ j' M/ `$ |0 [5 R/ i
/* Starting sections of the McASP*/
( x$ h3 T4 g4 R9 f
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# R6 s! Q9 ^) ^) |1 W* U- |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
& _; a _" `. G7 _4 H
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! M% _# |" P+ v6 ^ v1 I* ^+ w1 g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 y3 Z6 }! y, L8 \
6 G8 o. Y$ I3 }; ~
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
k b& m% f1 y& Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 k8 J+ v% ~( C0 R
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) W# |% _8 [8 V6 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 m2 K% M; g' @
; z2 L% g7 b7 d) |4 k8 d9 D6 M' z: g5 ], R
mcasp->regs->XSTAT = 0x0000ffff;
( K2 T: H- k5 N0 _5 x7 ~( R- |
mcasp->regs->RSTAT = 0x0000ffff;
- B* a5 h" o! j( \: m& ]+ d% _2 t
& Q) M" a6 Q' I9 q h* P
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 ]9 ~" F* @2 G8 K$ |! H h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 C" T8 v6 ~9 }( j& x
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& n5 T& F% W E4 m8 x0 o2 {- ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
. C9 J' e) `$ i6 a' l
1 ~6 p) h1 j) h
/* Write a 0, so that no underrun occurs after releasing the state machine */
2 ~' h/ U- r; e- J% r, S
mcasp->regs->XBUF5 = 0;
o" e. ^! s4 o+ c6 \2 u+ @+ ~
mcasp->regs->RBUF0 = 0;
: L3 F9 S5 y+ B8 G: f
- ]5 W- j6 D" |: Z; |( y
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 M1 k! j: K+ b' q# @+ b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( M0 E! y4 k9 U5 ]" @/ G, @' [
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 G4 O) e; h1 ?+ x! @/ S8 ^, D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
& Q$ X& E' p1 z. j/ f" D
1 g! }5 ~& t! M8 I
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# A* V1 `5 n* k" q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 e8 A3 i8 T c& k3 Q5 L: j G
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" ~9 }2 f" n, m6 ^9 F3 \9 v; ?3 l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* }& e. H3 d5 b& H
2 @. n! ^- F# i7 p0 k
CSR = 0x0000;
* G& w# S% C/ u( A
INTC_INTMUX1 = 0x3d;
! j' m3 [' Q1 [7 s; ~/ {9 D% x- d
ISTP = (unsigned int)vectors;
, M. d% o8 f5 m9 q. W
ICR = 0xFFF0;
( O5 M- k4 g: D
IER |= 0x12;
- ~' M$ b+ n/ x
CSR |= 0x01;
3 J& N! s- I+ o' q3 G1 G* S* r
5 _9 n5 G9 j2 { D3 \/ ]9 u: M
0 S5 N0 o2 S5 J7 p5 ?1 w
; C' E0 Y' x# H4 X" j$ P2 Q$ ?9 r( I
还有就是两个输入输出函数:
* Q5 i) X0 V4 z
void output_sample(Int32 out_data)
8 V5 o; x' @, o: e7 \
{
% X9 J. \$ Q5 C! L( V
AIC31_data.uint = out_data;
3 [+ D6 ]% X! c/ D% I5 y
MCASP1_XBUF5_32BIT = AIC31_data.uint;
& x) A i& ?/ E% ?. m1 k; m
}
: f4 B( t/ k* g- s# o1 I
% I; U& {% @9 U5 H |1 q6 M' n
Int32 input_sample(void)
# G+ a: {9 `: q" b% _) k
{
- q/ Z3 c1 b# `0 u/ e
AIC31_data.uint = MCASP1_RBUF0_32BIT;
3 }& u" z/ U& b7 U c( k
return (AIC31_data.uint);
! A6 z9 \* t9 W% W# L% C
}
3 h8 X. m9 Z4 j
2 K: [. U. _ e7 }, ], ]5 v
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4