嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 k8 [6 @9 }. @* h5 S% {7 n
main文件:
) Q* D! y( S. f
interrupt void interrupt4(void)
% e4 g, N3 @6 @% Y1 _2 s. a
{
( U C/ g8 s8 W
Uint32 sample;
{/ w! p8 n k! i& w9 K9 k
2 y# _! L. e0 n h' H
sample = input_sample(); // read L + R samples from ADC
9 [' b+ w4 u+ r6 Q' j! P( K5 G
output_sample(sample); // write L + R samples to DAC
& A0 A# c. G' m4 ^
return;
! H" l/ `8 o1 H8 K; R3 {& g+ ?2 D" h
}
, `4 m/ E+ p5 X+ g! X% ~( Y- a
+ R9 t& N$ k9 F; e4 H
int main( void )
1 P% e! d* J9 x0 T2 H
{
' }0 \& P. D- a& P. Z8 z! z. M) l
^6 ]: U2 d, H7 m' }1 p7 I& h
/* Initialize BSL */
' j' ~$ f! k1 q) N$ m9 p9 _/ G
EVMC6747_init( );
8 m) k. A4 H1 `2 C w
/* Call evmc6747_intr function */
% S6 j9 K# q% T- h8 B7 p2 V& {
aic3106_init( );
; k0 Y a! y: M1 K
while(1);
/ S! |; m& `" E: p6 T1 V6 d7 h
}
" M: ]$ z3 C7 y4 A b3 H4 z4 @
( ?. c6 Y! L' K1 h
" N$ l9 [, |3 t2 C
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. e) X" L# |8 _% A# ^& h/ x) G
/* Initialize MCASP1 */
' L0 w I+ {5 b
mcasp = &MCASP_MODULE_1;
3 [7 b5 \1 R8 ]9 U) W( C# c
mcasp->regs->GBLCTL = 0; // Reset
+ t/ _! ~3 L( ?: P; ^$ W
mcasp->regs->RGBLCTL = 0; // Reset RX
( f$ Q2 ?3 X5 m9 `/ V6 m
mcasp->regs->XGBLCTL = 0; // Reset TX
8 H$ z+ _- K+ j; o$ f4 ]
mcasp->regs->PWRDEMU = 1; // Free-running
% Z! s2 @6 {6 B6 S; R3 ^2 N! M
// configure McASP0 receive registers
' X+ J, ]- i: W/ T) T
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
9 t* k9 D. W8 f1 H1 f. E
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 j/ G/ }% w9 ~. E4 Y
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) a+ e1 p& i" W ^& z
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
2 `/ u5 G! ?0 h$ [
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 R9 l u( Z7 |# K, {
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
5 R& ?' }; a. |/ |- Y# R
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ c$ ? K0 L$ }7 I* ]
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 j' Q# g1 z9 T0 c; S8 a
* _4 q; Y5 F" d+ Q* O" c! q
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
: l! k$ o: @& y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& `- h- y7 }% l; F9 u* g
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- T: \5 {1 V2 j- g U( x3 {, J
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: K/ B. Y* G2 T/ j" f# V' b2 g- t
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
4 Y8 G, H7 F& A @9 n6 [/ b3 z+ k2 a
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
0 o$ R( ]' ^* f
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. k) n; M& \$ \
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ Q( w! l z& T: r
: |3 j T2 [2 X+ a
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
1 l1 W' M" U) @2 S7 o2 N9 N
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
; A! h5 K; A9 _1 B, \7 R
mcasp->regs->PFUNC = 0; // All MCASPs
; P- K! `) U% B- ?, F
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 w3 l1 {0 P" @& F R
4 o C6 m7 f" d2 e7 n+ p. b
mcasp->regs->DITCTL = 0x00000000; // Not used
2 {8 P' C2 Q7 N! J5 @6 D
mcasp->regs->DLBCTL = 0x00000000; // Not used
2 _5 k% V. Y& e, F( _5 C3 W5 e% F
mcasp->regs->AMUTE = 0x00000000; // Not used
/ B/ _8 v* G1 X4 K ] K
. S( n5 t! X$ r& j6 x) T7 g" g/ Q
/* Starting sections of the McASP*/
; x+ E- {' q1 j( ~, X! [- O7 |
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- P& r4 F7 [# ]* W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
* }* W) U7 i: k
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 O* `' R: ^& x9 I3 s. G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" h+ T) ~# z0 E+ ~" n9 F4 X ]6 K2 G
9 O7 j7 u! x0 n4 n" I- w' O
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* N0 Z$ S2 I. W0 `+ K! [* n% W0 K/ Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 ~9 K2 h9 M2 ~9 I2 A: c) P
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; o& o0 o' p! u5 o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ k" Z" n2 B, W# W; [
- U4 y6 U+ A' {. m" H
mcasp->regs->XSTAT = 0x0000ffff;
2 w5 A& E- P" [& A
mcasp->regs->RSTAT = 0x0000ffff;
1 |" H1 t! V- I3 C$ G
1 g) ?7 d! O7 Y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ v( U+ J5 q1 |1 N# G2 }; I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# H4 N- ~* v/ ^% O% B& n
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
B, o5 K8 Q# S) J) O7 J; J# l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
8 g6 e. u! @- E" f
# U% U) C$ x' m. O
/* Write a 0, so that no underrun occurs after releasing the state machine */
2 ?2 s3 Q- B9 Y
mcasp->regs->XBUF5 = 0;
4 N8 N/ c& I, u
mcasp->regs->RBUF0 = 0;
& w# F6 F" Z: ^/ J8 k; {8 f
& z+ _9 {" C0 Y; @7 Q* s
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! E$ X) |( t& N% W( b+ B
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
+ T- h: L2 r$ i7 q, h
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 Q( m0 Y2 l; V! s: k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ }( S! ]( @6 L- ]5 N
* ]: n6 M \+ s/ p
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# k2 |2 b% C* t, o0 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 V& K" `& n: I0 @' v3 @7 w N
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 J+ f/ {1 a' c) b |5 f! u; e5 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 R+ J" a. R+ Q, P$ i
/ L# g! P% q6 ?9 H
CSR = 0x0000;
4 O* X" ^+ S9 g8 o t
INTC_INTMUX1 = 0x3d;
/ b6 E/ ~, g2 Y! I5 B
ISTP = (unsigned int)vectors;
! o1 F2 S6 v7 w
ICR = 0xFFF0;
& m$ X4 M( W" h6 U: Q
IER |= 0x12;
) i# R2 Y. V' J p" n
CSR |= 0x01;
+ b S% I! n7 @, F3 r1 r1 o
/ o, Q9 Z, q+ ]* J# o
. H/ Q, b) G5 Q6 t4 q+ r+ y
$ R; _7 l1 t; r; x- L
还有就是两个输入输出函数:
+ O3 y: Y/ Z1 v) @ S3 `+ A9 A0 }
void output_sample(Int32 out_data)
h* L" v2 f. n7 ]/ [
{
; P# i- n7 l7 i5 r! [' I
AIC31_data.uint = out_data;
; {. l) Q4 J J4 s$ V8 a
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 s" s8 j" X% O2 ?# U
}
9 I# R" H8 T I1 s% }
* e6 e& @# X2 b( m3 ~( Q
Int32 input_sample(void)
! K1 f" K& S8 S) p+ j1 E
{
# ]) H! ? ]$ k Y
AIC31_data.uint = MCASP1_RBUF0_32BIT;
B5 O) K* ~# t+ S+ v7 \ z) o
return (AIC31_data.uint);
: q( y4 L' ?4 ]3 x
}
- \6 M% s; a- Y4 q( }
2 }7 L) v! f k. ?- q) B
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4