嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ d( k/ {4 Y* D! |
main文件:
5 z5 u8 `) h0 s4 b: c+ ?
interrupt void interrupt4(void)
* ]% ^9 ], G8 G9 q% ] B) O
{
- k; m5 u J1 [( n
Uint32 sample;
& C% E/ c! e5 j. a6 P: j; v( O
, M. y; A2 v3 z
sample = input_sample(); // read L + R samples from ADC
+ }+ \* c: V1 t
output_sample(sample); // write L + R samples to DAC
+ w. v. p6 i9 A: n: T$ ~5 P3 w. J5 q
return;
. l" f6 T6 J% [. y/ t$ s" x
}
5 l7 [1 r( X8 T
( h! |+ _) J" y6 w4 m( y1 y
int main( void )
4 V- f7 e$ w+ k# K8 | K
{
( {9 e% B& a6 ^$ v2 A
6 u3 z- l9 v' Q' H1 d( U6 f+ t
/* Initialize BSL */
" d8 Y3 P4 _ Y* T
EVMC6747_init( );
1 ?) Y; w$ r/ K: I# {
/* Call evmc6747_intr function */
! `' D" B5 D4 r+ T* L/ E
aic3106_init( );
8 r* o' y- t& O) R! v
while(1);
; v6 k1 ^6 R, B. N
}
2 p8 Q( Z5 k/ _; P% y6 l
3 h4 @; t Z% \* n. d ~
+ k* [# q7 t8 e& l8 l
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ {, ~, @* m3 A! B- I T# m$ _
/* Initialize MCASP1 */
' D! U1 B4 W5 s) F3 }
mcasp = &MCASP_MODULE_1;
' [) ?- _/ ^( w2 _" q/ c
mcasp->regs->GBLCTL = 0; // Reset
5 U9 E7 k7 [, y' m
mcasp->regs->RGBLCTL = 0; // Reset RX
8 p8 y& O. P' R% J' J2 F
mcasp->regs->XGBLCTL = 0; // Reset TX
) K+ T1 N! J n/ r, \
mcasp->regs->PWRDEMU = 1; // Free-running
! A% y3 Q2 l4 B* }" o: G
// configure McASP0 receive registers
4 K, J: N) h3 E
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
v: u- w! p w6 t" j
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 a _9 U7 z2 I
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
3 N* h# P! p/ H/ x
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 H& {( o2 K+ E+ Y! ?& H
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
* j) U$ D) h% w4 [) F6 I" |" K% e
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
H: I& N: d- s( |
mcasp->regs->RINTCTL = 0x00000000; // Not used
4 M: Z% g$ N, ?1 E+ h
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" J" F6 X l0 V% `
1 t% ]5 p; m* m6 K S1 v' _: j
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' x4 b F3 |0 ]7 H
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 }. ?* a) o5 k' ~$ g( s' e; G. t
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& L$ }& l1 B" @7 @) U) J( }7 u
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 e$ U0 y. X1 A; Y8 W
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
1 M, ]8 W, i+ s8 u" a# I) G& y7 M
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; F. g$ K3 Z5 K7 ]+ B
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
! s# Z: r! d, b' v7 T3 U4 c
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ I }6 R9 F: v ~
8 P) s S0 [) {- M% R' q) K6 J0 C
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
' G% q8 n! j" r/ n. o5 s
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
. [8 N( R9 P% r$ S3 k/ a8 D( u4 ]
mcasp->regs->PFUNC = 0; // All MCASPs
- X5 T0 O: V/ d! Q) s5 I0 n
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 Q' y$ G, m8 |$ U5 J
$ G B4 A4 S* M' u8 B" Z
mcasp->regs->DITCTL = 0x00000000; // Not used
) o' O* {" W3 A+ V
mcasp->regs->DLBCTL = 0x00000000; // Not used
" j0 b2 G: p4 V t+ _$ h
mcasp->regs->AMUTE = 0x00000000; // Not used
9 G( a ^# }9 y4 N* f! d
7 {: U! I z" H$ o3 ]
/* Starting sections of the McASP*/
( L- R4 q% N" R* T
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ C- B$ B- z' S% u9 d; C/ v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
, H3 E+ Y, h+ z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
8 e/ h4 B) T! W* p9 v" Z+ g" o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, H7 v- Q3 K7 u% ?/ W* U
& |$ W, g" L# @0 a
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% v# |. f7 K2 Q7 |2 ]1 ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& W- S" ]( m+ n2 @* ~1 s
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
6 D2 Z: C8 b6 g% z/ L* z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" `1 q1 b, i& O1 x+ v' a6 Q
# u0 c( P" z' h" d) h. U" e
mcasp->regs->XSTAT = 0x0000ffff;
/ M& N) b# J. | P# d# ?/ j
mcasp->regs->RSTAT = 0x0000ffff;
( B& s: O: _/ W* D! c
2 e7 r0 J. j( B' I% q6 }
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" c, R& f; o' t/ j$ v2 m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) f* N/ f5 _7 O3 Q1 @( @
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& o4 L: x+ g& X% A# k
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 Y+ [$ |4 Y9 y; n( h
/ z5 l) Y% |6 Q/ w
/* Write a 0, so that no underrun occurs after releasing the state machine */
7 e* D0 P; H( H# v
mcasp->regs->XBUF5 = 0;
1 z6 p; H$ L6 a2 {9 v: I3 p
mcasp->regs->RBUF0 = 0;
: h& O/ o- X! e+ U: J* {+ [! A; q; l
7 f S! M- E J: V1 w, ~4 H
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# u ?3 o& F) c2 F( _1 ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 ~0 G3 z. D( \# B' @/ `+ ]
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' O5 l& L+ h* V4 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 ]2 S1 n- P8 U j
; J( ~3 \* o0 i9 n \
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ u2 a+ }1 d8 f2 Y5 j# A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
, ^) V0 w9 o A2 F' p
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
% d) U' B. v3 _# H1 W! l; x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 {; `6 p% Z! M7 [
" b% a; a; u4 n7 i
CSR = 0x0000;
: b, Y& v5 ]2 x" U- k0 P
INTC_INTMUX1 = 0x3d;
3 u6 Z M- c( a3 q B' w
ISTP = (unsigned int)vectors;
: W7 h* V( ]3 M
ICR = 0xFFF0;
% @8 n/ ^" @8 \. U$ b4 I
IER |= 0x12;
2 g3 q [! h$ d( `1 i0 h
CSR |= 0x01;
Y, M: s& {7 z- i9 q
9 v: g( D1 q j! }8 ~1 I k
* @& ?: @7 |" m3 R, w/ ?
% `9 E1 x4 _. x
还有就是两个输入输出函数:
4 {1 O0 D# [" P# ?9 k
void output_sample(Int32 out_data)
* M+ k$ @: ?. e7 j8 k
{
D- O; k3 _! k0 S5 f6 t
AIC31_data.uint = out_data;
! l _. [" p; M
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) |# ^# v' U# J/ D6 N
}
d2 z) I$ C" d( [" d
- _8 E/ F8 Z9 j. B6 Z) t
Int32 input_sample(void)
' S; U. s6 ?3 l0 H2 z
{
O+ T" G# F, A: u0 D9 j
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' x# j8 @. Q" L' [: T% [
return (AIC31_data.uint);
$ s" U- S4 D6 \1 y8 }1 \
}
! O: L& y& l. Z& v& }' ~( @6 ?0 G
& i1 a0 b6 o- b% `
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4