嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 z5 l& |' k* g8 t8 `
main文件:
\8 R+ O- K5 u: `% a2 v) E
interrupt void interrupt4(void)
* T& {! a1 S m. x1 n
{
" j$ ^. y, z7 b$ E- `2 K
Uint32 sample;
0 \3 J1 E. \0 H+ \) ?! [! P# i4 @
& H% d; D$ _3 G9 o! M. l6 _
sample = input_sample(); // read L + R samples from ADC
2 o% B+ V3 U1 e4 w! j, h! f. ]
output_sample(sample); // write L + R samples to DAC
& I$ O2 U; h$ v
return;
: m7 p5 Q+ s8 W6 ^1 n& o
}
3 v* t6 x6 M1 }9 Q" S+ x
" ?: t7 T4 M# C8 @. f
int main( void )
9 }# o: `: h' W
{
0 Y z1 V) X, h. C- ], Z
4 F g% O* z" k5 M2 R
/* Initialize BSL */
8 m8 l, O- e) J$ t6 J
EVMC6747_init( );
' [; ?" L: n/ J4 J0 j" z
/* Call evmc6747_intr function */
! ]+ L G2 U# k, B- S% A
aic3106_init( );
( m }, [4 T; ^
while(1);
& g8 g+ O/ w; a
}
) ?$ M& Y L0 A/ E( g, T; d
$ Q& ~: V y; T; G. R, e; X# c
8 W" m' ^ r0 d3 @7 |: O' Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& l6 g. E, q. j3 V# i
/* Initialize MCASP1 */
% ~4 E6 e/ H8 v
mcasp = &MCASP_MODULE_1;
0 m! h; a) o$ D3 u5 }$ n& k" _
mcasp->regs->GBLCTL = 0; // Reset
4 G- t' E. E' E3 H F
mcasp->regs->RGBLCTL = 0; // Reset RX
9 Z' z* L: h4 Z) K
mcasp->regs->XGBLCTL = 0; // Reset TX
6 u( u" S& |) [* t( L; J
mcasp->regs->PWRDEMU = 1; // Free-running
! u% Q5 y2 D. g7 P; W# Z m
// configure McASP0 receive registers
4 t: M3 _! ^0 p) c3 L6 W$ V9 P
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
3 S9 W* ]6 ]+ f- L6 D1 T7 g, V' y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! i2 ^9 x, K+ o9 l
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 w- [( S7 X) k, }5 y2 F
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& S: B5 }) `+ e6 X4 |6 J6 ^
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
r5 m- d# J8 T3 p# x/ T+ E
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) {) w$ X4 L& |3 g; a
mcasp->regs->RINTCTL = 0x00000000; // Not used
% R n4 b2 t& G* K
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 ?0 _! P, q% } P& r: T3 k
/ J+ G; v$ y( V N: u
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" I6 l4 G! F+ S) g/ n2 \
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 N4 r& I1 n2 O9 h# y& X1 N4 t( L
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) t3 T: C. U9 X- k4 ^: {& L9 @2 C
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ v) }5 q1 r7 y& U/ v+ r# m7 B
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- |$ v: b) `3 b/ y* z& {
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; Y0 G' a6 J5 x
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
1 e9 j3 P. {& X8 R: l
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" g; ^5 p" {- Z" u
" J0 k( U1 `6 c7 C
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
% ?2 b- s/ P9 b$ b- I$ n; q
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% L$ u% X# z- [
mcasp->regs->PFUNC = 0; // All MCASPs
( A" R+ v+ v0 `- t" F
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 w- y3 P/ R( @4 G8 l
* g1 o$ [/ d0 S
mcasp->regs->DITCTL = 0x00000000; // Not used
9 Y% H$ F7 _- K' g+ `
mcasp->regs->DLBCTL = 0x00000000; // Not used
1 P7 D. b2 h% ~: `3 V* `0 F
mcasp->regs->AMUTE = 0x00000000; // Not used
" ?3 o' M8 D8 J$ l9 U4 ~
+ B1 W) A4 ?& \$ I' B, z
/* Starting sections of the McASP*/
, r! \& w; n/ G* v6 I+ M7 R
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 H) r' q! ^. c7 P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
' Y5 f$ f4 A, @2 k5 P/ _
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 S0 h' O- y. k* ]- D! H. h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 k0 G7 K- o2 g' U2 |
$ T! B3 c" L. E2 h7 c
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 S! |: _ F2 f+ ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 F' r4 Z% @( Y; P% {
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
0 N+ K" y& \$ e4 x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
7 P4 y3 [$ L$ J; I8 k: ^- Y( {# L
. R4 J% e) N+ g) o8 g9 q
mcasp->regs->XSTAT = 0x0000ffff;
, [. o0 b s2 ~0 J: p
mcasp->regs->RSTAT = 0x0000ffff;
3 l4 N/ s3 d- x9 z9 `( n8 m
+ _* t* Y5 U' o, {& S4 T: `
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 ^8 j2 n# _7 b( U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( w: s! S0 J! l2 }2 g# L
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& Z! W5 a* q- o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: q3 y6 f! M1 F2 \+ K+ e5 h
/ y. K; Y% J" N( |# D9 D2 R- l
/* Write a 0, so that no underrun occurs after releasing the state machine */
$ }" R6 @# n, B7 G5 d4 [7 A5 X
mcasp->regs->XBUF5 = 0;
# r Z/ i6 ?) p2 C
mcasp->regs->RBUF0 = 0;
& ~; x# Q7 Z0 w8 V2 ^2 F
1 P9 }0 {5 Z( }5 s: G
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& L4 T8 L3 p' e2 e7 Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) b3 k4 n. _9 a
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% D2 T5 i' F9 x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% v; x( {" r3 L* n2 B. X# g
0 y' z1 L p$ Q( {- j) I U4 V
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! _5 v& F9 F% p E7 l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! [# D& q* p4 `) u1 i6 z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; m. n( y7 [/ e0 X- l- [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 a1 Q' O( n* Q+ ~ w
* Q- h) N: [" O, ^5 w4 x
CSR = 0x0000;
9 R3 ^+ z1 Q- {* w" V" h
INTC_INTMUX1 = 0x3d;
& F7 S+ e2 F5 H6 k
ISTP = (unsigned int)vectors;
4 v) z0 c1 R6 t# r( x" z. \, F# i' O
ICR = 0xFFF0;
/ W# i8 D8 {: B! P: u. m! B% s( `
IER |= 0x12;
( {5 a V4 j' v. f- e$ ]( [. I
CSR |= 0x01;
8 d' n7 g, W4 w9 i0 ^0 w, O5 d! X* X
* y3 p9 i, [( c$ X. u x `8 F2 C
- r, k1 {3 h- U2 w7 F
1 p& i: E" ~8 R) ?4 Q5 H* m! {5 N
还有就是两个输入输出函数:
. ]( ~+ c2 I& A% Y4 x
void output_sample(Int32 out_data)
* O/ r, v8 }6 T0 e4 m
{
% @" x+ D1 x/ |8 P) I
AIC31_data.uint = out_data;
8 Y F& X) J! k3 _
MCASP1_XBUF5_32BIT = AIC31_data.uint;
& k- T9 x* F& J% O9 X
}
- y: x& Q3 s& u& v2 P
# Y" _/ V9 P5 }
Int32 input_sample(void)
" l$ f8 F4 n8 u: `- x
{
6 l+ Z5 M8 |' v% V6 S5 V9 Z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ x4 S6 O, H/ t8 B3 S
return (AIC31_data.uint);
: r, T2 `; R7 u; v* O# t
}
! V+ ~2 @% R, e3 b0 X
+ I/ u) X# `/ q( {
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4