嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% m# l+ U* [( @+ H
main文件:
3 u+ W9 e2 |' N4 W# r
interrupt void interrupt4(void)
. k& f: K: x& W4 M' H0 S# o
{
) ]: k) Y0 J# h; @; j( J; l' o: d
Uint32 sample;
1 Z# q9 ^7 K' q+ }: g
1 D9 Y i/ ?4 f# z& q
sample = input_sample(); // read L + R samples from ADC
+ X* ~9 s* Y8 W# d: A! ] T# h$ R, \' e
output_sample(sample); // write L + R samples to DAC
; Z" X! l1 A. I8 J5 w
return;
7 w" L1 i, |: Q# U* m. C) Z0 Q
}
I. C* F/ g4 J* N
. q' l q% z( J, w$ H. N
int main( void )
5 ? I' _2 P: m" I3 @. u9 q
{
0 w. ?9 `# t% X- l4 M& y, x- q
( C5 |. O3 g. B, Q3 N
/* Initialize BSL */
; q9 w1 s: B4 O! c% p+ m1 ]3 h
EVMC6747_init( );
3 u+ Q3 C; O: m
/* Call evmc6747_intr function */
4 Y. ]' L* Y9 ]: O& ?& O
aic3106_init( );
8 i1 J6 s) e+ u W7 e
while(1);
' N9 F6 T8 n: T/ D2 u1 D8 H
}
8 a, P2 ?0 ^' n8 U+ e! S
* t5 D8 h" A5 N9 h, P; S
! J9 u! p0 e V3 D/ [8 W2 ?1 ]
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- t7 S$ d. m* I4 e% N0 q* X! K
/* Initialize MCASP1 */
/ Q3 o& z( s. S. X. H
mcasp = &MCASP_MODULE_1;
0 m: {7 g6 ?8 Y0 c9 r2 l
mcasp->regs->GBLCTL = 0; // Reset
" v' [& y+ n4 D% I: g% _5 ]
mcasp->regs->RGBLCTL = 0; // Reset RX
9 v9 [4 B; s8 b, r( T
mcasp->regs->XGBLCTL = 0; // Reset TX
1 x: U4 S7 I" j$ _& @& |9 f
mcasp->regs->PWRDEMU = 1; // Free-running
& c3 w8 F5 h0 ]6 T8 W
// configure McASP0 receive registers
# a3 {: Y7 N0 y7 x* X F0 }0 p2 B
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
) Y v/ |8 ^6 p: A. C3 r* v
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 \% @3 V& }* z6 |* @( S7 g
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ ^9 z. Q; [ O3 _
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 \1 f; C+ ]/ f2 G* c: r
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
: }0 Z9 q8 |1 }% l# ~9 W# |- v7 l
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
( z5 R' ]7 k _/ I, O' y+ s: z
mcasp->regs->RINTCTL = 0x00000000; // Not used
4 u; r( m# t) d* u( W2 y$ \
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 I0 _! K7 }5 @7 I( @- ]5 a" m
7 p9 M4 C% N9 }! n: R. ~
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 G9 ^- E! n4 s* ~* `, u2 m. [" J
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" N6 j' }: X6 K X/ l
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 L# A. k" M5 K& _, L. P
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
1 }' S7 ]( K/ y) k$ D% c6 @* Q) x
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" y8 n$ c6 m# T) w" w( o
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 s6 m& M( _7 G/ n0 g
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' O. I9 I# g( n4 @/ b
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 X' v9 u- ~, O' r4 N
3 l# H0 q) f. n1 \! k; V/ x: S
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
0 }. m" ?% z* b9 G
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
S3 u% h- {; q; X- i( e* r
mcasp->regs->PFUNC = 0; // All MCASPs
* E) o9 a$ H. v7 M% O
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 @& Z7 G6 \4 E' ?5 k7 E) v
7 E5 N4 z- @) Q8 Q( s5 m/ I& ?- q
mcasp->regs->DITCTL = 0x00000000; // Not used
3 G; ]/ _) B& D3 @2 u. J
mcasp->regs->DLBCTL = 0x00000000; // Not used
f% z% t( V( m" v& r
mcasp->regs->AMUTE = 0x00000000; // Not used
7 {7 Q, I2 \ ?. s3 A+ n; ?$ n
! y- F8 w( K3 I3 w, ^2 o% M
/* Starting sections of the McASP*/
. j2 [8 ~- p- e* ?+ O+ z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" _' ]( }# E7 D! d7 R0 w3 @% `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% `" e' I1 N# P( G) C
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 o1 E* f: e$ M6 C! S( W3 f* g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 r# \+ k; |$ M9 N
# }% x( R) G! G" A* p) c
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
6 S a& }/ x% }0 ~7 e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
1 g; d1 T& A4 n$ \
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% b* x- J( U1 C! F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 k% [& |& Z# D% k5 Q( Z1 o
/ e8 G: j% M# B* G- c
mcasp->regs->XSTAT = 0x0000ffff;
% O% r6 h# p" m$ `. t* _: r& q
mcasp->regs->RSTAT = 0x0000ffff;
6 t0 I) w% F# f* S0 p" l
: S8 R1 S2 s: E. T& ~) _. e% ]
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 J* }' a4 P* j2 r; o& R3 y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
6 K4 h( O) e7 }
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. D' p, h3 q. o9 ^" q3 Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) r* \3 C( t! R$ N
$ Z" j7 g5 m2 }# {4 j
/* Write a 0, so that no underrun occurs after releasing the state machine */
3 ?/ d# ^: n! C& e6 h
mcasp->regs->XBUF5 = 0;
0 O- \0 D: |. b) T- S
mcasp->regs->RBUF0 = 0;
) H8 H! K' L/ y8 m; y# ^; A
2 s/ l) ]7 n8 C& L' a# R3 l' y8 j
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" C3 i/ X+ K3 C& [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 E5 `+ H: Y0 X: p5 Q% f- p
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 L7 d, Q/ f/ o+ ]9 _' L H8 i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 T! v9 p( q% J; I8 x; b+ l
0 ~+ c5 F7 L0 S& i
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# w( p3 c4 R" `( v9 w Y0 y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 d4 @+ c2 V8 ?
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 z% m# Z0 e) ?/ g% `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 ]$ \$ M& Q: |) r% \! t. P2 c/ J
6 M. I/ _$ D8 B7 k
CSR = 0x0000;
1 R! `( e1 u! L7 Z q/ `( J( p
INTC_INTMUX1 = 0x3d;
' X6 p+ f% n- ~1 h4 l
ISTP = (unsigned int)vectors;
9 @, O1 w5 g( R0 Q2 C5 J
ICR = 0xFFF0;
9 r0 B3 X6 t2 p0 g- b
IER |= 0x12;
5 S( V B# {3 N! x' K3 H- G- Q
CSR |= 0x01;
; v% q2 Z! R! g9 h
* y; r5 p2 ?% Q3 v& q
8 r' V& w5 N- v: L
1 W& e# S0 D$ T& I. {
还有就是两个输入输出函数:
* `: }7 p3 ] t: ^: T. O1 ~6 P8 ?
void output_sample(Int32 out_data)
6 R. ? H+ \ d( `" H6 i
{
! f( t( n+ o1 K f q
AIC31_data.uint = out_data;
, @ g6 H6 N G: y; X" K- I2 |
MCASP1_XBUF5_32BIT = AIC31_data.uint;
& A9 S4 P! i6 r
}
3 A3 `, E' Z# ?: O5 _
6 v+ A* h4 M; C' |; n9 p
Int32 input_sample(void)
2 I/ d9 Z9 w2 \2 v- v7 |" a+ A. ~( H
{
, x$ Y% E% ]% a1 k9 G& p
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ ? _& {( ?, j" \7 X
return (AIC31_data.uint);
, Y6 d: x1 m8 B) f; D: \6 @
}
! m* L# X3 J \1 ?2 z- D- V w
0 t1 T4 j c# W
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4