嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# m9 b, `8 s# E0 |) O
main文件:
: {3 U+ ]* w' V6 C, c8 @
interrupt void interrupt4(void)
. T. m( |) V: t9 V3 u, b& z: H! S
{
' o- u7 U$ _5 n& G) h% u
Uint32 sample;
$ w$ Q H7 c6 f/ Y6 }( t5 O9 F& b! d5 v
; z# G; s7 _" Y9 `. V
sample = input_sample(); // read L + R samples from ADC
: l- k. c9 T& ^: a- D6 L' l' h
output_sample(sample); // write L + R samples to DAC
1 H* f0 C+ r; S
return;
2 M* D% o, C) H. `' O6 V
}
e, t3 x# c* b, F0 ?7 x+ z4 H- k
1 N( [% \' }& Z. f5 O H: _/ U
int main( void )
B; N5 l! R. v# S& K
{
8 ^$ n% i9 c6 M" m! i
& X- e2 d5 O0 h& ]! z$ t/ B
/* Initialize BSL */
7 @' i% u$ k7 p, z* ~: L. s
EVMC6747_init( );
4 E" b( U( H2 v5 p" @
/* Call evmc6747_intr function */
- a" B% h q! T4 W# R q4 c
aic3106_init( );
6 p; P" I1 J6 M' W, b5 I7 b" e
while(1);
! t2 J V1 I. \" \
}
- m! E: X. t8 \/ z
% k" u) @( G3 N9 x6 ~' y
' j" j! M! L& H0 p& ~' O
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- }+ t. o4 `! j+ b" D
/* Initialize MCASP1 */
8 @/ W. s" V9 {3 ]' b& V& e+ `
mcasp = &MCASP_MODULE_1;
5 J4 I/ }6 i5 {% \
mcasp->regs->GBLCTL = 0; // Reset
* ^$ ~, A+ x# R( P
mcasp->regs->RGBLCTL = 0; // Reset RX
9 r. s; q# U& {* w1 T S
mcasp->regs->XGBLCTL = 0; // Reset TX
; N3 v# R& x* ?* R Q' g
mcasp->regs->PWRDEMU = 1; // Free-running
4 Z" U" `- N# M( ~% H, Q$ ^
// configure McASP0 receive registers
# Z: W C6 ^- j* W3 E& x. ]
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
" P, p9 R. v# N& W# s
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% i( d% h2 k9 l
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' Y7 X, h# B; R
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ Y1 q7 K/ A/ b% H l
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
" n$ x* {5 n7 f7 J
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
0 c- W0 D, R" j
mcasp->regs->RINTCTL = 0x00000000; // Not used
6 d9 u4 A% X0 C
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ q$ ~4 N+ [* ^/ H$ _
* J- r; W) T% z; j' [
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
) S. k: X, K3 P" E1 ]
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 ^+ f3 x' k1 W7 Z G& a, y" }4 O
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, s: e& e" _/ u; R9 n, P
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 j5 ^, v5 x& B4 g+ n
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- I0 @3 { l9 o# E" l& p* M
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 d( d j9 u5 u9 B& Q) L
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
( A6 D. O6 B# @- ]& b! c. h% y+ B
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 Q7 d. J2 W! y$ A, Q: I; h S7 ~
* P2 i, ?% `: J9 R0 K2 d
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& r$ h/ X T4 b' k7 c
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
& }3 Y8 }# p; h0 G" S
mcasp->regs->PFUNC = 0; // All MCASPs
* V8 V* q" `( O& `
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ P* w- B- G5 B- ~3 H& ~7 B% |. N
% m& g3 `1 M3 W/ [% q" k) W
mcasp->regs->DITCTL = 0x00000000; // Not used
6 j: a( g. Q: I, Z
mcasp->regs->DLBCTL = 0x00000000; // Not used
, u0 r7 H- @1 r
mcasp->regs->AMUTE = 0x00000000; // Not used
2 O& g" K+ i6 B* a; C0 V
2 ]6 H/ f& T9 P( i/ F- Y3 y8 R$ z
/* Starting sections of the McASP*/
+ E {2 q0 D5 T3 T: w
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' M' g$ T, e+ K8 j7 a* {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
" `# l: ?& i; O; m7 a% ~
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, }/ @' y' L& h9 R$ [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
. m+ b9 @2 C, V/ g
! y# p( t" {# W) P9 T: e
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, K) @2 X0 H6 y# Y. ]0 J+ G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ C* p2 K9 J2 O. K/ S. V1 e
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, f/ y0 ?: I. Y0 j/ F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! J, ? q1 m& i) d
0 _" k! P3 Q* m$ Q% f6 f) B
mcasp->regs->XSTAT = 0x0000ffff;
. s4 K" ?$ P9 w! @% h
mcasp->regs->RSTAT = 0x0000ffff;
2 b ~% A- [" V5 g9 w9 B
8 c; |/ O, b9 ]) _; D) X2 e
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% ?1 m0 E% H: C( g- D. E) K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
A. Y# @$ {' ?% \( e: G( M
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
^. K* N# x/ w' ?' ]6 s8 M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
' g P( c0 o( Y$ E9 d" H5 l8 ?4 P
8 ~$ V9 h9 o7 ]) [
/* Write a 0, so that no underrun occurs after releasing the state machine */
* O# H+ L6 v4 f H* O4 _
mcasp->regs->XBUF5 = 0;
- @ y4 ?+ X3 Q! y' {2 D
mcasp->regs->RBUF0 = 0;
. J& S$ S8 b6 B/ h3 Q! f- p0 P7 K
* X3 ^" W2 _& N0 I" K
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, I# e; h/ q! d5 b8 N e4 j& Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
2 i ]& y0 C% z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; s% I& h1 K3 c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
& V& K6 y4 [- C& }+ p+ Q
1 J1 K$ V. U) G
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' e e. P, }- C4 t9 ^; ?( S5 V" @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* m& Q/ G' V6 ^5 N5 M
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; T p8 V/ R' U! m6 h- M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
s1 Z( M* ?/ m- O# }, @+ S
" k7 k& S- z7 [% B8 K8 s* n
CSR = 0x0000;
u* e; V, O6 W& F# S" r9 O' {
INTC_INTMUX1 = 0x3d;
* ~2 e* V$ b! w" T6 E* T C
ISTP = (unsigned int)vectors;
5 L3 P1 W7 Y3 W x: u3 y
ICR = 0xFFF0;
4 Q- Q9 s$ M: \0 o+ Z! h
IER |= 0x12;
; O) O1 y- p+ L- j, o& m h6 C& O
CSR |= 0x01;
# N; j4 m) j7 }
1 t8 o& y6 l+ x9 |1 W% S' D4 ]
+ F( h8 }+ G5 E2 w' W- A
" R5 L6 t4 B% O
还有就是两个输入输出函数:
& i6 J) P8 D! |9 u
void output_sample(Int32 out_data)
0 ^! V7 B5 |3 u/ E! u5 B
{
- e2 l) Y* ?3 m8 ^/ b* I+ i
AIC31_data.uint = out_data;
; {$ d$ T" H. Z. p
MCASP1_XBUF5_32BIT = AIC31_data.uint;
& z, b; M1 u( u# o) g- r: |
}
. V' ~- P9 ~, s: I: ]
! z, ^* Q7 d1 i2 c" e- h
Int32 input_sample(void)
0 h" w: J H9 b( z, j" ~2 N
{
6 l3 Z' _" a5 q' k# Y
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' W, o2 f" |' [* T/ A7 h
return (AIC31_data.uint);
/ [% C& D9 ~3 I, k4 O
}
) w, W9 g! Y% k! @( J W# M
! P) K6 A4 X1 x$ s2 f
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4