嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% l7 G% E: Y% L: d8 {
main文件:
9 }: ^1 b7 I1 ~0 ^( T- |/ Y
interrupt void interrupt4(void)
o% y: u5 m: H, b
{
- f: M' E: C+ c) P1 w
Uint32 sample;
8 S: B( l" y; d9 q" t5 Q
$ Q3 X$ r# [; q4 ^9 W7 U
sample = input_sample(); // read L + R samples from ADC
- i# f+ l0 ~' I* D
output_sample(sample); // write L + R samples to DAC
/ y. T0 U. E" g+ i
return;
, z- `$ C- \! W' l! d* A
}
& K0 j/ r# N/ x1 {: j4 S
) [+ d( |2 I$ c, T7 X5 c, h
int main( void )
0 O: \, j# \7 [ g
{
c7 w' F( z: q' L/ K+ Z
" N/ \+ f" g$ ?) T; I
/* Initialize BSL */
8 k. Z+ G# s4 A/ |
EVMC6747_init( );
2 f+ w/ f n1 X% d
/* Call evmc6747_intr function */
# t) ]& R2 Z( `! e: A
aic3106_init( );
( o) p# H }3 N$ m' a, W
while(1);
% }( J, I& s0 \3 Q
}
/ @+ K* R2 h$ S" o7 p
4 _7 ?9 G/ H N; B( l3 Y
* F# ~ [# `& O. S6 r
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# e% ^% ?& E/ n. j9 \2 [+ I! r
/* Initialize MCASP1 */
% |" S) Q! z% e1 c& l
mcasp = &MCASP_MODULE_1;
& k! _: s$ C- \3 i( r
mcasp->regs->GBLCTL = 0; // Reset
: f) H+ @- t9 S E
mcasp->regs->RGBLCTL = 0; // Reset RX
$ ]+ d! y* b8 I8 W3 b
mcasp->regs->XGBLCTL = 0; // Reset TX
s* Z3 x) _; z8 n$ J
mcasp->regs->PWRDEMU = 1; // Free-running
$ n8 c* l3 F, I
// configure McASP0 receive registers
% x- p6 w/ K7 E1 i
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
# X3 ~0 ]+ r* C8 D9 j
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 y+ {" I: q- g
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" T# r& }0 j# \7 i7 F' w
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
Y. A7 X% [+ Z) r& u! w
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
+ D9 z, e( p5 O( |0 t4 e
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) r% e+ z7 d, V9 n" W0 ^' e
mcasp->regs->RINTCTL = 0x00000000; // Not used
5 N6 W: e5 W0 a+ }
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! j# ?9 \1 D, y6 e
% H/ @& x0 R& Z
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
4 p4 l& V: Q. @2 B" v
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- j C7 i, Y; g
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
. f& J) ?& l# B/ l9 |0 l h% D
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ u! M$ ~, _* {6 R0 `3 r& l3 {5 Z
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
+ n# S6 M' T- G8 {# L4 m
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
- [/ L+ j, g# T1 ~
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
8 ^0 F4 y; s, L) }
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 c" b, [+ V2 i" R9 S# R+ k$ Y
! g+ h! h" \+ @1 \+ t" t, [1 } l
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& W) S h& x& s, w
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
. E2 v( R1 z) n! S
mcasp->regs->PFUNC = 0; // All MCASPs
% Y2 A0 y/ j3 Z
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 y8 n4 ~9 Z, S$ t
% ?9 W! u3 d! t
mcasp->regs->DITCTL = 0x00000000; // Not used
; h+ ^5 r; n* y5 i4 i# Q$ c ~/ ^: j0 n
mcasp->regs->DLBCTL = 0x00000000; // Not used
! P/ a: Y, n: ?
mcasp->regs->AMUTE = 0x00000000; // Not used
& ]; t! C1 m3 H2 g# o _2 h) Z2 h
/ y1 F0 g a% a5 z& @4 Y% x
/* Starting sections of the McASP*/
( e0 z1 }! R3 X7 y7 J$ h
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 [# G- n0 g% t, Q& \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
' c4 o9 [, D% l, g X" t0 f8 C4 K$ i
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
\: w6 x; w2 n; r8 z* _& h, |6 G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 y: X5 ?9 q# z$ j
' Y% I% f. G0 m% a) b
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 e; @4 U2 S0 ~1 X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: m2 L) P# b8 }. V2 Q1 P' \
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& n' n1 V: I2 g* }* I3 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 s; S' P- ^$ `& R: O
; D8 p, d8 ]+ w* z
mcasp->regs->XSTAT = 0x0000ffff;
. l5 a# g8 W0 W: f7 w
mcasp->regs->RSTAT = 0x0000ffff;
+ N/ g7 x0 F* s. ?1 b% j! W% p( ^/ L
* P) [1 S5 X( V. H6 A& X1 s6 B
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 [8 a8 [) g8 a0 m8 c) ?; i% x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 u) e& b H: U8 t
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ p* z6 m" z6 v7 f: q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 A) p+ M$ P* H# J6 ^$ f
+ H9 c4 x$ k; u7 ~; L. C9 a
/* Write a 0, so that no underrun occurs after releasing the state machine */
3 E+ s* z: F6 Y, U) T- \' |. ~( z
mcasp->regs->XBUF5 = 0;
d1 {4 i- S+ N) N1 o
mcasp->regs->RBUF0 = 0;
/ b/ ]9 W" _; b# j
4 p2 W& e1 z# H& ~. m' m3 D$ N! B7 N& A
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 X% O# F- C3 C# u0 k4 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
L- O: ]. O/ @: U
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 Z0 f7 t9 g$ \; ~$ \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
& v. s/ H8 R( r' V
* g6 l# Z" I- R9 o$ ]. B* I, ~
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
9 Z# N7 E4 L9 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 \1 k# e' z9 O4 d6 B7 Z4 F; I s
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
o. D0 u. u @$ ?( w) ^( m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. B* K% v4 D* }# B# j
: L0 V, ?* U/ M
CSR = 0x0000;
3 m3 |# L: k. G1 W" R
INTC_INTMUX1 = 0x3d;
) O" c: T/ f+ @7 o7 i
ISTP = (unsigned int)vectors;
5 g) I6 F# V/ E+ A; \# V% m
ICR = 0xFFF0;
8 Q" J) Y5 N3 M* Z% H
IER |= 0x12;
1 P' y% l, @5 w' |# z
CSR |= 0x01;
& h# M2 h: k: X+ e+ G5 @0 X8 u
3 h! V: W9 q6 j+ W0 A+ r2 U# T
( O+ J7 ?4 s6 r9 Z! j, {
$ P" B: M; ]! g* ^5 k1 L, Z
还有就是两个输入输出函数:
3 L' C/ K: A: U. F3 E4 p
void output_sample(Int32 out_data)
! h) j* {0 A) |7 x1 n" |$ }7 ~( O
{
$ X, p/ A5 m1 z( c. z, k' `0 E
AIC31_data.uint = out_data;
H* `$ A1 G% M% F0 l6 V: K
MCASP1_XBUF5_32BIT = AIC31_data.uint;
; p# F+ K5 M! m5 |
}
" e+ H# f1 A2 q2 b* ^3 d. `
% M' T; \7 Z. @0 I" N
Int32 input_sample(void)
: s4 {7 F3 S* a
{
! F( i( w9 t! m+ M) `7 |
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ J {& P. r7 A' F
return (AIC31_data.uint);
: F0 S% [; T, i3 f- P% ?' U
}
1 G; j- ^# U9 [4 G5 P8 R
* y1 N6 ~+ u8 y- V% g
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4