嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" U0 x& U0 q& Q* r8 K) \6 B' W
main文件:
$ v8 l; r" N2 L6 j$ f( n
interrupt void interrupt4(void)
: J: z q6 s) X2 A
{
# A8 o; A/ b- ~- b, w, s) N
Uint32 sample;
/ H0 c1 M/ b7 b8 Z6 z+ @, t( V/ z
: r5 e% P# p5 X! L$ A9 Q) T
sample = input_sample(); // read L + R samples from ADC
. \6 V- e' k. y1 A- W* G; r3 y# S( z) T
output_sample(sample); // write L + R samples to DAC
6 X& x- k2 O/ E k5 A: Y. `
return;
# F0 G z6 @7 j
}
- L! ?! I: j. n" O
m" A! u+ ^7 g. D' l- Q* J7 E
int main( void )
' s6 p* o. a; l! b; j) Y; [- P3 k9 ^) _
{
" A" ?5 z: ]& {! a9 q( M
5 ]7 [, R, L1 t! A: c/ c5 Z
/* Initialize BSL */
8 F0 ~9 } c% q% z1 U* Z
EVMC6747_init( );
% G# [3 T2 _6 |# D/ E; i
/* Call evmc6747_intr function */
! f& b+ x. G3 H7 p, e; T2 E
aic3106_init( );
! p0 j8 [5 j2 O ^
while(1);
1 R% u/ M+ A( |. U
}
) N6 z6 X& E. V# w! L2 \2 D2 d
A& n$ R0 I! N+ K( x& K
6 W: c3 O' F- D9 h& q. Z- d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
E6 B2 W3 @) s1 F
/* Initialize MCASP1 */
- P4 p' @% Y* U& x
mcasp = &MCASP_MODULE_1;
; a9 [4 O7 e9 t' a) P/ \. M8 B# B
mcasp->regs->GBLCTL = 0; // Reset
' r+ W' r) t/ T; i: q
mcasp->regs->RGBLCTL = 0; // Reset RX
# D3 t' p# L1 M. | ]
mcasp->regs->XGBLCTL = 0; // Reset TX
% L6 l( Y6 C/ u4 U8 ?+ ?- w- m
mcasp->regs->PWRDEMU = 1; // Free-running
- ?% W" |, `) a5 l6 b2 T+ \. L: l
// configure McASP0 receive registers
7 k: A' x" {! U2 X4 u: u. r
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
& @6 k$ u# M2 h/ C" [
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 e9 q9 C5 @) m Z3 s
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 r2 T! I8 n$ E9 I* \; _) E: a! i
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
1 z( ^: a3 D% p$ c+ {
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
: o+ \1 R- H; N6 o
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
6 [( @. q ? u: J L d- T5 h5 V; ]
mcasp->regs->RINTCTL = 0x00000000; // Not used
+ [- _$ g4 H c3 E+ B% F
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 k K) c7 C" l4 {: T
7 R' {$ Z# {; g& ?. w. [( [- y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' P) P0 a- z+ o9 j3 {* l1 A
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) ~; r# q' ^% H6 i. {
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ D/ P; Y* l1 Q
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: c' o3 T+ H! `$ ?7 e
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" \: F1 \3 x$ K% T% X* Q7 k4 P8 N
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
9 r2 h, L0 _* _8 j
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* `" r- d" M, [6 D( w K$ |( C1 U
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! q* [3 q3 |4 S5 W
+ z& c6 w1 ?1 I. H2 ]! D5 e+ `
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
# e' {. _' L7 M- m. v. E( H
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
z: S p6 l+ J; ]6 ]* |, c
mcasp->regs->PFUNC = 0; // All MCASPs
$ T b+ W2 J1 r$ W
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 U- |% F) [7 s" v) R4 H6 }) S
% E* x3 ] \* `3 a; v. l
mcasp->regs->DITCTL = 0x00000000; // Not used
8 C# t" W/ b$ H0 D! b. n" J" h
mcasp->regs->DLBCTL = 0x00000000; // Not used
) K; P7 I3 C4 c& }: ]; v. I' E+ z: K
mcasp->regs->AMUTE = 0x00000000; // Not used
: X7 l1 b! E' \) Z3 i* w
* z) L: ~% I, ^, W' d
/* Starting sections of the McASP*/
/ ~/ a" @3 x" ]8 O @' U1 Z+ |
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. q9 m# G+ E% |) U, }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
" S, ^9 e' s+ v4 A- w
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- K8 P2 x5 o0 N) O. i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 Z% M4 X% ~5 ^) s
5 w4 S- @* K2 k/ W! m2 w
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 {' M0 a' T; S1 W& o9 X6 H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: U8 n" L& u: q/ ]5 p4 G
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ `2 W( Q% m# w& G. ~* ^' \4 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
\/ e8 R$ F# b" ~% a( r
' ^2 P ]5 i3 Z3 E2 B; m
mcasp->regs->XSTAT = 0x0000ffff;
+ m5 a. f ?9 _. | ^' P' V" U
mcasp->regs->RSTAT = 0x0000ffff;
& ~1 Y! b2 U/ a3 _ P; ^0 o6 H
. X# W* E% |7 w% O/ d
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
, L8 R; @; m, h3 s4 G3 X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 c: d, z+ g* V: i p
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& h1 h$ ?0 z* ?) k% d5 L6 B W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 }' ^5 \* C$ A
9 W$ o4 Y; p; N4 `: w3 |$ _
/* Write a 0, so that no underrun occurs after releasing the state machine */
, o4 c% Y4 J0 e. o
mcasp->regs->XBUF5 = 0;
+ x; C5 { x' ]- x* D
mcasp->regs->RBUF0 = 0;
1 M2 \8 Z7 Z+ j% O1 B( b
" Q r. ~+ z2 E: ]5 p' L1 o
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 z9 n. M+ { N! U9 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% J- ^1 ~/ T4 s- B& g, W& Z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 e5 s0 R1 M/ d: G" T5 \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 K6 p% G4 A2 N0 x
. [- j/ J7 r. T) S, u% i# g5 _" i
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 u9 D& q( o3 s: x1 N* [# J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- b8 D$ Q* T8 t1 t5 r+ s
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" q' J( {1 d0 c* E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
) I# H8 A8 E; q
b8 ]! Y8 p; P% L% B
CSR = 0x0000;
$ y# n: U* B7 m; g9 Q
INTC_INTMUX1 = 0x3d;
0 x F2 w. F, i( c4 W3 }
ISTP = (unsigned int)vectors;
: \6 {/ S# Z: _9 Y
ICR = 0xFFF0;
% l8 C: `; ?1 T' `+ P: K
IER |= 0x12;
% c3 T/ w$ b* O6 o+ @3 H
CSR |= 0x01;
, r, P ?+ X; [( t8 v
0 T( L& _- w. A- [, P" @
: @. }9 Z; ?' I* i4 }
; n* R7 p* C2 \! ~
还有就是两个输入输出函数:
. ^- F f, x( x6 `; Y B
void output_sample(Int32 out_data)
9 H L4 M6 Q- y5 G
{
& W; y0 q! |' {$ O1 z
AIC31_data.uint = out_data;
7 {$ N8 [7 c1 K+ n% }& U6 q
MCASP1_XBUF5_32BIT = AIC31_data.uint;
" k( H2 R1 J% \5 S
}
2 o" y- R) {% b4 |# i! ?
1 }8 L3 l* E& Z6 W
Int32 input_sample(void)
7 e l' T9 r: `2 C6 Y0 O
{
+ m Z0 k R& }: y
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ m" T# V Y; f% V9 I, W
return (AIC31_data.uint);
" C0 F& [6 n1 B
}
0 C! W& o k, H& {' X J
" u3 ~5 l( A2 u1 D! {$ p
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4