嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 x, S) c* ]3 G. [
main文件:
# r+ J0 e. j) t* u. x C
interrupt void interrupt4(void)
: h+ Z: Y4 }) N
{
2 j2 O' Z! ]" I! [
Uint32 sample;
6 n j) }+ O, v1 h
, ?3 U7 J. S9 D( r" }7 B. A
sample = input_sample(); // read L + R samples from ADC
5 z) ^7 E1 O P( {* v1 c
output_sample(sample); // write L + R samples to DAC
) p! Q( {. X4 q( p C8 ~6 G, ]0 P" H: i
return;
5 U4 E# j0 l6 n) {
}
9 \- z' Z( ], d4 R$ K' j' j
6 _# y0 H( Y5 F, m
int main( void )
! H$ ~: S7 u! P
{
; Q2 |9 a c; a/ ~
6 v/ S) b! S( y& ~; x' N' ~
/* Initialize BSL */
) i) p. }2 A2 R
EVMC6747_init( );
, i( R. i0 j. x. d6 \
/* Call evmc6747_intr function */
6 i" d7 N/ Q. E `2 m$ a
aic3106_init( );
0 o# P. p! v+ o3 k
while(1);
/ M( w$ B0 N g% ]. k6 X
}
9 w& F3 Y3 S: O2 e. q6 K1 {7 c" _
- E* @7 z. n O: ]
2 U; V V; a1 f
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- f7 j& z2 H$ ]. V! b1 W; f/ L
/* Initialize MCASP1 */
+ C$ U% t8 n, ^' e
mcasp = &MCASP_MODULE_1;
3 T* G' `) h, X" V( N
mcasp->regs->GBLCTL = 0; // Reset
, L, a: ]& }; D; Z9 \( v* Z/ O
mcasp->regs->RGBLCTL = 0; // Reset RX
6 c( V8 A$ X# t+ x5 f* P3 e" s
mcasp->regs->XGBLCTL = 0; // Reset TX
3 u! I0 ~4 Y0 T7 I
mcasp->regs->PWRDEMU = 1; // Free-running
2 K" ` B% V% J. B' s) N
// configure McASP0 receive registers
2 f: K- i4 `$ ]9 D1 S$ E$ R) e8 i
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, U$ c- Q. L+ w& p. j8 c$ M- O4 Z
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- P' O. k! i. {, Y
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* ?' s9 Y o" z9 j0 Y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. U' C5 |$ t4 m- O0 @) M
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ R& m1 f* |! s) B& w! E% T/ g
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
! e: J- g* |% I; w7 X
mcasp->regs->RINTCTL = 0x00000000; // Not used
% q+ x' u& U# `# i1 h F/ I
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 _9 F# @/ w5 i' e c6 d
. j5 S( L+ p9 h3 x5 x# {
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
1 k3 R1 ?9 E7 Q
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 }) a) n/ n: ~/ H: j8 E6 t
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( y' r/ C; F+ S% N/ I
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 v9 H# c. Q- {5 P4 U, m
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, V, @* O1 S x0 i+ ^% \* [& ]$ e# r
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
# l: x! `0 ~! Z2 f, K% `
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
; r; i' ]( s/ M1 l/ L- C
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 A: E" [4 s( ]9 q
9 w6 ^# R. q4 ]- o( ~1 j6 W
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 U9 E2 w/ L3 Z- Y( j& [, `9 M
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
8 ~. w! Q$ U. x, `
mcasp->regs->PFUNC = 0; // All MCASPs
( L# P3 v7 L3 }. F
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 h9 } ~# M, }( D1 |$ p* L4 D8 b
$ f0 T2 q: n! y, F
mcasp->regs->DITCTL = 0x00000000; // Not used
1 R7 y2 G* F: @. I5 e b
mcasp->regs->DLBCTL = 0x00000000; // Not used
3 f @5 F9 t/ j# J2 t- F V" D
mcasp->regs->AMUTE = 0x00000000; // Not used
, ]. R# Y2 w+ |# q* B# g
8 J3 O8 A, X0 T! N+ n
/* Starting sections of the McASP*/
- K z% c5 B/ F9 i
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 q# N, [# ^9 X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ J) ?% T* J6 k. t
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! d* B6 m4 \0 d3 u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% g, P, N! X) a6 W" q
. I" I- A" L0 v
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# V% M9 j( |, v; m# K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- ]$ m2 ]7 }- M: l; ?. I
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 K9 @. r. [3 M& \2 X& p% ]5 F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; U# z% n3 O! H9 w, R6 X
* i- f8 _/ K: w5 x- ]
mcasp->regs->XSTAT = 0x0000ffff;
0 t) I! o+ l( ~6 E7 p& |
mcasp->regs->RSTAT = 0x0000ffff;
7 e% I$ L! d2 }0 G6 r
$ d$ z9 u9 Z2 L6 u1 y' }7 u
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& | j! j {3 q* ]/ ^' \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# A" _# c, h' b- P; U3 \7 a' h+ i
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
8 Q5 f8 r8 @, y( _& `6 x: W( X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 s9 R( m* [6 @, d9 x0 W+ C
" \1 H/ d$ I B* W7 O* c# P
/* Write a 0, so that no underrun occurs after releasing the state machine */
5 \* K" I! U1 s' y0 N" b+ \) B; e0 ]
mcasp->regs->XBUF5 = 0;
% L0 {. x& l8 u% w" A; p c
mcasp->regs->RBUF0 = 0;
# P$ T% o2 d: q; l% r1 N& v! B, R G* K
8 r* a3 D+ _1 A0 [% ~
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 T" u% {( h! |" L5 a- L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- a8 I4 |0 H: a7 H
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% X* J% I. n- z' ?, U2 e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- v" W$ ]6 a/ c* K; \" }7 j
0 Z, j% y8 |: b) c% F3 A% H
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
: S9 n0 O }- l& P# W9 g7 |4 Y1 w4 F& s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( d3 O9 l" \8 g: X5 E
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# C2 Z8 O0 |+ B9 B/ ~ U; p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 x: Y# r3 N8 m
l4 p4 t. m* d# y: V$ `7 S7 @3 F! X
CSR = 0x0000;
% d f( o7 g8 L0 O! J: K8 }' {6 j5 a
INTC_INTMUX1 = 0x3d;
) d- @% N; j# O r" v" h6 }7 }
ISTP = (unsigned int)vectors;
: V! [7 b+ Z- U) E
ICR = 0xFFF0;
7 D: Q3 b7 m; A! r
IER |= 0x12;
/ |; Z9 n9 z9 P1 k6 M/ K3 ?. Z
CSR |= 0x01;
# t; @# H8 G5 d0 B: }2 ]. k# Q
* [, m7 V; |" b: A _
- @5 _+ n5 [7 T% [! {' ~0 i; H+ z
3 @2 W9 h7 i, s+ ~- C" e
还有就是两个输入输出函数:
3 M: V# M# `" |7 ~/ X
void output_sample(Int32 out_data)
0 p5 f4 f% t- X- C; B* F1 u- U
{
F; z4 ~. w, l% @
AIC31_data.uint = out_data;
7 Q. [' C) H: u' g
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 [5 a U8 O; \* \' R
}
) q9 n$ |4 C0 w" f1 R8 C2 J
/ K. o5 `+ \0 R) s
Int32 input_sample(void)
. J9 H Y: U* Y* b" j9 ?
{
2 s5 u, R. ~: Q. M) j! i- k
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ _+ b1 b& V& d2 L" r
return (AIC31_data.uint);
' j$ j6 X! o& u# r ]
}
5 s' t4 H# a7 e# j( `5 ~9 ~6 w
4 m% v% h2 j$ M& D3 s
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4