嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! _" ~" C/ d: z7 v2 I1 _' r
main文件:
; [1 z7 W% C4 d# c) u# s
interrupt void interrupt4(void)
) W# b9 L+ K5 O( f- S2 |3 N
{
$ [7 y0 Y; I( f8 ?8 h4 V
Uint32 sample;
# E# i6 ?: T6 ^0 }& u8 ]
% g; V J' c- i1 o- G
sample = input_sample(); // read L + R samples from ADC
( r2 M2 l+ H. n9 Z2 {
output_sample(sample); // write L + R samples to DAC
# s7 O. t8 u- y5 c" I T
return;
+ T# R4 q% T# E! G
}
3 }1 C# ^9 g+ {8 m7 M- a* W
9 _- y/ p0 s. J/ V; L
int main( void )
: x8 X1 h+ Q0 A7 Q( Y2 j3 e" c: H
{
) t- w4 s4 ~) e" t& V6 t% G
' r- _1 x; J+ K9 w
/* Initialize BSL */
; g7 O5 z$ b7 M& R
EVMC6747_init( );
* J n5 [9 x" R$ C5 X
/* Call evmc6747_intr function */
3 Y7 v- t5 G2 z$ }5 m$ P
aic3106_init( );
8 ?. R* H! t K7 i. y6 i
while(1);
! c5 F K) X" W+ [* j9 X4 ]& {- ^
}
0 n7 {# x; {; C
! k/ D) _5 K# a/ h
4 M& f7 a3 L4 @9 u: U( [
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 V0 S' N' j5 k' V, p0 w" H
/* Initialize MCASP1 */
/ Y$ E4 z) }: J+ l) S! F e$ G) a
mcasp = &MCASP_MODULE_1;
) Q4 V0 h" K X' s
mcasp->regs->GBLCTL = 0; // Reset
4 Q# d; L0 e6 b( |" @9 P' F+ m5 [
mcasp->regs->RGBLCTL = 0; // Reset RX
# U% E" Q- ]! y t% v/ A& m& w
mcasp->regs->XGBLCTL = 0; // Reset TX
9 e/ a# s+ M8 ?# T0 `0 o4 s
mcasp->regs->PWRDEMU = 1; // Free-running
4 O6 R1 @( Z; N( F! n3 v
// configure McASP0 receive registers
7 k. Q' K4 n( w0 {: d
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
4 \" `1 w5 g9 r+ ^' x; E% ]
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: _1 v2 A- P% u$ n4 \% z# X, c
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
s' q8 p( p8 `. G3 H- Z4 e
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, b+ r& G) V4 d
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
" ?, Y" Q: X. f# ?
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
5 @) F8 A; |6 l& s* F6 Q+ u6 ~$ w
mcasp->regs->RINTCTL = 0x00000000; // Not used
; @( V- }! _# M% h3 ?
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 y! `! n# Y5 B( Z D6 i
6 U8 U! j0 P6 P# `' ~# W0 h
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( [9 m6 K7 h- G* m6 I
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: b0 X# m2 _2 J! N. _, a
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
1 l: S" }3 d9 P4 {: x: C0 x
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 @' e0 n! C' E1 |% Y
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
: o( W& j* v0 d0 N6 n5 A
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
% u2 J( U0 r# B: ~) S# T
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* I- Z* T5 V; n
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; i2 v2 x: F) b+ Q3 t
9 W% b O( P6 \$ {# u' g
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& j) A! ?3 i1 J$ B, l4 O
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
$ @! O! R6 V# C2 e1 e
mcasp->regs->PFUNC = 0; // All MCASPs
4 {8 i V" a; l0 A7 C& t
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 n: l# ?/ H3 a7 ]- |- v$ I. G
/ N' i& T5 P9 C& P) Z4 D
mcasp->regs->DITCTL = 0x00000000; // Not used
# N' Q. f1 g( p/ x/ _
mcasp->regs->DLBCTL = 0x00000000; // Not used
1 _; p2 D+ y- ^4 [
mcasp->regs->AMUTE = 0x00000000; // Not used
1 j8 v* k4 Z J' T R
: a+ b! P H7 J R
/* Starting sections of the McASP*/
) Q2 T* w- J9 d# A1 t0 e; H4 E
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
, {$ n2 O E" @4 Y/ d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ y# X% x6 D" f U0 M+ z2 E) C7 s
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, Y1 T ^ J5 I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ K9 a5 }! `: u( m
$ M" L( u3 D2 T( J9 ?& P7 ^
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# ?! s& y6 U1 N- @6 l3 H- |" @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
# |8 L1 B) H# ~4 ]6 H
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( } z, F2 [) ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
2 s, O6 e5 T* A! |& p6 J& O+ W
) l; Y1 B9 D7 e! n+ H; v" X
mcasp->regs->XSTAT = 0x0000ffff;
4 Y/ u0 O9 j, G' P: q* d1 C
mcasp->regs->RSTAT = 0x0000ffff;
1 _& |& C4 F& L5 P. E
. M5 |5 g( O' J" x! o; Y% h
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 `& U' B# L# O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
2 P' q7 Z5 t) W0 A2 Y, L( }' Y1 Y
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& m4 D% D! N8 q/ B4 g0 x( r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 h9 j2 v8 D4 n! @4 X. E9 |) i2 i
' t2 y$ M ?& Y+ x
/* Write a 0, so that no underrun occurs after releasing the state machine */
! ^( t; x$ a' @! P4 `1 o: T) n3 ^$ t
mcasp->regs->XBUF5 = 0;
5 w! L7 U7 b+ _' M
mcasp->regs->RBUF0 = 0;
- i- Z& g6 ^) {( X+ ]( R& o
; e5 f) Q% }1 c" g( Y) [
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 M! m* Z3 k9 w& N: m/ T2 L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, k4 `/ Y8 Q; J2 O; |* ~
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: ?; e2 T8 }6 o% k7 W& U* E! V0 W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 Y5 X$ e5 ]* N- g
* V+ @. J9 O3 g' c) Y, M
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 x& r- j: C& g Z9 q# O7 R% P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% Y) k4 V$ `( y" i
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
. A( w5 X- `) J B1 E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- J1 v/ z' F; L; F3 j; _. j
/ ^* u, J! r5 a7 p
CSR = 0x0000;
/ o; e) r* p/ G+ [+ ~
INTC_INTMUX1 = 0x3d;
) i4 _/ u- Q, ], [
ISTP = (unsigned int)vectors;
_) u1 u1 P, `2 R* K& p8 O' Z
ICR = 0xFFF0;
+ `, B% F! i; Q
IER |= 0x12;
+ ~0 |* F' |) y* v8 ]+ O, `
CSR |= 0x01;
" Q# c h3 _- a8 }! U, P
v( ~* s8 a- t0 w' W6 E
- c( x$ X% d* J8 j# r
) C) B9 e5 m& P; r) P: i* E8 s
还有就是两个输入输出函数:
1 J! }( K8 U& X5 \/ { ]
void output_sample(Int32 out_data)
% z& k V: k6 {- ~4 d l* a' K# i
{
& C( g: R; [& W" g. Z
AIC31_data.uint = out_data;
" l3 ?4 \; Z7 O4 l
MCASP1_XBUF5_32BIT = AIC31_data.uint;
, y" r9 U& j: N0 S# g- @: K
}
, T. y# h+ c' U' _ s E
' H/ U9 M& R3 p7 O9 V
Int32 input_sample(void)
w6 {8 z( \3 a0 R M; f
{
( r. j9 w0 N( C9 S0 D
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 e+ \# J5 P2 u# z# V
return (AIC31_data.uint);
/ @# O- Q; ]1 X8 e8 k
}
) t" M# W k# u
3 n& k" B9 ?/ L }1 R' S, S
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4