嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- ~& H. d% H. G( _ x3 R! y
main文件:
; K9 f, ]! c8 Q* i) w8 q3 @
interrupt void interrupt4(void)
0 @; u! h9 {% z" t* ~
{
6 G, `9 D1 W7 t! _3 _1 V
Uint32 sample;
% L2 [5 i* `5 P: p o
; {' a, Z( I% Q0 C! N. V2 x b
sample = input_sample(); // read L + R samples from ADC
+ [; H& n v: b; V9 i0 g( j
output_sample(sample); // write L + R samples to DAC
/ D4 M% k$ x; N( x
return;
6 S" G( j+ f- G" o$ ^. _! R
}
* s( Q/ B- d, q1 m I7 M, ?
; |. B% I: S$ |7 t
int main( void )
( M4 r* c5 f3 I
{
% x2 Y6 Y, L. q: l
4 i$ }2 s! U' S# Y2 l. ]1 c
/* Initialize BSL */
+ f5 l5 w/ d, L5 \
EVMC6747_init( );
. b8 v% s6 w; q s: u
/* Call evmc6747_intr function */
% l; v3 o ~4 ]+ C% B& x/ O4 \! k
aic3106_init( );
+ f5 ?: x2 ^3 m/ A2 |) n
while(1);
/ F K) @1 m m1 J6 q" }! t2 t
}
/ I% K. b& ?9 N
4 O1 Y$ l) X: E2 p0 K1 Z. a
3 C6 R) u& o( [" T6 Z* U" ?
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 {& f3 v) H: `+ w
/* Initialize MCASP1 */
$ t9 @2 i, ^& U3 p5 r3 t
mcasp = &MCASP_MODULE_1;
) Q( i# b& ?: k1 I
mcasp->regs->GBLCTL = 0; // Reset
8 ?( ]. H) m( ^. Y
mcasp->regs->RGBLCTL = 0; // Reset RX
& f, o% `8 i& z4 C5 t
mcasp->regs->XGBLCTL = 0; // Reset TX
+ }' m: Y3 e# E
mcasp->regs->PWRDEMU = 1; // Free-running
& a) D! } Y; v3 F1 Z. s2 v/ C
// configure McASP0 receive registers
R( y- t/ o) ~. N6 X8 ^
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! r+ y1 p' b: p6 C7 l* S1 f$ j- b
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 Z4 b+ t- u. d! P% q* r" W. A) r$ F
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 l9 G7 ^9 n+ E. j7 p2 b! c
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 D+ t& V& ~: e3 p# Z3 ]
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
$ {" ?3 J4 b5 V8 I4 w
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
4 h* `. P% |9 v( `% g
mcasp->regs->RINTCTL = 0x00000000; // Not used
# a3 v3 `' n4 L5 [9 g
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* I- h% q! x8 H1 o+ K) }
, g) k! D, }8 I L
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
& S# a; C' t6 o$ s/ Z3 ~' X
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 D& T5 U- Q. q
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' H/ Q, j- l* v) W% M5 |
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
! @* f9 e2 K. v* Z: W0 M
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
% Y3 y' s$ K! q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 \! \' X3 G, @6 f
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
$ E! `, O) i, i' j( l! k
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# M/ _7 ?8 P% J2 h5 P) n( I
& S# T6 ]: [* l+ [
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
/ M" [; w: y6 o3 i% ^
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 ?+ ]. ?/ s, v U
mcasp->regs->PFUNC = 0; // All MCASPs
4 b& s& @2 G8 A, t! ?
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
r6 X4 \, d* O2 f* E) p7 X+ `* W1 [
, X; p5 g3 n: F% T9 Q
mcasp->regs->DITCTL = 0x00000000; // Not used
5 x; I& T6 d( y
mcasp->regs->DLBCTL = 0x00000000; // Not used
5 `" e, p2 L, z9 f ~
mcasp->regs->AMUTE = 0x00000000; // Not used
; S" X6 c9 l9 M$ [! Z
. [# q: P# P5 z9 J
/* Starting sections of the McASP*/
# [; c! n# d& {$ J# p1 ~
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
, b, m5 b0 W/ {- i" }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
4 n* ?% y1 P$ W% |: ^
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 J) o" d" `6 B+ o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
r" t8 N, R. I' E8 M ]
0 Y: w; Y3 ~/ d) N/ f
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
! o: u! R. K) \! N8 J8 O+ W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ l. A! [. w3 i/ x; O
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# @+ c- |& q. T5 [8 n0 W* W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 A. o$ ~" |' e
5 Z5 \" b( [2 D9 }, `
mcasp->regs->XSTAT = 0x0000ffff;
" B) L4 p$ L* h: u% M; g" f" }
mcasp->regs->RSTAT = 0x0000ffff;
' B* I- J7 \) _3 \ ^5 i
9 d0 E5 w! {/ u4 [$ I
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ T- v3 z3 F; d' f7 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% Z7 o( [ Z3 i7 ]; R# M5 W5 u
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 l" T/ @% \ D4 s6 {1 g8 |' C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ ?' T. y7 k* v& l
% ~# {) Y) R, |* n6 A
/* Write a 0, so that no underrun occurs after releasing the state machine */
9 I% ]* y( b5 h
mcasp->regs->XBUF5 = 0;
0 o2 I( s m: X& S# f4 E
mcasp->regs->RBUF0 = 0;
O% B- t( i! s b+ s) H1 W0 M
" o( D4 ~. n u: b! k# x+ w. K
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- k9 w) z5 x. q9 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' l5 _% X7 \5 x% ]
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
V2 x. v* p. q, H/ t/ ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
" f) w }5 A+ c L7 C
; P/ `7 _1 W$ F5 \
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! M, Q z9 h" P& k+ k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 d. D* c A% E$ @ p4 B
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& _' J1 ]9 p- J8 r/ L# c0 p: B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( G6 b9 v/ A% y& L0 c9 x* W9 V y4 L
0 J! P3 K9 j4 N0 ?. ^
CSR = 0x0000;
F; {! ~$ b) Q% @, a
INTC_INTMUX1 = 0x3d;
k, ~* A2 R3 k4 m
ISTP = (unsigned int)vectors;
# m: s7 `/ G0 t% `2 W' O
ICR = 0xFFF0;
6 I- F4 j O$ P9 n) y6 K+ i
IER |= 0x12;
8 S) f1 R% S- @' z* {
CSR |= 0x01;
: e/ ~ I* _" w2 m
5 ~; R3 E7 F$ o+ s- B- @
# f* Z. N# z" O# t* _
8 r; H6 _) E: i
还有就是两个输入输出函数:
3 Q0 z& F# Y3 Y4 @3 L+ i
void output_sample(Int32 out_data)
7 A# X, C* W$ O9 N; ?/ {7 i/ ~
{
- S- K: I4 c! N% n( I9 l4 S0 c' A
AIC31_data.uint = out_data;
8 C& F. B3 f' W/ w2 [; e
MCASP1_XBUF5_32BIT = AIC31_data.uint;
* `! }3 e h$ r7 s9 f. H1 J. S
}
2 a8 c# z; L/ }( ^8 U0 i# h
# q$ @8 L/ L- E4 {! L2 r4 D
Int32 input_sample(void)
# q8 S" w# |9 R) l
{
( V" A6 E1 A! y$ ~, R& R
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ k" ?/ l" i- ^" @ _) D G, x8 a7 L
return (AIC31_data.uint);
$ d d/ B2 a- a7 @
}
# x; i4 i2 s0 v! R) _" ?
, }5 P1 ^" C6 r% q' c1 O) R
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4