嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 K" @5 }* q f* o Z# j$ I" R4 R
main文件:
4 e$ T8 J* q% [+ y. d
interrupt void interrupt4(void)
$ z) i+ r D$ M1 f" w# l3 m
{
4 n) L( e3 A3 m* z
Uint32 sample;
5 a& M n- X. ^' y9 x' B0 I
+ Z6 _$ w8 K( c! [$ o
sample = input_sample(); // read L + R samples from ADC
) q0 o7 Q4 s$ T# x( ^
output_sample(sample); // write L + R samples to DAC
/ @- L5 w+ x3 C
return;
?6 ^! x( u5 }& d3 s3 J4 q
}
; Q: P5 K! T( i" ~( @* j7 f2 ]
6 \/ m5 p/ b- V7 {, s/ o$ s9 G
int main( void )
$ C M/ x/ u# n$ z4 o p
{
R( t; k, |- w
' n. W6 K$ H6 ~( G$ H: h
/* Initialize BSL */
, y) G5 `! U9 h
EVMC6747_init( );
0 a8 s, `2 r7 s
/* Call evmc6747_intr function */
$ s* K( U) R" Q: U$ {# V
aic3106_init( );
$ @+ |0 k* n3 f4 j5 ~. l) u c* N2 a2 j# \
while(1);
9 ~" y0 R( K, Q) P+ I5 r- J) o
}
- Z6 Q, z, O+ j7 f5 `% b' c
9 u; T- B4 y0 H( p
! }# A$ F( O; O0 `3 m* n- ?/ i
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 x) ~3 n4 @) N* M2 w, B& a
/* Initialize MCASP1 */
8 I, O' N& \+ E( c$ v) s8 U# Q& `
mcasp = &MCASP_MODULE_1;
( ^3 q. Z1 g2 A4 s; {! B# X
mcasp->regs->GBLCTL = 0; // Reset
( b" g8 Y( S1 a8 R" w: b7 s
mcasp->regs->RGBLCTL = 0; // Reset RX
, K7 B6 [. o7 g! |0 u# @6 @# W
mcasp->regs->XGBLCTL = 0; // Reset TX
0 b# _4 s9 p J" a& G% ?( K
mcasp->regs->PWRDEMU = 1; // Free-running
2 T) l% v# W' R" m
// configure McASP0 receive registers
0 n5 ^- @7 H1 v9 K
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
- H# K1 o8 z+ d- j! V! r
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 z& r w4 b/ B) z5 j
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, Q: V% M1 g |" c
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
" I& {/ q4 P! _ W/ M
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( W/ g! ~* i, P
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
. u/ Y% ?- b1 E: n
mcasp->regs->RINTCTL = 0x00000000; // Not used
: l* Y8 E7 B( v! e4 s! R# x( b
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) Y( Z- G% q2 P. y8 ~" I8 z! H2 R
' L8 E9 U7 |6 c# N
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 w$ l9 D7 L4 P" S& X4 A& O, {2 Z |
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. ?- g: e8 E( @5 q( D- Q7 r
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' z9 \3 p5 A0 b7 a9 T, d
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 f1 D1 M, N7 @6 v' R
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
/ j% ?8 J2 {2 a# S( X
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
( E$ t$ o- ]( B
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
7 R& `' U9 \# D# q: ~% y; d1 Z1 b
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ F( @- \. ?( M' V" E4 c, H
- V. n+ j/ f# X
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) @& x. k) b2 \( g6 z0 t
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
: c$ b; {8 T& S' h8 |' a
mcasp->regs->PFUNC = 0; // All MCASPs
, e2 r( x* P. b) n) G; b
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 C* F" S- _4 Q( v! s$ q
; E) D; s. W: O4 v$ h [' C# Q
mcasp->regs->DITCTL = 0x00000000; // Not used
& `4 m( {1 ]1 L. v/ ?, ]9 o/ Z
mcasp->regs->DLBCTL = 0x00000000; // Not used
4 r) S2 H% y, _% ^
mcasp->regs->AMUTE = 0x00000000; // Not used
3 D! C6 `, E9 n; l c
* o* ^2 _$ s3 g$ Q3 k
/* Starting sections of the McASP*/
) Z! ?# r! m0 b, \, Q# K7 r
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 p% V8 o# X) _( T, E( _; k; s8 \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
4 y. ^) B; d5 k1 a3 y
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
9 ^: `: \5 t% F7 A) d6 l. M$ ^! y( x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( b2 y! P' U; c z$ H: \# P4 I
% C# x s$ s! D8 o% o
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ l0 Z" L4 f* {6 b5 e& |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 w3 h7 J) }% r0 t. B
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" n' s( U1 T( S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 y4 r, ~( d, @. o7 N
M3 a: I, F, f. w) y# t
mcasp->regs->XSTAT = 0x0000ffff;
$ O! h# O1 m, {, ]+ q
mcasp->regs->RSTAT = 0x0000ffff;
5 U3 G# K7 u3 H& \$ P" o
. a9 t8 D+ g5 y1 H' K
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 m4 r7 K- `" h O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
4 a4 X1 J% i! u% E
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
7 g; e: T: u. z R$ k+ L$ w5 t+ m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
, u3 L+ I# N& U! c3 K9 p
0 a* u0 P* \9 S9 b$ m% L
/* Write a 0, so that no underrun occurs after releasing the state machine */
5 {6 T$ A- }4 F6 F9 D
mcasp->regs->XBUF5 = 0;
6 `9 s3 |# H6 O1 y/ ]% ]* h
mcasp->regs->RBUF0 = 0;
* F h* G* U" \" J6 Q
. O$ Z( @7 p& V& V
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, c) [2 }8 T' s/ V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- h2 E' f2 R0 h7 {: V
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
$ X8 ^7 q2 r/ O' {- q8 l' Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
7 x( F5 i& w3 }7 @+ {
6 {1 n) y) o. u+ ^8 U/ @
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" B) _7 K( l" H2 D }% U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
1 I; w* k& S$ C
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
- a8 F4 _3 a% E3 w6 c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# F( l9 L7 A' [4 T
$ T S* i# r3 P! |/ e2 {+ P
CSR = 0x0000;
- _; L( ~& [9 p1 Z4 N
INTC_INTMUX1 = 0x3d;
# H' W9 d8 E+ g |) g) I" x- X
ISTP = (unsigned int)vectors;
* j: k6 w+ V9 y8 d
ICR = 0xFFF0;
! ~! }- P5 N m8 j
IER |= 0x12;
# S: I6 I6 A! R6 |- D0 N
CSR |= 0x01;
6 b9 n' ], y' a) w
5 f" B9 u+ b* z) M
R: l# D% j! S/ g7 S! _
+ g) C' W- m, G0 o; ~0 x* a" A) ]) Z- S
还有就是两个输入输出函数:
8 d* m0 k! {/ _0 z; J) h1 Q
void output_sample(Int32 out_data)
$ l& k# h G) a8 Z
{
7 j! h+ A! u" z: \. u0 O
AIC31_data.uint = out_data;
2 I y0 ?9 r6 h
MCASP1_XBUF5_32BIT = AIC31_data.uint;
' ~: \* X k! _4 B
}
$ t% n# k( a/ q& O: K
/ d) M7 P4 s j3 [
Int32 input_sample(void)
) y% ]* R* u4 N8 V( @2 p* o" i5 H. f
{
; e# p- [/ A; u
AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 P. R* j) ]$ X6 D6 q( t+ p( F7 z
return (AIC31_data.uint);
O# N* H" s; \- J @/ `
}
( c# h5 T" ?5 y+ t: E
, Y, o3 V' r+ f; a
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4