嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ D. M- o; A4 |: _2 {7 W
main文件:
/ N6 s1 M t; k- G9 o
interrupt void interrupt4(void)
% J3 S: v( d$ w8 B8 D4 Q
{
* R+ b; m0 L' M
Uint32 sample;
( i R; P* v f% J
/ w3 @; d3 E5 r+ o! H
sample = input_sample(); // read L + R samples from ADC
% t/ Q6 u- ]" f+ c/ f6 c6 \( ?' H
output_sample(sample); // write L + R samples to DAC
" c) L4 `2 e/ x( g; ^+ ?0 D5 k9 O0 Q/ b
return;
; `- ^, }% D4 N' ~
}
0 z$ L, z+ B+ E/ H- w
6 e( n* o( D! }+ Y
int main( void )
) Y/ _$ s; q. z, t
{
8 x/ w( ]7 r) g
7 @7 Q" v% q' u$ s3 ?) t/ o. v( W5 d
/* Initialize BSL */
3 }# _8 M: F9 M2 _$ z. C @6 ^8 q
EVMC6747_init( );
& w1 `: k7 p: o) [# U, q
/* Call evmc6747_intr function */
j4 ]8 A2 y# i( ~, N
aic3106_init( );
' ` C. F' C. {* V1 Z8 H
while(1);
' R3 h- b: U% L
}
8 y# u& s% n; @4 j
9 ?1 e7 L/ N" w3 U% Q( m
1 l3 w. e/ O S Z- ?0 S
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ V. B* P7 ?" J
/* Initialize MCASP1 */
! f7 z' q/ b) d& G
mcasp = &MCASP_MODULE_1;
; o6 ~4 a* c J. ?; G' ?& l, Q. Y- F
mcasp->regs->GBLCTL = 0; // Reset
- U2 U3 T, g) A s1 Z
mcasp->regs->RGBLCTL = 0; // Reset RX
6 x* t# P' p; E% Q
mcasp->regs->XGBLCTL = 0; // Reset TX
G4 U- i5 i0 S+ p, ?; B6 H' c$ k
mcasp->regs->PWRDEMU = 1; // Free-running
3 b6 P5 I" [3 Y z" a% P# g/ d
// configure McASP0 receive registers
2 w$ ^7 x* a* C: B
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% _- ] x: c, k; ]7 a! C
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; U; K$ d+ f' x0 D1 {9 I6 i& F
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
2 v7 n: T8 \/ j e% q! L9 Q
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. ~8 ?6 `8 y2 Q9 B2 A
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( }0 X4 ?; K+ i( ?( V/ n! q
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
% S6 [3 S1 m C7 P4 t* m P& ^
mcasp->regs->RINTCTL = 0x00000000; // Not used
- q, m) t5 g7 b- q: `! i* v5 m
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, T9 B) j: d8 j9 b! }; D. k( a
( }& Q; J4 G# D' Z" |- ]( m
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
u$ e `7 b8 \& N
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) D' ~1 a2 m2 D8 M w S$ b7 ~
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
; M; F+ \7 @% J2 B4 w4 f
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ q' m" @- V; j/ B
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
8 B6 n! F0 S% E7 }' _8 J7 Q0 U" q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
2 C, ` t% F; K1 @# K; m" r
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 }) X: i- A0 x0 J l( r# Z5 B+ D1 ^
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" K, t7 y( U; z4 X! ~" b
. C. `7 N+ _( Q* j) W6 R4 X0 `
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
. z. m$ R! I1 ]) b* F/ Z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
+ h4 X: R0 f! J) S; @) U
mcasp->regs->PFUNC = 0; // All MCASPs
/ }$ u' B, C- _( {
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' y8 y! s3 Y2 u6 N: m
& i$ b# p+ N, Q; k
mcasp->regs->DITCTL = 0x00000000; // Not used
# k' e! y# A% L5 W' F! Y
mcasp->regs->DLBCTL = 0x00000000; // Not used
. }* u9 Z9 @3 E& O {' w3 V
mcasp->regs->AMUTE = 0x00000000; // Not used
" x5 K2 y, z/ k
4 k4 O7 A3 i; l; S
/* Starting sections of the McASP*/
3 f# u! X- z# ~( K
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( d {2 Y& _7 Q) F9 e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
, \. h( w6 A( p" R* Y i
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 e k7 E: N! P, Z3 x* b5 m( o2 t7 l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
8 m+ U& o' e# ?
; v/ [* |5 g8 ~2 ?1 H K
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) I4 q4 v/ i+ c" q6 J* C. N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ @1 B( S. j8 k/ V m9 `% t8 F( K
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; B3 l4 |- @# r- f4 Z& l6 P0 ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
q2 K5 }; H* i$ D
3 X1 w: Q8 _/ R, q" f% C! \
mcasp->regs->XSTAT = 0x0000ffff;
" {: p8 B: h5 l6 ~1 e y7 s
mcasp->regs->RSTAT = 0x0000ffff;
0 I X9 S# }5 {" I
: }- ?: s6 t) h; Z
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 I* P, H0 x$ k, W7 t! Z* v! G7 s5 Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ c0 S% ~: k+ m: Z, {0 |
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 i6 S0 {7 x; V! j( c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 ?- ~3 V$ }/ [: X. H
1 {1 \: n4 s( q& m( t0 H$ u
/* Write a 0, so that no underrun occurs after releasing the state machine */
. g) X2 L- C k! C; A$ t0 r% k0 i
mcasp->regs->XBUF5 = 0;
( X9 V2 M2 k& Q6 t' v2 p( }
mcasp->regs->RBUF0 = 0;
: B" a. z# ?. H W: u% ], P+ w' P
3 {" o; w# P+ @) F# j7 V& y
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
$ `9 |1 Y2 o2 D3 w6 {7 K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' `, }% @ t6 o( j
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 Y* u6 A( }8 |( u: Q l4 i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
; X" g. Q* c8 Y2 `% z: a
2 V: K( ]! P& B5 v
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' o/ _8 D* w7 Y8 p; y' [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* w+ x0 F6 W9 s: Q
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ s o: T8 U# \0 m& R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# U1 a+ p# J$ J& E
7 C! O. v% C8 t( R$ A9 k* z* F+ B6 K" k+ t
CSR = 0x0000;
# N6 n# G+ `2 x. `2 p& h, }
INTC_INTMUX1 = 0x3d;
. l. m8 x$ w1 Z$ b$ q+ t9 B+ y* h
ISTP = (unsigned int)vectors;
4 c5 _6 C& Y8 J4 Z- U
ICR = 0xFFF0;
& D$ {7 ~7 G6 Q
IER |= 0x12;
6 i% Q8 I3 H; n2 N
CSR |= 0x01;
' P8 R# R9 s( _0 F& _" a& S2 z
" D! J! e2 E& z2 b
9 y! b% i; J; T* k
& C1 d6 J" C7 o* z! X6 O
还有就是两个输入输出函数:
v6 E+ i1 I8 a/ M4 i& F: I
void output_sample(Int32 out_data)
. L3 Z+ k, B. m$ s: Z, T
{
$ C! T. y/ F0 B A6 i
AIC31_data.uint = out_data;
0 ?1 _+ y m5 L- ]9 U! l1 M3 p
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# h! J, n8 f+ s( [' X: N
}
0 \: e1 b( h* E# q( M; U% w
1 m: ~- x7 F" N) x8 w! B. {) N- S
Int32 input_sample(void)
2 |! K* d2 p" S# h$ b
{
$ V: G5 |5 m! B3 z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 b1 n. G) t$ G* O# f. P' f0 ~
return (AIC31_data.uint);
) u* l i+ @ D0 N& K
}
8 p( x6 @' H% f* C1 N, G+ P R# ]
2 m2 V8 ?& r& I
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4