嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ p" h/ Z# p5 a
main文件:
7 Z. x" M- L! |5 r* L g& Z
interrupt void interrupt4(void)
# x2 e* P2 _6 x4 k0 U7 H8 p1 F
{
3 {- V* @% y) o( _. T) F+ r
Uint32 sample;
( w5 B9 y, q% F; h* a8 Y8 \
K) O% w; \+ y2 Y j7 _4 y* l
sample = input_sample(); // read L + R samples from ADC
0 s5 J. C+ d" ? `0 `2 d
output_sample(sample); // write L + R samples to DAC
( z( H1 L4 C' l( c7 h
return;
% I0 i& T' I. O* c
}
4 N* f1 T* ^7 D$ ?" I) i( D
. b' [1 x) R( y1 f
int main( void )
6 a1 i2 }3 g7 c1 U7 `' R
{
% L: m2 `2 j% K6 O" B' o9 H6 v
1 a: C% g+ V: h; L5 V
/* Initialize BSL */
& E4 B, y( M) N
EVMC6747_init( );
& y( `4 `3 f5 w
/* Call evmc6747_intr function */
0 D0 J3 J8 g7 N: a( t* f+ a
aic3106_init( );
2 t6 Q6 ?+ t& P6 N3 c
while(1);
F3 N4 C6 r1 W
}
4 h5 U, d; {1 s9 `: m i8 C1 G
+ T3 E( g5 A. H. R
6 y* K# F" W' o4 I! `, x6 L/ @
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
Z. O R+ h* L
/* Initialize MCASP1 */
. Q1 J6 P4 u1 b3 ^8 M$ ?
mcasp = &MCASP_MODULE_1;
" f' i+ a" f! O( M$ s) q
mcasp->regs->GBLCTL = 0; // Reset
" Z" Z, J' r7 ~: H) P- |# j# E' a
mcasp->regs->RGBLCTL = 0; // Reset RX
8 J6 s- h/ E; v9 `4 U
mcasp->regs->XGBLCTL = 0; // Reset TX
+ j+ }3 ]& y0 e _# ~0 n: O
mcasp->regs->PWRDEMU = 1; // Free-running
: s- ?$ g* u6 V+ U0 @/ m$ C+ f% ?& r; }
// configure McASP0 receive registers
& r/ y f @9 }0 ?6 F* G
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 n5 b# H7 `9 Z2 A, G1 M/ p
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# r5 k: Z8 q# n. J7 Z& j2 |
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% {4 G6 Q; i w8 V! h
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& z# \0 x& ?1 X \7 H) v2 Y2 d
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
, l( W$ m% }0 E. j' c4 q3 ]
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
m5 @5 z& E* ]$ f; u) @
mcasp->regs->RINTCTL = 0x00000000; // Not used
( m/ i. _# C1 {
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 ]* G" s: ^5 ~+ T
0 M1 P2 H. ~: t5 M r
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
; l$ ~% M9 W" V/ W; f( Y/ g4 Y- E, W
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
U g. z9 Z. K" ^9 ~
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
! S: f0 t/ m& p% r5 T
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# j3 Y8 ?7 z9 z- y$ U/ \+ F
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
+ W( z& {1 j% j1 B1 G9 m
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
0 @! \0 m$ p" y; x7 ]' F+ |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ g8 x& H. A! L0 W5 p
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& w* b$ q2 u, z/ k: v& v
+ h4 @# H' I7 s; t" t
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
( B$ p5 h2 d) C3 V9 ]
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 {8 ?- \: D8 P: i, ] }
mcasp->regs->PFUNC = 0; // All MCASPs
( n: D& m0 ^6 d: _
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
# R# e9 j* c& a; r" m
: D; V* }; x1 M. `3 p' u+ z3 L
mcasp->regs->DITCTL = 0x00000000; // Not used
* p7 c* v) q" x: s. T
mcasp->regs->DLBCTL = 0x00000000; // Not used
: B( D& t% l2 d4 u& F7 M3 Z5 d* c% s- `
mcasp->regs->AMUTE = 0x00000000; // Not used
- [* j0 M- R( {% r j, ~: P
4 O( V- h% A( q& B! }8 L9 C
/* Starting sections of the McASP*/
$ |$ o1 F& m w9 l
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 i1 c Z& ^" j; \8 t R7 R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ U8 E4 o& z& v7 s- ]/ h4 r5 d$ q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
9 I* }9 g1 Q6 V2 l4 N% C+ v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, O$ i0 }! D7 R& Y" t, r
: v3 l9 z* v$ R, N: a" w1 g4 n& A
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( j; `+ T+ P" ]3 x7 c- R- @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. c+ w( Y" X' D/ z( g0 M- A( P7 S
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ U5 o; v- u2 R _7 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ l' `* X0 l% m4 n6 \
' G8 _8 Z( ?; ]# v) f- g' c/ x
mcasp->regs->XSTAT = 0x0000ffff;
4 e$ ^7 C+ a; o+ _- Y
mcasp->regs->RSTAT = 0x0000ffff;
- y1 [0 s* ^" w+ ~7 G0 @
4 k% Z& ?2 i/ n0 J) Z
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( w ~( N6 G! `* y% f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. c/ Z9 G5 \& \5 L) p Y
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 r! z( Z5 n0 q5 a A/ n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& [3 R& n$ y( u4 G! z) ^* _ P
- \2 C9 X. N; \# q; c; R
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ c3 a4 K8 L7 G
mcasp->regs->XBUF5 = 0;
! ~( D. u# H; ?, a
mcasp->regs->RBUF0 = 0;
! |1 @. ^5 \* o9 A8 e9 y
7 d0 l" k, C4 u. c/ _: n
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
% T4 O, _$ B$ w$ }0 c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 ^3 U* i1 r% d! C! _
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 \9 s5 |1 D; G) \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. O# G, \% v0 k, ^: _; }( L
* a4 x0 o1 e& t* x' j! ?
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 r s0 ]- }8 @+ n( G& W' B) E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% E! {1 v% X: Q! c& a
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 Q3 D/ C! a" o& c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- z9 P: `( K0 m' K @
5 I7 J; `6 r; ~5 d9 e/ t
CSR = 0x0000;
# u- s8 F |: G# U+ O7 b4 ~
INTC_INTMUX1 = 0x3d;
/ U j( k' D/ ]* A
ISTP = (unsigned int)vectors;
( H- O- j( N8 `6 y1 |
ICR = 0xFFF0;
: s2 s# @0 _7 l: ]( T6 r
IER |= 0x12;
, n' T$ i" R ^% r5 `: L
CSR |= 0x01;
/ ~9 B7 q7 P K$ V+ q7 A! Y
( y; t" w) L: V' N) r& P
4 h. x4 i, u2 D W0 ~
r6 h. F5 J/ @$ g8 K) n+ w
还有就是两个输入输出函数:
/ y- |/ h4 e: C7 r6 U$ V2 F+ I
void output_sample(Int32 out_data)
+ k* m8 ?6 O7 [- `; f# Y, ?$ P
{
7 U3 B W1 C* R, N
AIC31_data.uint = out_data;
2 r; N8 a7 A1 d: Z: Y
MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 ]- M0 ]7 ~! w* p0 d' p3 `) H
}
2 s3 R. t6 h- l' [; L0 F3 C+ u
2 P# Z2 [8 c- J- T$ O) Z
Int32 input_sample(void)
" i; G+ ^8 V' M$ m+ V0 H/ {$ v& J$ A
{
1 ~" Y" T( Y9 B0 \
AIC31_data.uint = MCASP1_RBUF0_32BIT;
5 B% A' T; c3 {% ^+ ]% A
return (AIC31_data.uint);
. e7 D4 ~+ f7 [
}
0 V5 `) g4 r+ ]: [9 H! o
! h T4 l: E) U# U8 O+ W# x' M/ M8 o
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4