嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
6 H/ a( N# y; t+ W
main文件:
) U. _- u$ ~$ r y& E- N( l! f* z% T
interrupt void interrupt4(void)
1 M& ^( E+ E! N7 c/ b
{
) i$ v4 _& N" w& w6 q
Uint32 sample;
* R' i' D0 z" O/ X
: n H4 b# Y+ R5 d2 r
sample = input_sample(); // read L + R samples from ADC
2 A F, K4 V! `( X3 S1 _: @
output_sample(sample); // write L + R samples to DAC
. g$ v b/ L6 a- N1 `
return;
6 Z, b, J3 \1 R O. @
}
$ p5 e9 _9 m7 M' X
3 W7 P' S5 o: |
int main( void )
e9 w, O* ~4 Y$ a+ ]' {$ H
{
?5 H0 e* L0 B+ g7 ?8 J
6 ^2 g z2 Z0 [* s3 U
/* Initialize BSL */
9 M$ n/ @: F* G: o, s4 V! T
EVMC6747_init( );
. g6 |, A. h4 G/ [& b
/* Call evmc6747_intr function */
( Q' o# o7 R r# W- m& I
aic3106_init( );
# B$ C2 ?. |; {( D1 O
while(1);
4 h( r. k8 [0 u5 _
}
! _2 X ]! L- g5 _
- `6 u; z+ o4 v% i9 X1 g
! a. B7 g& T# ~8 j
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& u3 U9 O. p; T5 J T @
/* Initialize MCASP1 */
' O: U* e, g3 u+ V
mcasp = &MCASP_MODULE_1;
' G+ D8 A3 J* T8 J- @! u% W
mcasp->regs->GBLCTL = 0; // Reset
/ r- ]: x* h+ m) u; K
mcasp->regs->RGBLCTL = 0; // Reset RX
% e. O/ l+ S3 H P- Q
mcasp->regs->XGBLCTL = 0; // Reset TX
0 s# z$ _9 r- j, X" N r+ M
mcasp->regs->PWRDEMU = 1; // Free-running
' x3 n$ [# y+ B6 ?
// configure McASP0 receive registers
# ^8 S F, e0 R6 E) X' i* j, e& _* R
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 K9 K, O. H3 e2 W; Y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ c3 n* @0 b p! p1 l
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* t4 z5 o% b" k& F9 w
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 G6 ~& Z/ l( U9 _8 y2 s* P
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 v/ E: ^8 g) @4 G( L* H6 k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
; a- S6 H: X U, g
mcasp->regs->RINTCTL = 0x00000000; // Not used
; d/ b8 w: {$ F; @) F/ }
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; J2 f% x8 m# K$ n; p" J+ R. F
; H1 m4 _, ?0 o
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
4 l* g$ I2 V# G+ x" V4 o& J4 b
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- e2 W1 s7 s- @) E3 q0 M9 g; m
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
: Y3 u7 Q; j* `% z' G0 u
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 s8 d( l; m3 ?
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
2 X; B- q8 |: E2 T9 ~( D1 k2 M+ b# |
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) H% ~8 E! k; H! |( J- q2 B8 W8 N
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, Z. ^8 x- d' D; g+ p Q* @0 S4 A
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; ~( k+ H1 S# o( }3 K4 G
* P5 w a# `, d3 e) r; z# N
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
, ?. U7 C' ]$ P; f1 H' d
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 ]" h5 R% K: |5 `# W
mcasp->regs->PFUNC = 0; // All MCASPs
" f1 w; p6 m; x6 L) i
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ `8 J) j' m$ E" O; W; t
) T6 T+ m) Z" N( w
mcasp->regs->DITCTL = 0x00000000; // Not used
: _3 Q0 }0 z% M! x' t
mcasp->regs->DLBCTL = 0x00000000; // Not used
6 E4 l2 b) Y3 F* v1 L+ P
mcasp->regs->AMUTE = 0x00000000; // Not used
$ o: K d' l8 J
: j4 v1 a1 S( m
/* Starting sections of the McASP*/
2 V; Z' _( B' [
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 L+ }, j' h5 j/ T7 e z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ [6 Q) e% Y) S
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
" J( J4 q( F9 A" U; ~( p- m- k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' K8 N' j5 U) w" }* g7 m; K8 s# \4 r. z
' ^4 J% U. h- c! K
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# e- Q: t1 p2 w0 d L9 A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 B# x& V# j$ f+ P0 F2 w
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' n1 K. O( X1 w' u) L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: f, h' I- | ]% V) q( _ w
" f) _+ O/ I0 G- |5 Y" t" h+ L7 |
mcasp->regs->XSTAT = 0x0000ffff;
2 t! P4 [# Y: r0 Y' h
mcasp->regs->RSTAT = 0x0000ffff;
2 k8 R2 ~# x3 @
2 x. ^. W& Z. V f& |9 D
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 [0 T& o/ s4 E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 z7 L1 v" C! W
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 `8 V0 g6 [" _3 ?% x$ W: s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- R2 Q. N3 l# e; p. T: q" p. L
Q1 K, e+ W/ h
/* Write a 0, so that no underrun occurs after releasing the state machine */
5 @! k( B5 y( ~1 g
mcasp->regs->XBUF5 = 0;
& N7 s3 Z9 r) X) \ P; {. e: e) [
mcasp->regs->RBUF0 = 0;
. @- s+ ?6 A0 C, S/ H
( N" [9 w% ~% i! q
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 }1 R( F! \. W/ d* Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 V# R' _" l R, f( }( Q( ]3 Z" Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 H, J" x% K, h0 Z2 s/ X- F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* d% _; F5 y! w! m: C
0 o- i6 W+ @2 k# f
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ S3 G% O* m1 |! u( U6 k S" `; j8 `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
: T" Z) ?# b9 l! D
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' [! Q% a+ c$ r$ `/ I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 ^5 s& b' c/ W }$ I# O
- M* a! _5 Z' x7 \7 {
CSR = 0x0000;
8 N* J5 C% ^0 Z, ~
INTC_INTMUX1 = 0x3d;
# k- w3 j/ U7 D& I: w7 P1 \8 X7 f
ISTP = (unsigned int)vectors;
, s$ X7 Z G! Q4 `: W- x. t
ICR = 0xFFF0;
7 g5 R* C$ O, s1 ]2 o0 c
IER |= 0x12;
' x' N8 J% f; ^- g1 P* f1 I; Q/ b
CSR |= 0x01;
, t# Q0 A3 E6 b! {
# P k$ S1 @+ d
3 F. F. l# E" A' w. P& X; e3 V& \
/ P5 S' z7 w1 t$ r. x2 l
还有就是两个输入输出函数:
* m& T# q* ^* g& }7 ~ ~
void output_sample(Int32 out_data)
) e. H. [2 W3 n7 H o
{
9 I4 L# `) d, W1 Z7 @9 E4 Y
AIC31_data.uint = out_data;
8 `* u4 H( P& _7 j
MCASP1_XBUF5_32BIT = AIC31_data.uint;
6 }& Y# o* p) @3 q, @+ \% F
}
) E0 p3 `" U9 R0 ~! t X* G
! P U' {/ f; A/ J7 T: M
Int32 input_sample(void)
S0 U& j$ B8 g+ P+ G
{
; j2 @' t; A+ J' K% c" K! Z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; d. h, G3 j% o
return (AIC31_data.uint);
, h- K: y* W4 m1 v* U4 v
}
* a' t3 O0 j' s
4 @+ K4 _& C4 I; ] k. t
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4