嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. k) z8 j; n' E h% S
main文件:
9 c c7 X# Y- \
interrupt void interrupt4(void)
! l' A% `! U! O9 D( p, q0 S
{
$ z: \! K0 i& O4 M
Uint32 sample;
2 H! U" s: H) ]) I$ o4 f
- R& ], f8 a4 q, k9 ~- |, b, M
sample = input_sample(); // read L + R samples from ADC
5 G. e1 L" p' c( N, C3 M S
output_sample(sample); // write L + R samples to DAC
7 ^7 K8 b/ a, W, P7 q
return;
W: n, P2 }% r9 m; f* D* J
}
4 D H- L/ R0 W: p" F* Q
0 `; y' o1 l; ^4 K0 b. {4 U/ t
int main( void )
1 R/ Q: w) q% {& i( A
{
; F( C+ p8 n( a4 W& v# h6 {) e
; ^# U$ ? }+ P+ |
/* Initialize BSL */
, Y9 W2 \ x% l/ p4 I6 {
EVMC6747_init( );
R2 ^7 W, w) \. }! m
/* Call evmc6747_intr function */
# v$ p8 P) q* \: g4 p
aic3106_init( );
4 j y9 H- Q; o& L, g
while(1);
4 r, `* a9 L/ F( f& i! M
}
2 }1 [8 j# h5 A0 E9 F2 L N4 H
) {) r4 Z- q ^0 s8 V& j# n I
E! i0 b* N: M
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' ?- V( e8 a6 L8 y2 m, C7 B2 `
/* Initialize MCASP1 */
2 F2 T9 v# b* j- o' ^- l9 B: G$ f( a8 I
mcasp = &MCASP_MODULE_1;
2 s3 s2 m" j! _2 C: x. w$ T
mcasp->regs->GBLCTL = 0; // Reset
: \# o$ Q' \# u/ T9 h
mcasp->regs->RGBLCTL = 0; // Reset RX
% Z C1 O e0 k3 ~8 }
mcasp->regs->XGBLCTL = 0; // Reset TX
7 c4 k- r# k( `3 u( u
mcasp->regs->PWRDEMU = 1; // Free-running
) D, E) o! a9 \7 z. L( ^# N, K
// configure McASP0 receive registers
! \: Z0 C1 g' W' G( H7 z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
' R- Z9 p" @& l
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 k9 @" S" C+ p7 ~/ J+ N# h$ F4 r* s
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
- }, a* I/ K4 u; u( U
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ B# W J8 i/ @. y* O8 N; y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
$ |; G$ O- y9 w% s
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
3 g0 [* y& j! M7 f2 A% p* G
mcasp->regs->RINTCTL = 0x00000000; // Not used
6 }3 r3 P3 @( b
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 F% n$ o7 Y8 C" P/ ^/ m2 n$ E
) M) L/ @. J0 u" T/ G0 ~
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
% J. m5 J. k7 d. \! J
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: \0 K0 Y7 ]+ z( l3 A. u( d ?
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* M5 z: \# N6 C+ a* h. h: v
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# K4 H! g3 b! m: [1 o$ U
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, Y( R9 y. k$ z6 b1 T8 f% {, @7 T
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
( T+ S0 s, H: I3 h
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 p2 B. l; k% L8 t; Y# e
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, a# S( @5 N1 L
9 Y7 Y; S. M' l- R$ f" Q
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 U( f8 f( a j1 X
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
6 E5 O2 N: f7 ?5 Q9 ^8 _4 H! B( H5 R
mcasp->regs->PFUNC = 0; // All MCASPs
9 R, J9 o6 |6 U4 p
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- P# A# M3 |% u; k0 N
* J: e6 f/ `0 Q
mcasp->regs->DITCTL = 0x00000000; // Not used
5 S" v0 G8 l$ f- Y8 y. h0 W" [5 Y$ o
mcasp->regs->DLBCTL = 0x00000000; // Not used
9 r: h. W# ?$ l, N3 g k3 C% m" j
mcasp->regs->AMUTE = 0x00000000; // Not used
$ e: `! a! q+ ^" R) H. m3 Q5 T: N
3 Y* v# P, k$ q. c+ O# k3 \
/* Starting sections of the McASP*/
9 O/ c! X3 M' j0 x# t# P2 _
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* D1 T* I5 v2 |5 {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 e6 ]4 A2 w4 l* R2 O8 G
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ y% Y! y( ?, h/ N8 T6 l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# ^3 i0 C7 w+ i! j# `
. y% v1 @! H0 h; T. r! H& Z, a; {
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 e! V/ N. Y. h0 B r0 L5 o1 m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; l7 M( G. f4 m7 l/ @5 s! V
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 _* J8 B, i: J1 T) u F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 {' ^8 s9 ?$ y) `# ?
' ^8 A& a# U0 B( ]
mcasp->regs->XSTAT = 0x0000ffff;
6 ~$ |: ]% I* t! D2 _& ~
mcasp->regs->RSTAT = 0x0000ffff;
! j, t5 \ M* S9 l: C
5 e/ a1 ~' Z5 L3 p- w7 p( ~
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! |, f- a. T! Q6 C2 ]- p" {% q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! Z; T) M: D% n
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- s5 h' a6 m: T% b9 S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
' o# T$ w) T& L- C* z8 h
0 g! v7 e+ }6 v8 S" {9 H
/* Write a 0, so that no underrun occurs after releasing the state machine */
; s. H% h, \/ q B* p x
mcasp->regs->XBUF5 = 0;
5 G% u3 x% q g5 P4 j' f4 q
mcasp->regs->RBUF0 = 0;
1 D/ p3 `0 f' q3 e9 H: x2 z' {
( ~' D1 |/ S% {9 o/ K9 w8 l1 y: n( ~6 o+ }
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 W; ~' B; J+ m) T' o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ X7 B) N) c5 Y7 {+ P) n, Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ B( u8 [, Y/ i1 O( f; w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% A9 G. ~1 Q/ e7 f6 u+ @
* G$ Y( T# R7 W- v% D
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
4 s5 m0 u$ l3 g+ t) f% Z$ J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) C9 G u- O1 k; Q7 X8 O1 H7 y
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
: e7 @4 d" d0 V5 c* r9 P; e5 G' J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. j& T J% ]4 g* P6 x1 t
. ], O6 q8 X: q$ X" u! J' ?
CSR = 0x0000;
9 M! j0 K: m" e1 Z
INTC_INTMUX1 = 0x3d;
+ D3 N2 E" X. X" [, K% [! |2 c( U) M
ISTP = (unsigned int)vectors;
) W5 n) ?* ?" q; R" n) s& I
ICR = 0xFFF0;
3 _% e$ Z) t! h. o% a# E
IER |= 0x12;
7 L; p& z, f( g4 @0 e) _
CSR |= 0x01;
0 e2 V! y6 k2 e |( `
8 w* b. [. g" o/ h* `: ~* q
3 @4 F8 ?4 f' Z, j! ^) c1 V" [
$ ]2 I, P2 O3 i/ `
还有就是两个输入输出函数:
) P: P0 g' f1 {7 P- G3 H
void output_sample(Int32 out_data)
4 E8 Z) v$ e* C0 f$ s
{
* a3 t& I1 q/ i
AIC31_data.uint = out_data;
7 E" B9 K! g+ U) k6 p* } Z3 O
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# b& F- m' p g( }& F( S
}
4 G4 b; c% S* y' e8 y7 `( G! w
# G+ Y( r9 ]( M' Z
Int32 input_sample(void)
, `3 y+ B! J1 @% O! H5 v* v, ~9 b
{
! E/ [2 ?0 a& h4 z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
. m. o: m1 t' k$ z' f) I
return (AIC31_data.uint);
6 p1 Z7 B# n: Z( n7 ~
}
9 s; O/ L+ _ |. ?& D
$ R1 t! ?0 Z. |! Z8 U
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4