嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& E- k0 n. ~" U$ y
main文件:
* c1 L# {( _; s2 O0 s; P9 \# }
interrupt void interrupt4(void)
& h8 w5 u% A7 o% \# i. B {) z
{
' A! m* g _1 v& \* P
Uint32 sample;
' ~9 g2 z! [4 t+ R6 ]( H# v: x
, E z2 I: ~& @
sample = input_sample(); // read L + R samples from ADC
# V9 N6 q, [ ]7 H
output_sample(sample); // write L + R samples to DAC
* v5 z! K& ^9 h. K& N" x
return;
5 c. F0 ^5 L2 A5 s$ e. w2 [" \
}
# G) p. b3 r0 o: [
4 a! C* g/ \2 q$ b2 V
int main( void )
1 {" I; M3 ?" R! f0 t
{
! U$ R" l5 \1 R7 h, d( V
7 Z: x" s* ^ \: q8 q
/* Initialize BSL */
% B) h9 T Y+ F
EVMC6747_init( );
6 F8 y ?& u) H6 R& s" w
/* Call evmc6747_intr function */
7 L" V5 q; y; a+ c: i
aic3106_init( );
" A" o8 N& N8 W+ @4 h( W
while(1);
3 X8 t8 a7 [" Q4 z7 M1 J( d
}
* [! V# ^5 f7 v8 l- q% y1 ]
& v" p% k5 j) G$ k! m
# v/ l" e6 E! v( ^+ ^1 M" B1 V% @
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. ~3 f2 N' \2 M7 [2 m2 U* E9 Q! M
/* Initialize MCASP1 */
0 s4 n1 A' |; b1 ^. G6 D
mcasp = &MCASP_MODULE_1;
6 l9 s, h% Y7 g' {
mcasp->regs->GBLCTL = 0; // Reset
. u- N8 L5 Y6 r& _+ k* X x- c
mcasp->regs->RGBLCTL = 0; // Reset RX
0 M0 S" h- k! m; |
mcasp->regs->XGBLCTL = 0; // Reset TX
$ M7 e! {& o: L# K
mcasp->regs->PWRDEMU = 1; // Free-running
& c. K6 { o# W2 e3 z. Z( R
// configure McASP0 receive registers
8 G0 ^ B! n" _/ V2 F4 L
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
o1 d! C. p7 ]; d$ T+ T! t( P
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 T; X5 ?6 I$ z
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
! B) H6 D0 _- B" u
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ Z( t4 V2 D, G+ ~5 g
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 z2 H- b l9 U( I) }4 l. Z1 p( P% h
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 h, b' C3 X6 z! I% _3 V
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ p- o0 }& y, f3 T+ p* b
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 d; | `, ?0 A8 u
, c0 a7 M' w9 `" |8 _
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 s. n4 G: n1 q; a. {, B' z* W7 }0 \
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: G4 E1 e+ p0 ?; R$ b) P, j3 ^
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, ^1 m) p+ ~% S3 t( j6 t' p; y8 }
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' p7 f, ?: R8 t0 e5 s% S2 ~# k
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
5 w# E7 [7 [# P( H$ m, S
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. V2 l8 o% f* J: v ~% w8 K
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* |% B* K" I1 c3 t
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: z3 M3 C7 ^' R+ a
5 l: E$ U8 @) x+ O. V2 A9 G5 n
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
f+ F% X- @+ ^ m
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
6 b: F% X$ S7 _2 n b9 |
mcasp->regs->PFUNC = 0; // All MCASPs
3 \! F, o2 O: r7 c5 s8 ^+ B
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* T6 t/ c4 Y2 `3 s9 ^
) P& m& k+ X' h3 a
mcasp->regs->DITCTL = 0x00000000; // Not used
) J% h1 C7 u! A1 c
mcasp->regs->DLBCTL = 0x00000000; // Not used
/ X0 X, F* A. k( U5 F
mcasp->regs->AMUTE = 0x00000000; // Not used
( n3 n8 v Y3 \- p0 i
+ X, G# e, E8 Q( z* c- b4 J
/* Starting sections of the McASP*/
0 x+ }- U6 J3 U8 B: Q5 K0 d
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( V6 X' [/ C9 M3 Q0 `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 D7 I$ c% ^+ w- J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
: s8 I5 C3 f! U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% Q, ^7 b! g" M( G
- ]6 I. n: e- y0 \% ^0 `& R
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. X) X3 S5 s2 S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 \; ^+ U" l) }- \: w4 u
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 X4 O5 l6 |+ E/ j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
2 d* z* i6 Z# }7 |" l. Z2 t& g* q2 a
# |3 b) O3 X! I, l! N; ?) Z `
mcasp->regs->XSTAT = 0x0000ffff;
9 [/ e( W/ y, U4 _. L
mcasp->regs->RSTAT = 0x0000ffff;
8 {% \+ x) R9 W) J# T& `( c
1 h9 y' V2 F8 b; t2 |9 Z5 w
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 @9 B1 ^3 f: Y! |2 E/ p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
- k; b1 ?5 j7 d- t2 b9 [
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 K; S. _$ a+ B# l# k2 ?/ J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 b+ |* g$ ~/ w+ ]# y, ~
( C% n( E6 ]! \
/* Write a 0, so that no underrun occurs after releasing the state machine */
' b- W" x' @ J7 P& M0 x1 I
mcasp->regs->XBUF5 = 0;
7 W/ F$ z: x; o3 x
mcasp->regs->RBUF0 = 0;
V: c3 F3 l: J3 S0 P% X- O+ N
, ]0 H6 D! ^/ \" ^0 k4 s0 l
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
+ {* P4 {0 E+ K* h* E/ a0 z0 I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 E1 i' v ?2 o: j. R
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 i% R5 m7 @# l5 |8 X1 f. Q& N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 |* T( J1 i Y# x1 |( T
- ]6 Y4 t. U% D
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
6 `. j' e$ p# G A7 |9 ^. ^" Y' g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 s$ F5 Y5 s* d! i; E; `" ~
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 u4 ]) J, V& Z# v" P ^- a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. I6 g8 l$ I! o# E* o- t
, v d% _' n) U# f
CSR = 0x0000;
+ x+ x" _' ]- b: g
INTC_INTMUX1 = 0x3d;
. l8 y) ~3 K* {$ X
ISTP = (unsigned int)vectors;
* n5 K. ?: v6 B! p/ H
ICR = 0xFFF0;
; L4 K( [1 P5 R8 n8 x8 K/ s
IER |= 0x12;
4 `; {/ B3 O! L( L
CSR |= 0x01;
( o, X; x3 X" p: w3 a
0 X( S4 l( U. e+ m, M2 X( Z
6 p b4 L) F1 V" B6 m9 C1 {4 `
3 Q4 b1 E3 v5 K) U0 w% ^# Z. C
还有就是两个输入输出函数:
3 G9 B; N }9 v) x
void output_sample(Int32 out_data)
% A+ e' _) V/ l% I
{
3 ^. L u4 v: Z
AIC31_data.uint = out_data;
6 D4 @4 v3 ~2 Y6 \- N2 q( ~9 g- ^
MCASP1_XBUF5_32BIT = AIC31_data.uint;
( M; y }. x8 {1 Y% ^- z
}
. J: K% s$ z* l! g+ U, q
; E. N7 X. ^$ T$ R) S: }
Int32 input_sample(void)
4 E6 F8 _" M% ]0 y8 ~$ j
{
& z# F# B; J( K- P( _' f- t$ Y
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' o* @* z7 _ {3 s8 i
return (AIC31_data.uint);
7 T% [9 P1 W' [
}
+ K. Y' m. _, y) j
' n% g5 ]; G( w: T/ ~! P
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4