嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% m) M& O) N0 C7 }
main文件:
" J! k9 ^" G) Q) p0 G
interrupt void interrupt4(void)
! g" c7 j: N v
{
. B1 g0 p3 r) n" x* T# U
Uint32 sample;
& k8 h# \% ]7 M! e* g
+ J6 z6 z% W6 G. G2 K
sample = input_sample(); // read L + R samples from ADC
+ v9 R8 ]1 C( |! v$ _
output_sample(sample); // write L + R samples to DAC
1 }6 e+ h. J8 y! L- N. t
return;
, x9 U s& G f5 D6 C1 `; t2 ^
}
) {4 e' V1 c6 m: d+ q+ @2 w! ^8 i
' y; P5 J. C/ b) ^2 x$ \
int main( void )
e- u# o8 t+ U. W' E
{
6 ~- m1 t8 p/ N9 k7 N1 S9 l
$ v m; H' v/ n2 B% l% M, E2 @
/* Initialize BSL */
$ K! c1 w8 f; j
EVMC6747_init( );
4 W* O4 F# ]2 k* S
/* Call evmc6747_intr function */
1 L2 U- \2 k3 X! Z# ^
aic3106_init( );
- z; i7 Q9 p( [" h! I
while(1);
* ^! _+ L5 ?, {: s+ N! r
}
- l5 |, v+ Z( w
" ~) X( q- X: G4 h R+ P( |
; y% T( e; d8 W. S6 g- Z- \
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' @" J6 R9 e V+ O. E
/* Initialize MCASP1 */
5 j) c" @/ a) i
mcasp = &MCASP_MODULE_1;
! W' l+ c% y6 p; L- Z/ z
mcasp->regs->GBLCTL = 0; // Reset
$ O; q$ U6 s' P! L, }/ U; h
mcasp->regs->RGBLCTL = 0; // Reset RX
" Y1 L) p4 j6 Y0 a* r9 N1 [
mcasp->regs->XGBLCTL = 0; // Reset TX
. r- \$ O3 y* r/ m. v5 ]+ f
mcasp->regs->PWRDEMU = 1; // Free-running
' X3 v/ n+ M! s: O v2 y
// configure McASP0 receive registers
% _: r( l# U' _+ ?1 L- O C
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 C! V# }( g% ^! F' {1 I' D" Q
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 y9 A- B$ _! l# S* r) s) M7 C
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 u$ v! r) R y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 ^( e% r9 I* x3 _$ t6 N/ c" d6 z
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 r- ~5 J1 p; s0 N- }( E& p
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
5 ]! r B) P. c4 [3 u& U$ I: L- @& T
mcasp->regs->RINTCTL = 0x00000000; // Not used
. |; |4 q/ W9 _' P1 ^( U
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 A" D2 _* r: }$ g
2 p8 f' j& Q* k6 T5 }' v7 G0 S
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
g. M0 v N: t" C1 `+ x
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 N3 T2 I5 K& X2 O$ G8 z6 {! x/ y, N
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 O% v* o, I( d! d- I* D
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 K$ Q1 d" _' k% u
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
2 Z! f: G2 W' ]; J! H4 S5 ]
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ L3 {$ c, X( ?, i
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
# X' R9 n' c# x/ p; v$ f3 K' |# Q
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* R1 D7 D8 J! r+ p# ?
8 R& F) `2 E3 N! s% J
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
' p1 E' i2 K/ ]5 A6 W$ h% u
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 y7 Q7 a% p3 _0 p
mcasp->regs->PFUNC = 0; // All MCASPs
4 M) E8 f5 ]. T/ K0 S. _; ]
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ p8 Q. V G2 Q4 @/ X r- w2 F* v
) H: |1 f/ s$ A! [; d/ a/ G
mcasp->regs->DITCTL = 0x00000000; // Not used
% A7 b( u, r4 u h! E+ [
mcasp->regs->DLBCTL = 0x00000000; // Not used
6 e: M) R6 \: G" o! Q: @. O
mcasp->regs->AMUTE = 0x00000000; // Not used
! o; F- c' e- o- q
* Y0 d* X- A0 K+ a0 D
/* Starting sections of the McASP*/
' I& m W) a- H `" ]: C$ [% r
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ J' G6 Z7 |1 t3 I! \$ P6 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% u; @+ o( E6 [$ K
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
! r$ n- o0 ~# M5 `$ }, w) p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- D/ e5 l V) j; n5 n' E
$ a, n4 d- D* N( W/ @1 Q3 B
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ q! D) o5 w9 q( t# l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! }% X1 ~9 R- {1 R# R& z$ N1 x3 t
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 x- r2 x9 N9 H" Z' d/ Z1 }& }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: ~1 d7 q6 n# [
3 Z' ~4 Z) w& D( e, w
mcasp->regs->XSTAT = 0x0000ffff;
+ S8 P O, {$ _# k6 [2 q
mcasp->regs->RSTAT = 0x0000ffff;
1 M5 P8 u6 |3 E1 _& s+ A! _
* q2 U4 |3 V8 u
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ J. o g: e: ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 r+ }: Y" O/ B
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" i! g: L( Q4 w9 F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
' d, Z% ^- t4 _4 b, t4 h
9 x( D o2 H, S
/* Write a 0, so that no underrun occurs after releasing the state machine */
1 w. ^* M) e: r, \6 ~6 i
mcasp->regs->XBUF5 = 0;
$ m- h! s& r1 k( d6 f" t: W, M; f
mcasp->regs->RBUF0 = 0;
* w+ x1 S; y% R! \: r# c1 W+ `2 F
+ w U# U2 g* `, ?0 M: {2 m
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, @5 [; }5 }# Y+ w- ^9 A& ?: f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" j4 E! v8 i1 ^$ Z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 p7 D1 n c% V) y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' Z/ @8 S O( h& W$ E/ h
, }% p$ h4 \1 c% p8 \( |
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- W4 l' L D0 |9 {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ N) t* D3 K7 o( P; |& A
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" i. Y2 }/ s/ O: x$ `9 ?. m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 b' O% {8 j8 ?1 m; K3 o7 H
5 r# `2 k1 X1 Z
CSR = 0x0000;
' l5 C! A! |1 _5 M" H- D: u7 B c
INTC_INTMUX1 = 0x3d;
4 ?9 t' o3 d ~1 k
ISTP = (unsigned int)vectors;
2 e9 ~1 j' |! K& }0 P( }
ICR = 0xFFF0;
( Q* v! N4 B( ]" G
IER |= 0x12;
+ C. k' c4 B1 s% ~5 N
CSR |= 0x01;
+ S- r, h1 w9 o* z8 R# g" V _
" v) D: t" D# ]- r
+ l) s& ^' l r
3 B/ ]) ]1 \$ I1 E& F" ?6 X
还有就是两个输入输出函数:
( y) H, y! y1 i0 o; M. J$ f" j- A
void output_sample(Int32 out_data)
& x ^/ O$ T0 j/ I* |3 o* E
{
, h: o7 X/ d: @! I! k
AIC31_data.uint = out_data;
4 N) y7 A8 |$ C: a. d. k- `( O5 }! w
MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 d& g ~. ]* o) w$ F. R
}
' D2 \& B/ a( \( }* h3 |& k
, L- \. R0 A h2 X; M2 B
Int32 input_sample(void)
# z' f( o6 u0 W1 s0 j0 O7 w( p6 T
{
. ~& ?6 P% e6 o+ A
AIC31_data.uint = MCASP1_RBUF0_32BIT;
, X& @4 p0 v! g% I9 E
return (AIC31_data.uint);
( E* Y* l9 z4 Y' X' r# V' D
}
2 T3 |/ D! X8 P5 ?
" a: J1 c# {2 p6 v
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4