嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% |) N$ _) W8 `* E( E8 M8 J
main文件:
# a$ g7 B. p* i
interrupt void interrupt4(void)
# D- s! ?. J, C" L# L# ^! d
{
# V6 S) v P: e. R3 D
Uint32 sample;
3 |+ p& x& R5 [. ?
# h0 @/ }# k1 {2 z: W: G1 b% m
sample = input_sample(); // read L + R samples from ADC
3 U. f' j) f! ?4 _; }. F
output_sample(sample); // write L + R samples to DAC
% {* \7 X3 w* C( v3 `; q
return;
, {/ G+ _- _5 J% V8 F
}
3 B8 @2 Q+ X7 P/ s5 h
6 _ X( a2 Z% V# r/ b
int main( void )
4 P& |7 b/ t# i7 ~, |
{
# X, O1 h9 F9 y Y2 }7 X2 F+ M
0 G; \6 w3 a" o5 i
/* Initialize BSL */
$ B) P$ \! r' f& z
EVMC6747_init( );
$ n, \' c6 @+ _+ E( J
/* Call evmc6747_intr function */
# P6 i3 X; J# v2 T2 h9 B1 x" Q
aic3106_init( );
6 M3 E% z: X. l" B. B
while(1);
5 a8 H9 y" t% Z% b
}
: C( J9 O6 }& `
$ c$ j2 Y$ e1 q
, @; E# X; {* ~8 V' _) G
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- m+ \" `, t8 V
/* Initialize MCASP1 */
3 n) r/ p( ?8 t- s7 q6 ]
mcasp = &MCASP_MODULE_1;
6 \( ~- `5 f' o: Z$ u5 N6 Q* H
mcasp->regs->GBLCTL = 0; // Reset
j6 d. Q1 h8 H( F9 f9 M4 i M
mcasp->regs->RGBLCTL = 0; // Reset RX
6 i2 ~& X# W( p \5 M2 p) v* t
mcasp->regs->XGBLCTL = 0; // Reset TX
. C$ W: F. j u# G
mcasp->regs->PWRDEMU = 1; // Free-running
; ^1 S2 G( J, ^3 s! \0 z
// configure McASP0 receive registers
( k u9 l( b& @% U. ]: M H; \
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! v- r6 z, A w" V* ?: P- K
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# t+ J! n& R) M: C4 \3 A8 b, d, ?, X
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
- T- d1 [# j4 H
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 g. f; Z9 r/ F
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
% B; O1 U6 s' w3 Z( R Z9 A
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ B& L: z+ L) U, C9 q
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 \) A# P& J8 B# W- p* m, ^+ `2 Y
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 P5 J: I" }4 K! c9 M6 U, T
: q5 ~$ ~5 l" K/ O$ ]: l, o' M* R8 o
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 g7 _/ j# x! Y0 I: f
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 |6 l/ Q9 W% \, Z/ C4 P
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& n+ t8 [! L: ]& j1 M& d
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' { @& @9 F' J1 {4 r9 w
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
. {! z6 B. ~" T5 Q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 ^ w: A6 x! ?
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, \) M* C, G* q/ u
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, j7 s' u3 l3 e! l# t( V% \6 V
' A( `+ n# n7 }/ r- ^
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 u5 U) X$ h. x
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 J2 {6 G8 O3 A6 C6 g0 K! M
mcasp->regs->PFUNC = 0; // All MCASPs
. m" [. N( e- R3 y8 \/ S# y q
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 `8 ?; ?8 E m8 R6 h% h
6 A3 U2 n* }# ^9 V" W& Y
mcasp->regs->DITCTL = 0x00000000; // Not used
% |1 F0 [/ u: q! D6 m/ P8 U
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ l* {6 b- h- @3 w, _5 J
mcasp->regs->AMUTE = 0x00000000; // Not used
- x. g7 ?" \) r+ [, j
5 d2 ?8 g9 ]* }) t
/* Starting sections of the McASP*/
" x, {$ _% b: j9 N
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
, Y, r$ I' d) @) E5 ~* h& A ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 w1 w) W% V3 ~7 O( {
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* _" L3 T1 q# G, u M5 G! r W& b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& y7 _, I. u. P E8 O: t& y( n" o& ]
# }5 P5 W1 Q4 e+ Q! J
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ b* L+ O8 V- I. d! x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 n3 i, P" ^' W; ^7 c% V; y8 Q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" \2 o( _) w' Y' y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 a( N5 y1 O/ o/ o1 j# ^
: E: g1 W. W2 d+ |8 _
mcasp->regs->XSTAT = 0x0000ffff;
9 H2 R* t' U! l
mcasp->regs->RSTAT = 0x0000ffff;
/ L f6 h9 S1 |' O2 Z# a- `
2 r8 \* p' p9 z* N7 N0 l' `
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' v5 u! a; H) q/ W* p5 I7 r$ x; Z5 d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! b* y4 K+ A: z. ^- [/ }/ D+ T" ]6 l
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& q+ i) }2 S# I- {, k w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ P9 K, z) U" Q* D0 W
4 {" {2 n' P' j
/* Write a 0, so that no underrun occurs after releasing the state machine */
$ l' f& R: r' ^ F9 Z7 d; j$ ?. ^
mcasp->regs->XBUF5 = 0;
" o& {- X! Z, f8 Y
mcasp->regs->RBUF0 = 0;
I* @5 z7 |" M$ }2 X. w) E
6 _$ s; U; w( `- T Q! I
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 E, O6 A8 |) g! @7 {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 g2 |- b% O8 d, B. ?2 O. e# ]) J
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
& Q" `7 _8 l: ^8 q; X( `- H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
8 }, n3 S3 O( J+ r! O2 c+ m1 T
; B) z% M f. n+ C+ L4 w4 v5 H/ i
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 R* ?, q1 \' \+ j& h" x* b. Z7 u- J- X7 g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- A' q' U8 A3 F8 d, a
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
3 P+ J# D( ]) o3 p! x! t8 Z+ J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 C+ u' @% c3 x D/ i
3 Q4 a- E2 d+ R! t
CSR = 0x0000;
! b: j! d1 a; ?: s0 r) m$ y9 ~4 H) o
INTC_INTMUX1 = 0x3d;
2 V6 D' W2 }3 P% P7 u3 ?0 j
ISTP = (unsigned int)vectors;
1 t6 z9 M3 p; c% N! u3 Q
ICR = 0xFFF0;
9 g, e7 E8 E. }6 C% x# s/ W0 @ ]0 u. a
IER |= 0x12;
: `' e4 D) T; J7 ~
CSR |= 0x01;
/ ^. @. T2 b( }3 e" V. Q2 u0 _
& L. R l: O! P9 U; V3 L
( |- B$ K1 D: {6 v8 U
! p# w+ Z; I& b3 g+ @1 H; I% s& F0 o
还有就是两个输入输出函数:
' P4 M9 n# O+ Q
void output_sample(Int32 out_data)
! V' {' G' z7 @! b6 l! l( W& x3 |, Z
{
9 |& L5 z1 H( M5 ~6 m
AIC31_data.uint = out_data;
3 P! t. h* U8 o, B3 k& Q) c- D
MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 Q G- Q: P$ w) \
}
; k! @3 y* ~. |. H0 A9 O9 I
+ `3 f% k& E5 _$ ?
Int32 input_sample(void)
3 a* q0 }1 U: x' R- u
{
y# i" n# K1 ]' ~
AIC31_data.uint = MCASP1_RBUF0_32BIT;
( U3 d8 ?; |. v! O0 B
return (AIC31_data.uint);
% n0 q" P4 h/ w x
}
+ e+ `: k* U# N% b
& J; N H. @$ ~4 d9 y" M
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4