嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
O5 g3 O; O9 J8 P; h9 r
main文件:
2 y: B, {/ f' [0 ~3 g1 w& c
interrupt void interrupt4(void)
8 ?+ l& @( W. j: P, e( f3 {, a
{
; w/ J: ~3 A2 @6 o+ c
Uint32 sample;
1 H; u# X! g6 z, z) h7 s1 G
4 `, {* k. B$ K2 f' Y( q
sample = input_sample(); // read L + R samples from ADC
3 \& `3 X9 K7 {. T
output_sample(sample); // write L + R samples to DAC
" u) p3 b- T/ W5 G0 f* b
return;
9 O" Q2 |& [" f: {* e5 K$ O, y
}
3 Y$ \" m. p5 T* x x+ [
) z9 m1 ~% q9 A; f' p
int main( void )
6 I7 n2 ~# ^7 i
{
" ^9 T/ R1 ~/ }( w5 \# q* S a- ^
( D4 A) M* q! t
/* Initialize BSL */
1 Y# ]% F2 F/ k6 U
EVMC6747_init( );
: X" d* J( w) C" k( X, A' l6 P
/* Call evmc6747_intr function */
. n" b/ }- |8 b" `6 b1 j! e3 |
aic3106_init( );
; y5 F& Y) `& t) X3 i9 L
while(1);
: _& f4 U& w, C1 M, L) H
}
9 M8 s/ Q% W3 M
7 {/ e: s) i }2 o+ E Y
1 [& N6 U d7 A5 s6 F
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. l& t! K* \, v3 X4 r
/* Initialize MCASP1 */
+ ]6 {& _2 N8 R+ A
mcasp = &MCASP_MODULE_1;
; u G C% q( Z' a2 N
mcasp->regs->GBLCTL = 0; // Reset
, t4 P) x. ]8 d. I9 l
mcasp->regs->RGBLCTL = 0; // Reset RX
`$ I: a6 c+ }( |! L
mcasp->regs->XGBLCTL = 0; // Reset TX
" N( h0 V! b- ?9 t; ]
mcasp->regs->PWRDEMU = 1; // Free-running
* o, y; M9 e3 i9 f( S* W
// configure McASP0 receive registers
% a4 L7 e; m3 t% X. j
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
9 B1 l/ e% q! L$ E% i; x( Y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; G& F# P9 c$ Q- i, j& ]' `' F
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) g0 l- k$ C. n n7 h2 L h9 z
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 f, s r5 O1 M8 S+ \
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
& q# {- L' y* \4 E$ R# |
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
$ g: V4 T7 f5 d$ R U# F; ^
mcasp->regs->RINTCTL = 0x00000000; // Not used
# L4 {% @& K5 u4 d& j
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: J6 @! \. Y$ ?
! \ N& A e. D
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
2 |1 ?' U c$ M N& v+ p
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 D- M* {6 m& f# j R
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* B" c0 I5 F1 s/ b* x
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
W- Z8 i7 t K
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
$ q$ `# X* c2 d/ s% E4 E, r1 I
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) t) }9 m4 c+ D- T3 I7 r
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
% X: b0 c- o9 O! r. _' R# p
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 G5 \8 T9 W5 l2 r3 X4 k
3 j \+ I7 m& b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* |6 @6 ^+ \- a4 k
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
) Y: y; w9 Q& N" D0 O+ K% ~
mcasp->regs->PFUNC = 0; // All MCASPs
/ b' m: U- ]5 |
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
) I; @6 _- x; b5 \
3 x8 \: I O1 F8 ]2 V$ d
mcasp->regs->DITCTL = 0x00000000; // Not used
: y% ?% i l; S" k
mcasp->regs->DLBCTL = 0x00000000; // Not used
( K) z5 z/ I7 o' m) [$ R: ]5 |
mcasp->regs->AMUTE = 0x00000000; // Not used
9 j, U( q; Y/ b5 O* d
) T, Y2 p+ z* c Z
/* Starting sections of the McASP*/
& A* ~% E& |6 U3 q# G' d+ P$ h, ]/ Z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% s* m% b3 m2 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
4 @ H8 ]8 p! m' }$ q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( J+ w7 Y1 S2 E1 t8 r: e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! r6 {6 \6 F% b! k0 B' m
8 L- {$ w4 n3 `2 q- b i
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
: v! d- }" H" r* X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- o2 s, j' F1 h. E. B' G |6 m
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& F. x0 [3 @7 {) D( P8 o6 Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 u0 \1 i u" k/ J6 ~3 m# Y+ V' l
7 B! A' l9 }! z1 ~; F2 l
mcasp->regs->XSTAT = 0x0000ffff;
# |% D0 S$ I( v
mcasp->regs->RSTAT = 0x0000ffff;
, h7 F3 p2 f2 C( D3 k
" {! E) y. e, g" o$ @
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 N9 W+ ~9 e! V6 @) r W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) C B8 D; d* l
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( f; K) z: K* m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 c- P. e! U, F* e: @6 S3 p
% \0 A# k7 W+ n: ~, T) }* g
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 y9 b( K' ~( W) I4 |
mcasp->regs->XBUF5 = 0;
/ i% q9 a/ T. e3 E
mcasp->regs->RBUF0 = 0;
% x8 R2 o! C3 q3 Q# o- y3 N
9 Z1 _5 D2 [) ?' d5 W, W8 V
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" x* Y: k7 F. x1 n9 x+ j, O+ u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! _8 n& ^$ i2 [( l. N6 ~
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# P; g6 X; R( h# I3 D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
7 E3 f/ [1 B0 Y# N' U
. h& K5 ?( u' e5 ]
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, U$ F% u8 Q; O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 x+ p0 B7 q% B! j3 Q) S
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 Q. `) C* O1 {3 g5 _! P0 p4 p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ G1 n9 e7 ^, \7 F% \ R" S
* i% t# U! \9 }' [7 h
CSR = 0x0000;
$ H8 W3 g! [! \& Y6 W4 s
INTC_INTMUX1 = 0x3d;
- E& s( r z7 D8 t/ X `
ISTP = (unsigned int)vectors;
5 Z- N! V) s$ b# L8 L0 q
ICR = 0xFFF0;
4 P; I& k X# q& u& `
IER |= 0x12;
/ `4 x4 U- R: R6 k
CSR |= 0x01;
- {9 r& |0 O) M# Q0 N f' D* y
6 O$ j' W/ q" Y8 x5 i0 m7 \8 E
% i# {8 Y1 g1 P2 G: |, H4 ?7 ^8 D/ H: x
# c" X y3 v' f
还有就是两个输入输出函数:
* j; a! g9 k2 \* H6 {6 H
void output_sample(Int32 out_data)
2 Q0 O S1 b/ B4 [% P0 k+ l
{
8 d) D- ~+ M$ A3 x% [( A
AIC31_data.uint = out_data;
; S; Z; p( s6 h2 a- u1 d
MCASP1_XBUF5_32BIT = AIC31_data.uint;
" g. ^( R2 A' R" W4 l
}
- h U# l2 ~; h) I
) D2 E6 h, a% C: U
Int32 input_sample(void)
3 |, A: ]6 S5 |) {
{
1 e/ K3 T; U" {7 m
AIC31_data.uint = MCASP1_RBUF0_32BIT;
i' C" j: D p
return (AIC31_data.uint);
! d0 c& R4 P2 ~5 A6 R
}
4 ^- `& w( T0 n8 d9 w' u7 {' ~
5 p* ]/ X9 i9 N/ a: I7 K6 s h- I
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4