嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% Q3 y) |( c; X* q, U; e+ u
main文件:
8 L* C. g8 |" @& ?$ q9 s P7 D3 S
interrupt void interrupt4(void)
* |* R9 S3 T8 [( s& q
{
' G* T, d. U! j# H9 g- j5 O, j1 U: T
Uint32 sample;
0 i% Z% @6 a; _, Z5 K2 i
& T1 W7 Z( p( Z# c* e
sample = input_sample(); // read L + R samples from ADC
4 k' }; d+ Q- i1 W% q5 t0 J
output_sample(sample); // write L + R samples to DAC
6 L- h7 Z- T3 G% @2 e0 w# a
return;
/ t% d+ j* S4 S0 k6 R
}
5 d5 b6 A9 r' |$ r: Z
' Z5 F; d" Z. d7 `9 w
int main( void )
8 O2 [1 C# X c8 C/ Z
{
( k6 x4 @- C1 `" ~/ U: l- J% ?- s! K5 u
: E* a1 \- F) N" X& i
/* Initialize BSL */
4 G- N* k# m1 {3 d" A/ H
EVMC6747_init( );
' D1 p) ^3 Z! k( X
/* Call evmc6747_intr function */
t: @9 Y% u/ y; x' R1 H
aic3106_init( );
$ m; ]- }( |+ S$ B" n# W! p
while(1);
# c0 s' @# x0 q2 I- _% ]! W
}
+ [& r5 {5 E- ~) P2 P
- {8 u7 W0 A# ~( m: i4 Z) u
1 V+ N, R3 L# y. n" H
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* _4 x+ h& g1 Y0 _
/* Initialize MCASP1 */
4 O6 V" Y5 b9 d& f* t
mcasp = &MCASP_MODULE_1;
+ k& w( ?8 x. P% M) v# R
mcasp->regs->GBLCTL = 0; // Reset
5 _% J7 d9 J* f& r( _1 ]) N2 R
mcasp->regs->RGBLCTL = 0; // Reset RX
. T$ J& d9 L7 n: a4 X; J
mcasp->regs->XGBLCTL = 0; // Reset TX
! {1 [" c4 k9 B/ j& F
mcasp->regs->PWRDEMU = 1; // Free-running
* j& @9 t* I6 V& z+ R" `
// configure McASP0 receive registers
# \5 G) v7 z/ U3 c& v
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( Z7 L6 J6 { q6 O
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 H1 J4 Y" o3 m+ u
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 L' c6 o7 b6 @8 E% \
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 c1 {( d& C# u$ a+ \
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 X/ W% ?4 a6 g2 a
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
& ~2 l3 ~# H+ W8 G a
mcasp->regs->RINTCTL = 0x00000000; // Not used
) N+ G" |' l e$ r. u: Z7 j6 T4 m
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 @% ~ ^# ]3 U R& L
& \, V9 T9 ~0 A9 J5 x
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 d. O; _$ `+ {; C8 v+ Z* U
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% N3 s6 _" d8 R
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
G. \. V! V! i) B3 _
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ g: D$ q' R3 {" Y( j2 c
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
& J4 F4 {& L" f3 h
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 n a7 c" j9 q% b5 n
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 Q3 U- f, X/ R; B9 M7 D+ A: `- [
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) p6 D0 k5 x, c5 i8 E$ G# {& D
- j: k5 w. t4 y2 O
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 n8 q8 T, U2 h7 y6 r, T
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 I# _' {# c5 p9 l/ t' X5 [
mcasp->regs->PFUNC = 0; // All MCASPs
& F C8 R/ b: Y: h" [4 K
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 f! g& n3 r' o4 r' i
+ k& [% g9 {2 _0 ?6 [
mcasp->regs->DITCTL = 0x00000000; // Not used
( G y' x$ l8 ~1 n* x$ H& h8 C/ {% E
mcasp->regs->DLBCTL = 0x00000000; // Not used
) I( f; m D- x& _6 o
mcasp->regs->AMUTE = 0x00000000; // Not used
) J9 H4 m8 B3 I% w
7 k- Q' k( ~% o1 y+ R
/* Starting sections of the McASP*/
3 e0 F, K) M F# {1 c. U' [# f
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" c( W$ j9 I* s! S/ b0 D i5 D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
5 F R, z* A" A
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- J y/ g3 T( h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ `+ b" z3 h7 A7 X
5 Z- S3 L6 Y1 }4 |4 e
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 H$ {+ I0 f& n& X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
$ I6 D- C) A0 y% I' e; _
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" ]! {3 E- J. K1 G1 W2 c/ Z8 C; X2 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ m' E# M9 W1 u+ |
* x, c e5 V+ `) o. w8 F
mcasp->regs->XSTAT = 0x0000ffff;
5 J9 y9 w9 a, B5 W
mcasp->regs->RSTAT = 0x0000ffff;
+ [1 {5 m' z5 L8 ~" k
6 x4 A6 y) q& y( P0 f
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" i I' e4 V8 U# G! W2 n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; `! S4 A, w- F4 K5 r
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* S* K$ C: M+ b" R Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( F1 F" k; J3 D5 b' e n
2 X9 e( |7 u1 g, Y# ^% L* T& a! k7 M
/* Write a 0, so that no underrun occurs after releasing the state machine */
- V0 M' K2 m4 t- ^
mcasp->regs->XBUF5 = 0;
& Z; d! S* ]$ G9 {- C
mcasp->regs->RBUF0 = 0;
# T' j3 ^7 w$ [; n% s6 ~
* S0 K- u, K! Y" Z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 b Y& w9 N% t0 N; s& C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 D& d2 j/ L1 F' w$ }; W* @
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 E+ L; Z1 w. t8 N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
7 w& U- A) m, H
" ?/ ]2 ^8 M+ w
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ x" d$ P, a( M. t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% `* T& [( B/ o; I5 W
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' k4 ?6 D! D. r9 U _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: V/ I" R/ b& ?% S, D4 q. c
- w8 T' h+ Q9 v* y7 X% b2 S' I
CSR = 0x0000;
: c6 Q% B8 ?- I; L
INTC_INTMUX1 = 0x3d;
! ]/ Y: a4 l1 Y$ D( m; C. a$ }
ISTP = (unsigned int)vectors;
/ d0 A; f6 |) r; _
ICR = 0xFFF0;
# T6 q# R7 X! ^" z7 Q4 t ?$ i7 g
IER |= 0x12;
6 C5 H9 i) \( ~# u8 x
CSR |= 0x01;
* {2 a7 o) B' V
n; c5 b: ^8 c3 a! L
' C3 f8 y& A" q3 M
+ {) I9 @- _0 a
还有就是两个输入输出函数:
2 s. u: N7 @0 [* v8 k6 m
void output_sample(Int32 out_data)
, F* } W; \+ P- w$ R
{
6 u) B# O. e8 {. {1 v
AIC31_data.uint = out_data;
; \; y0 H4 m1 t1 U! x
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# j$ x7 W" |0 d$ P. u# f' S, C
}
6 {5 _( ]7 B% z- ?. A% \
+ v' h# o; a- t; X5 L% ]9 J
Int32 input_sample(void)
) k$ T7 F6 ^# A8 Q5 v1 \0 ~
{
8 n$ z5 G9 s2 P
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' t! n! F! Y3 N) F
return (AIC31_data.uint);
4 G1 r9 L Q& s- m6 @) O
}
1 Z8 G Z* _/ `& U1 L) F: K) E& E
* S# H( O$ m6 M; A2 I! L% l
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4