嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
W6 X% Y* F/ a$ H& R
main文件:
! u+ F: o( |& M' O& W* r; ^1 s
interrupt void interrupt4(void)
$ Y0 e' E& ] @4 b" S6 ~
{
$ c% f. \1 V$ D+ p2 X
Uint32 sample;
% }/ ~3 I, [% N/ i! j0 N
, K9 d- j2 h$ \' u) \
sample = input_sample(); // read L + R samples from ADC
" C, [+ t v* v; d% ]- ]
output_sample(sample); // write L + R samples to DAC
: I/ t' D4 y; B; o! x* W
return;
5 J7 b4 N" F" X
}
! z3 x4 {! i. a; h. i1 U8 }
& @& [/ ? S9 g. Y" _$ ^+ g9 f3 H
int main( void )
) {/ t4 C6 T+ {( @: d1 N
{
& `' P" y) X ?3 T
6 F5 D1 o1 A6 a* ~
/* Initialize BSL */
g, H" \4 N+ w
EVMC6747_init( );
; r, `9 X, m* F
/* Call evmc6747_intr function */
- F0 O- N6 W, K8 a# i+ D5 \' y
aic3106_init( );
/ D1 @3 y6 K! O, [9 x1 v! _
while(1);
* c( K! u- b$ r$ E2 ?. O+ r
}
D7 R \0 Q' l
) ?) S! M1 ]2 N- @( C/ ?
9 @/ _4 d7 ]8 p3 r
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ A' [0 t5 A8 u( C
/* Initialize MCASP1 */
1 b; Q, n9 E& E2 ]4 T2 u& F
mcasp = &MCASP_MODULE_1;
( b' ]( f3 J) E0 o O9 l4 E0 v! J
mcasp->regs->GBLCTL = 0; // Reset
% Q; a6 P( [8 a* R1 j4 i
mcasp->regs->RGBLCTL = 0; // Reset RX
. _5 | G5 x" Z9 \0 Y
mcasp->regs->XGBLCTL = 0; // Reset TX
/ q1 k' E: d6 j! V |1 G2 k
mcasp->regs->PWRDEMU = 1; // Free-running
6 q2 q& P& ~3 U- I+ Q
// configure McASP0 receive registers
1 T# E6 l0 X& C" J% n
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, H7 y* m, x Z# Z: d u
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 S; W+ b2 b2 ]. r9 [3 x5 B u
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
3 \- U F/ _+ o9 Q1 ?8 P0 J+ k0 m
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' O$ F$ C; O5 z5 h9 b) K
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( M+ q; _8 f9 C3 m' f) H
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
/ ^* Q$ Y% q* v$ T9 w) m
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ b4 ~+ w7 B/ v7 T$ ]
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 E' ~4 f5 x8 d7 D) T3 _# w/ {
& j5 n7 k m) S1 J# q
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
K6 ?1 U$ Q. F& b% G2 v! }, H. u
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) l3 D0 i3 q( p, `
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# d: s& u" q/ Z' m& q% P
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- P) z1 Q# B7 _5 ?) s& \2 ]
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" f7 v% v1 g: {! K6 L& I1 L; }
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
2 e3 e! K5 D& e" B3 e# d8 p' [6 J# |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ S. R( k4 {- U7 U$ N* b0 Y% M
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) M- Z. J! o* I& b! K m2 e
1 i- v2 o- y4 r* v: j C# L* m2 I
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
( d9 e) c* ~' X/ P' a, H
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% m4 `' r% P+ u s. J. h
mcasp->regs->PFUNC = 0; // All MCASPs
$ f1 D& Z# p! {/ G' T6 k
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 l6 [3 O* A+ h6 r
, l# g, s7 I3 C) \7 z! K
mcasp->regs->DITCTL = 0x00000000; // Not used
9 v, U, I$ d. p% p% E4 V
mcasp->regs->DLBCTL = 0x00000000; // Not used
) ^% }+ [: y( ^. Y" d4 E
mcasp->regs->AMUTE = 0x00000000; // Not used
, h) v" J' K" x4 Q0 V
9 k( e( o5 l; ~+ V4 R3 A4 f
/* Starting sections of the McASP*/
1 O% x" R' P# b: @% X2 l* g
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# q4 R8 V# \3 U9 s, A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 [& u2 |' T! U4 W: T" `& Q3 r
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
' @6 N8 A9 F, r1 v& u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 j, [% h L. E+ w
5 r6 q6 E6 D% e. Q' O6 c+ h
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( w% M' d" H) X6 T Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 U s* M$ h: i" z% [
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ D+ d' c! c7 d( H9 A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 V' G; H2 }" {' u3 s. C* ^
% O s, k% n" o0 h
mcasp->regs->XSTAT = 0x0000ffff;
# m0 d j+ u) d. y1 M
mcasp->regs->RSTAT = 0x0000ffff;
0 o9 _$ l* m. {) `
8 r; A' H4 G% ~8 l: e. Y' A; t
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( p8 j* K0 @5 ]0 i% H; r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 _: v3 I+ g- \, V" I% F
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 R/ U7 h" { `. h. Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; f. E' _$ } h
* N3 p9 V7 l( z5 i1 i
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ d! ^6 @2 [9 U: p
mcasp->regs->XBUF5 = 0;
3 T' G7 \: j8 n/ a( r
mcasp->regs->RBUF0 = 0;
, Y- d, Q. L% c1 U8 f9 k$ {- p
( A9 d/ M+ @7 n7 O' p; e
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 p' ^' i- F3 V& V; C0 k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' [9 n: q" ^4 i5 D" N9 l- ^* N# O
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
T) h7 s7 F" B* w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 ?. g/ F' r- i$ w: o- h
5 U5 O5 O1 i# S3 n+ w
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; Y# M2 \/ ~ p; R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
8 S, e% m: `) K& O
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 ^+ v7 t( X0 g( c( a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. ^$ l) S+ U7 m+ V9 b4 F
8 ^0 D. b- K$ W
CSR = 0x0000;
3 h7 b& ]% }0 q. D' v2 w
INTC_INTMUX1 = 0x3d;
5 W* g; V5 Z& D% b7 u# L- N
ISTP = (unsigned int)vectors;
7 P6 x; ]9 v% V1 V2 Q
ICR = 0xFFF0;
* n$ i. t. [6 f
IER |= 0x12;
7 c8 ^# k4 q) ?' M E# q0 M
CSR |= 0x01;
0 [4 \6 Z1 }# o& p- Q
) p; I; M+ l" P
x7 {; P+ v# ^# H8 q
0 K; r' q* D- c/ A ^* |; q
还有就是两个输入输出函数:
+ [6 G, ~. U5 Y5 _4 i3 D' S
void output_sample(Int32 out_data)
* z- c4 D- ?2 n5 S$ M
{
; s* b d; b" C! h1 K6 v
AIC31_data.uint = out_data;
9 ]) G/ Q Q# [
MCASP1_XBUF5_32BIT = AIC31_data.uint;
; o* Q* G7 {/ F( B
}
% r# C, V3 e0 V* t. n# K, f
$ u9 ~: h% [. i# l. D
Int32 input_sample(void)
8 L4 I. r& W' P3 l
{
. b: y" A2 ^& L# e8 E, r) U
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* i- a# F; y- x5 {4 d; [
return (AIC31_data.uint);
7 d- R# L3 O/ u; W
}
. t$ t& K; X% u; ]' o: n: i- L+ a
, p) S3 \5 A+ w, T
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4