嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 J6 I" ~* V$ P! d3 S* j( s
main文件:
# s) u+ f. M" I k- ?$ O9 v& s% G5 ^
interrupt void interrupt4(void)
5 \5 x2 g! l' e' _
{
" n* y& c4 z# m6 H) y# @# }
Uint32 sample;
" Q; x" g, a/ C" Z; P7 k
4 T+ b# M6 i8 b* @) G0 w
sample = input_sample(); // read L + R samples from ADC
# e: a- z3 H4 c
output_sample(sample); // write L + R samples to DAC
C; G. N# y: l( A2 t+ {
return;
" ~& O& Z1 d+ g# Q
}
$ W* F7 n* g$ W- M7 P7 C' f0 I
& P5 n) p3 A/ i1 c
int main( void )
9 N" S- x( P& p- F
{
& B5 A! G2 g: |& x, j8 V' s
5 k4 @( w' x/ `# q6 \) [
/* Initialize BSL */
% `! J) k/ S5 K8 H4 x; G
EVMC6747_init( );
8 J3 x8 |' H- S# B4 \
/* Call evmc6747_intr function */
0 X" U) U+ A. c3 m) J( ^+ _
aic3106_init( );
6 q# ^" Z+ U. b
while(1);
& \3 ^+ g# x# i* Z& \
}
. ? N5 Q3 t1 v; V' ^5 {
1 A9 ^) K. ?# J# m
! w. V# c/ ?& B! k$ y! `
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" S8 |8 x1 P3 H0 j7 }6 [
/* Initialize MCASP1 */
0 y0 ]# F6 ` L* _
mcasp = &MCASP_MODULE_1;
2 [# \- a: }8 A [: H9 f
mcasp->regs->GBLCTL = 0; // Reset
" f3 P* ]0 E4 z- R! Z o
mcasp->regs->RGBLCTL = 0; // Reset RX
5 P2 R* I' E. E7 B( _# m0 `7 @0 B
mcasp->regs->XGBLCTL = 0; // Reset TX
. F* b( m$ ~# V0 T* ~
mcasp->regs->PWRDEMU = 1; // Free-running
/ v8 E7 u8 K3 [, X, B
// configure McASP0 receive registers
" u7 {8 t7 |4 i& l- h0 O8 _
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 P; o& @% j, y# J( l
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* ?: J' z( v" t+ K- S: Y. [3 ?
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 ~ M$ p R, D4 ]1 ~# O# J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ ?& T! z7 ?, Z0 t9 f
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! U! {- F) G; J& a, D- B
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
/ ]# r4 J/ j9 d. [! f* h _$ g
mcasp->regs->RINTCTL = 0x00000000; // Not used
& {$ y) d( a* M4 ]
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 Z: n/ L, l1 w: b7 @! N
2 M& n5 G7 b" V) Y' ?- S: D
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
) P5 c) f c; P8 d" q, @# Q7 D8 c
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* ~; @* r: k( R4 ?5 F: @/ f' p
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 X4 N0 v& Y( x, ~) Z0 J# R
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& f3 I0 H) v: }1 p
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
: ^# E9 z" ^( f- ?6 P) l% t0 S& _
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
+ |' V6 ~% @# T0 u1 m
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- d0 B# I9 v9 B- ] i
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 y2 C3 R+ X+ O! q- r$ ~7 l; p4 e' s) p
: ^" r, g' Q8 l5 x9 N: `1 v
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
h$ y7 p* q* p5 R8 `) L ]/ M
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
) l# m V( |: j1 {
mcasp->regs->PFUNC = 0; // All MCASPs
) |) i1 z) w# E2 H0 R6 X8 U' ?
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
; G; e9 O5 K6 Y+ Q& E. [ x
. q) D( r7 x4 e, H5 p
mcasp->regs->DITCTL = 0x00000000; // Not used
m, d9 l, V8 ~+ c j$ Y
mcasp->regs->DLBCTL = 0x00000000; // Not used
, Y4 g/ U4 n7 \1 X7 z
mcasp->regs->AMUTE = 0x00000000; // Not used
2 T; Y# N0 M3 Y) I/ d& d) s
: u. ^% U% |; O/ H: |, d) S
/* Starting sections of the McASP*/
# w& n% |" @) Q- P. H& Y, S2 V
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 m' k7 \- `) i6 }! w0 a2 Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
) Y& k0 |% h& f+ j: H0 P" R
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 C+ G. Y$ g8 k* Z" o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ P" C) _: e8 Z' |
3 A0 t& p3 P: s6 X6 z) D0 X
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 p" W5 J0 w$ e2 ?, S2 X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, \/ b9 ?% w# T7 J: ~; {
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% X" g. A' I5 r+ a8 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
7 A- u, d2 f. N# u6 C: y
5 f8 u8 W; ?- u6 r9 a
mcasp->regs->XSTAT = 0x0000ffff;
0 n. T+ ?) m$ {8 A: F
mcasp->regs->RSTAT = 0x0000ffff;
+ _6 d/ T. d5 B/ \- l1 Y" c
" |( R3 n7 _2 N! H, v8 g
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ w" c) I" y/ x' x$ A. I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
- ]$ ]3 ?6 n" D9 x% M9 J9 f
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
7 j$ V* t7 p: y" I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
' |: L# ^/ l0 O3 j3 O) W$ e; L
: w! O$ r5 F* _# Z
/* Write a 0, so that no underrun occurs after releasing the state machine */
: y" J) E% q1 O" q8 M, M
mcasp->regs->XBUF5 = 0;
1 G/ j/ w7 {8 `
mcasp->regs->RBUF0 = 0;
. h& d2 d' \3 Z& [8 P O8 m
( y. H e K% W: v% D
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
$ `* _, E% ?& l& L# V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 ?; q, r+ Z ~4 U& {! k
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' }" b5 X6 Z, y+ G8 h. {$ s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 v8 Q" u& o$ J% ]4 z: V3 a+ J
5 }4 A5 i& [ A q, B
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* o- \( ^1 r. {% E/ |! P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 y* }: i$ c& l/ l s
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 S/ a! E; W t/ K' M( M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, e- p# u1 A* }! o% n' F3 _
6 v; l9 G1 \, S5 ^
CSR = 0x0000;
" v$ [5 I4 }; n$ r/ T# H0 n
INTC_INTMUX1 = 0x3d;
( r( {% Z6 X: U) B
ISTP = (unsigned int)vectors;
0 s' b$ h* A, P, e9 O% o$ n
ICR = 0xFFF0;
% | j/ c% N4 d0 }
IER |= 0x12;
0 T/ H- q& I+ v
CSR |= 0x01;
9 B0 O' R, m) `, x& i
4 \; G# R- ^& _( ^
8 m/ B E& m- M# K. A: n: l/ ^( z/ e8 T
( h, X% _7 Q% b- a, J! B- _ ^
还有就是两个输入输出函数:
5 U7 w, E3 T, z; N
void output_sample(Int32 out_data)
: \* v; Y: a3 o* O) f
{
4 D: @9 f& W. R" p
AIC31_data.uint = out_data;
/ l: Y/ g( h* @7 f [/ I* N
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 D4 V# v+ A3 i4 u& x
}
1 r4 q# m: H2 ] x2 Y% C8 ~5 W, a4 {
: x2 e8 C3 p1 P7 |: T+ a! X
Int32 input_sample(void)
9 Z$ s, W# N4 W- I8 e
{
# z* @; v: z) u" Y8 x! Q9 ^$ @; |2 K
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* E3 Q* F6 P+ c6 A
return (AIC31_data.uint);
4 H' `& i7 u( I1 l$ `$ J7 R
}
$ Y( n3 e* e( ~! u' Q# D
) V6 P, g- A! E3 K6 e8 @7 N) o
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4