嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 R$ l" g' B+ `( z R, g
main文件:
) C. P1 {7 o! H
interrupt void interrupt4(void)
1 y6 Y! f+ W' m2 q1 j. V6 }
{
4 o' \/ a) F3 t$ o, e# j, F
Uint32 sample;
& @7 q0 Y% |8 t) @) L: i) G: n
# j5 Q2 g$ a' K1 I/ Y0 Y7 \4 O- C
sample = input_sample(); // read L + R samples from ADC
/ b$ y; D/ R) B# Y- j. q1 I+ f
output_sample(sample); // write L + R samples to DAC
7 I# }, _9 L* t- g! y" e* c8 S
return;
: v/ u) O& u' O/ d r8 \
}
* v" M" ]6 m x }
4 C* L1 f o4 F3 C) T' Z
int main( void )
: q) B! `, \) v% I1 u D
{
) L6 y; w9 B$ y
. k) A, r" U0 `5 ?4 [/ c
/* Initialize BSL */
. ^- N% Q0 b. t& C+ k
EVMC6747_init( );
9 z- v( M% y% z8 L9 o1 V
/* Call evmc6747_intr function */
8 X' {* S; t2 g( Z
aic3106_init( );
$ ?' F! _. N' q2 q5 O
while(1);
1 |6 y" Q& g) q$ O* f+ h
}
1 `2 e. h {4 z. z8 Z; C
0 h& K: k( h; U ^/ I M
& f' Y: s9 p; w6 \
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
% O" V/ I7 E* ?! G+ I/ y
/* Initialize MCASP1 */
7 j( l5 p/ d( g, y4 x+ a' [
mcasp = &MCASP_MODULE_1;
- R8 U8 S) v' K8 ^1 y
mcasp->regs->GBLCTL = 0; // Reset
: q% A' T0 G* B
mcasp->regs->RGBLCTL = 0; // Reset RX
% o+ Z$ I/ \, ^0 _" G
mcasp->regs->XGBLCTL = 0; // Reset TX
& c! { B1 U% C! c" n
mcasp->regs->PWRDEMU = 1; // Free-running
# i; ]& i8 b" v+ ~
// configure McASP0 receive registers
3 ?; k i5 l0 a4 x; L% }% r1 ]
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 c* ^, I, |* p1 T
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; S" ^7 M5 ~# C
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
2 x5 }+ Y1 A7 x: \
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! S4 X. E* Q" A! ~) Q" V& v$ R# [
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
" n: M' y n1 f* A f8 Q& o9 N
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
& c) s/ a' d3 b
mcasp->regs->RINTCTL = 0x00000000; // Not used
* U# Y# ?! i- Q$ T* X& o
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 R* U' s, p+ m6 n x- f
1 J: z3 x% h0 V$ C7 r% E
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
) _1 n4 J9 F6 J- p
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) u' f, R% [5 Q
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 A. O" ^/ ~. }- K
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 g% f2 l. f$ r% j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
* ~' C9 T8 s$ B! v, _
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 C/ B! Q( ]' y/ r
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 J: }+ n! ?7 K
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: }: n( X G& f' s
, L5 M8 {4 k p+ A# O$ X% V
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
! ^6 ]+ Y8 ]* y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
* X( F! y7 G3 A* a4 @+ w
mcasp->regs->PFUNC = 0; // All MCASPs
$ v. `& ?+ w7 |% P s) {- u
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 e+ D3 O4 Z g' r* `) o: l% I
! W/ k7 P: o- J y! Y
mcasp->regs->DITCTL = 0x00000000; // Not used
( j1 k/ A) h# z: A, U+ D& `0 A
mcasp->regs->DLBCTL = 0x00000000; // Not used
V: L3 j/ }* Q# B9 \. N3 w+ |+ p
mcasp->regs->AMUTE = 0x00000000; // Not used
/ O4 j( ^( n' `6 o9 ^* e3 x
) Z! H( a. X1 A$ z. h
/* Starting sections of the McASP*/
' @0 M* B( _1 l2 o+ l8 A! e
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( k/ h! i( k1 h( G" J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 k: M0 ~8 U+ i. x7 L. x x
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
0 i( c V* T2 k: e& Q2 Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" @/ m! o/ \' Z' _0 q0 t6 G2 C
3 [& z+ E% s! H8 A$ A
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 \) u% E* ~0 G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, H/ z: |. y. l2 y' g
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ f& E# B1 X% j* v; V/ T# h8 q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 I, t7 t# }4 Q3 V
( a' ^2 E7 \( u1 N7 t3 r; S
mcasp->regs->XSTAT = 0x0000ffff;
" @3 R' C' d2 R& E4 y
mcasp->regs->RSTAT = 0x0000ffff;
& z6 R J/ p k. ~$ q3 T
C& X! C W" {1 `" h3 [9 b, P- @( u
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* h0 x+ p' U5 D9 v2 h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 e4 N* a" X, T. k" ~- R* j2 k
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) e5 y5 u8 N* V z' `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ S L5 ^; r2 p# ]
1 ^! |. `% j3 f' \+ a! m; J
/* Write a 0, so that no underrun occurs after releasing the state machine */
0 L- G4 Q7 D: ~; @3 t& i
mcasp->regs->XBUF5 = 0;
! |$ ?' P0 }0 f4 P7 }
mcasp->regs->RBUF0 = 0;
9 O5 P, z+ H2 W* d7 F
5 @7 x8 P( J. M8 o' z' Q- `+ ?. C2 Z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
% n6 Z" t" ]1 _# E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ d" M2 x8 y; v6 F( W) E& l
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 g/ r! E/ q2 J2 r4 _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% D( L6 [7 i9 K6 m8 I- L5 @
2 o& F3 s- V% c' u6 [
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" w" b2 ?* \) R5 x* _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 P* l) A! i% M/ h6 y
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 i6 d' \- O, C3 g; O% _& `7 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 L! b. L0 s. x8 I0 |+ m/ B
0 Q. G6 b3 X% o. F& N: C
CSR = 0x0000;
. T/ R2 u+ T! \# C; p
INTC_INTMUX1 = 0x3d;
; r7 c8 u* D; K4 E3 @' e
ISTP = (unsigned int)vectors;
6 j$ d7 x/ {' D* ~0 d6 ^- c
ICR = 0xFFF0;
3 r6 Q" E9 x( y, l# Y
IER |= 0x12;
' \7 f) d$ s2 F1 |8 ^- a) N
CSR |= 0x01;
4 m/ R s' @7 [) q% ~) U" R
, s/ T! v7 \, |3 B9 O: u
2 l2 j4 x) R/ ]8 ]# r# R
0 I% o, ~4 J0 Q' c! R$ T, {/ u
还有就是两个输入输出函数:
6 X9 ^9 e' D1 G4 @+ u
void output_sample(Int32 out_data)
4 V3 P; W& d, ~- h4 J; J- \+ G
{
0 N p5 {9 J: B' w% j6 S
AIC31_data.uint = out_data;
( p& V% O4 r3 s* N
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) L0 i' c3 Q% Y" v2 a$ d# m m
}
. ?8 o- J& W2 G" ^2 V V, u& G9 C' v
6 R. N+ p5 L3 B
Int32 input_sample(void)
: G' L8 e8 E0 [/ J; r% J
{
5 |6 s' N5 U% C) \5 H! H
AIC31_data.uint = MCASP1_RBUF0_32BIT;
) Q/ \$ c5 k5 B; O& L4 q
return (AIC31_data.uint);
, c: X. r6 M. l: U; R+ A- r+ u
}
" }: I6 \. a/ z: K3 ~ @: I5 r
" _# E9 I5 [# w: ~0 t) j
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4