嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
X2 r: U- \ t" q
main文件:
$ j9 H/ E6 k( O# T
interrupt void interrupt4(void)
3 q5 d) G, E5 C, t1 B* g) s- N
{
7 f2 V( Y$ K( a4 m0 _1 z
Uint32 sample;
8 h* t: v8 Z, V! R# v' \
1 x( y9 u! b/ P. W, J _/ E1 X
sample = input_sample(); // read L + R samples from ADC
% j5 v: Q) h }1 o# f9 K
output_sample(sample); // write L + R samples to DAC
! H4 n5 [, F6 d9 I! \/ Z' e, \
return;
8 H. d& `9 C9 {( `* S, r
}
2 d2 a$ p+ \) y" I8 c1 b, z
) y( s) j' z2 @$ h% w
int main( void )
2 H! V8 q! u' {; j/ e/ Z+ u
{
+ L/ e8 e- l4 _# | D. a! j+ m
5 ]" b6 _- u0 v) ^5 {+ ~
/* Initialize BSL */
% D6 f: w$ b# b2 {
EVMC6747_init( );
" J* U$ b( J* A" d V
/* Call evmc6747_intr function */
/ j6 |. G4 t: g$ c& ^8 Y0 R
aic3106_init( );
, P* x* o) i/ M( b
while(1);
9 K" @3 x" n# S- L
}
- D2 {6 {: c# d$ B/ {3 j5 j
2 K6 X1 \( a+ l: E; ?
# {1 ?' V+ F) G' m) \
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
3 O4 p0 C7 r, W* N/ c n* @
/* Initialize MCASP1 */
2 A8 C, u: ~( u9 c/ \
mcasp = &MCASP_MODULE_1;
* t! `- J) A7 z/ k/ ]6 {! Q/ Z
mcasp->regs->GBLCTL = 0; // Reset
/ V( v. e4 l' k8 R8 s4 K0 _" @
mcasp->regs->RGBLCTL = 0; // Reset RX
?. ? s4 ^2 p( @# B0 q
mcasp->regs->XGBLCTL = 0; // Reset TX
z# }4 O6 b u
mcasp->regs->PWRDEMU = 1; // Free-running
# N( `, z& S- X4 C2 \( g. S2 Q9 n
// configure McASP0 receive registers
0 C, v e* k$ `9 V! k5 E. h
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
* U& F" F; C/ _& v9 i2 K' N
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ H: ]5 i& R ^7 O
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ W1 `3 W' ]5 q. V. _
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ M: W* _, X. M
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
& D6 H1 I* R/ \. o/ b
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' T, @- v$ w: c% |
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ h# T' ~' Z9 t9 I a
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 U" R0 F8 z; u+ X3 Q
+ T1 ~$ w% z# H5 p% L; F- H# a
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ Z8 v' X4 x9 @7 M$ L; ~6 V$ H q$ m( x
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 S% Y' a# ?, b6 M& z
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* q& {7 I8 k4 H* E. b4 p
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
. p" |4 Y0 ?; N% X
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- x) Z8 Y( P' J/ `
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 p' f% V q" Q$ Q* E; {
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 _1 Q& l: Q+ W2 c
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
I5 z+ L/ T6 v, B
* o7 M4 r4 f8 G c4 k
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
. Y1 p9 U2 x% K* M6 n4 ~3 i+ O
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
/ [3 `; Z6 E1 H1 y5 K
mcasp->regs->PFUNC = 0; // All MCASPs
* Y/ f2 b2 R+ Z% X! P: |* [: p
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 w# E( }2 j9 K" \% P0 ?( z
" s* A1 ~; i9 Z
mcasp->regs->DITCTL = 0x00000000; // Not used
4 p) T) F9 V5 V
mcasp->regs->DLBCTL = 0x00000000; // Not used
! u; P2 n# h2 r
mcasp->regs->AMUTE = 0x00000000; // Not used
' m" y0 u5 Z( `
& X6 L/ t- J- ~
/* Starting sections of the McASP*/
5 d' {, _; Q+ E. b
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 o# ?/ f8 b6 R3 m% {; j( N1 `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ C# P8 p$ u! R& q( D9 I" u
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% j9 Z9 C s$ H, F$ b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 N+ j9 j; y9 b5 a4 K0 P
0 T0 U/ p1 d! W, o+ @# A+ ~
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 r' B$ M. V2 P$ `/ C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
~( w) U" ^/ I7 `) Z! G
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, G6 `( n b% M5 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ h( K% @+ T/ d
- }' [( d$ M2 E
mcasp->regs->XSTAT = 0x0000ffff;
; ]( i$ s4 v/ f! h2 P" o
mcasp->regs->RSTAT = 0x0000ffff;
, U3 c% d. a9 U* H( }) V
1 @1 I/ X) L/ O. M, w% L, c
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 u& M6 `* V' I2 [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
' K4 w8 R# S) G1 i" {
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" o+ ]9 F- Z: P' W0 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* `+ n' H- C* b' x- T( ^* Z1 P
8 r# m$ f5 x3 o
/* Write a 0, so that no underrun occurs after releasing the state machine */
. r0 O1 Q4 Z. X0 ^4 H3 y
mcasp->regs->XBUF5 = 0;
* L2 }' A7 V. h& d* p8 T: s: [5 p7 N. J6 Z
mcasp->regs->RBUF0 = 0;
) z, L; T, W5 G( A; ~1 h2 p
( s5 G; l) ?8 {# M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" u2 j* @9 r) d0 `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
2 n% b$ ]. Q" H5 I" c4 x: U. }5 \7 P
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 d- j1 ?9 p ~+ j U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 }: y+ Y" |1 G5 H3 D
* q: Y3 m% a7 _
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
9 b+ f9 t P2 E# l; D( {8 q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 l f6 p- p- _' q
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
% U s+ o( v% \9 L" i6 A- T4 v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ O1 p& O, p! \7 h2 Z; ~
6 l( P5 j; p7 a; d
CSR = 0x0000;
: h& H, @) |; H2 L. u
INTC_INTMUX1 = 0x3d;
4 D( W. S# C3 }4 k- D/ {# `% C
ISTP = (unsigned int)vectors;
2 _* ]# y- |* X9 s
ICR = 0xFFF0;
5 X* _" u5 G8 Z. v! g2 N H
IER |= 0x12;
( x) W. V) [/ c$ f. l
CSR |= 0x01;
# e: q- p2 z" |& U- r" o& c, O) B
2 q2 l! B+ Z- I1 R S
6 P5 d: ~) n) M! _
- V7 U4 {% q$ W# i5 B( N
还有就是两个输入输出函数:
1 h R% M9 B& H9 p3 f; k% E
void output_sample(Int32 out_data)
2 Y5 u8 _ c$ I% K% n! v" a! m. b! s
{
1 ~0 a1 f+ Z/ N& z5 g' S
AIC31_data.uint = out_data;
/ S P p& ?) t. q, N; M$ |- E; z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) r# v; t% c6 T p) B# u- t$ v
}
' N8 |, l+ G, `5 C
% t4 e, g+ a$ a9 d
Int32 input_sample(void)
9 L+ @# H e$ T" S5 G$ O
{
, w! m4 ]- r' V3 ]3 T( ?
AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 S2 a. W9 E7 J9 {0 }. G; S! B
return (AIC31_data.uint);
! T! o2 E+ }' u: w; `- Z' `
}
. X. t# v1 f/ j+ e! }6 u- I
2 Q! i: _& q# W/ `) T6 K4 [
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4