嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
; W1 G& }3 f7 l6 M D" P
main文件:
9 y9 w- R5 u \" l( S8 X* t& e
interrupt void interrupt4(void)
5 i1 \$ T" b( p, O# U; |0 I
{
; Q" L* n4 C, ]- c0 T% I
Uint32 sample;
. ]. L M( p& m" C- u3 H6 i1 [" W3 P. H
: O7 t- j& \. w5 \
sample = input_sample(); // read L + R samples from ADC
1 b" {# \8 H2 U9 k/ i
output_sample(sample); // write L + R samples to DAC
, b2 R4 C; L( U/ i
return;
! H4 Y" O/ J* W2 d$ U0 I* X2 c
}
) [2 `- W: F; t+ L8 L7 ]& ?
: l# l$ G; k! a0 o& X
int main( void )
# \+ n: R6 U9 |/ I
{
& s; E5 w/ O+ f! Y
* g. C! w& ~# ~0 U9 j" }2 f
/* Initialize BSL */
& C- s8 M- b% W+ n9 {3 T1 I5 K4 @( ?
EVMC6747_init( );
1 T i0 E7 p; ]/ w" w6 O* I
/* Call evmc6747_intr function */
' Z( ]! K' ^5 e* d0 U- I a9 o2 `
aic3106_init( );
! D1 ~) ?, p5 b- a' s9 m
while(1);
: ?7 }5 f) x* v& C& a
}
* L1 q* ~4 R& {) e) u# [) i- _
. i8 |! _1 G/ y7 {' [
2 U( @, H' a3 I/ Z- {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) n7 ?! J( h/ L
/* Initialize MCASP1 */
0 B3 `/ C4 T# y2 I/ C! o b: h; h% M
mcasp = &MCASP_MODULE_1;
( f' B1 ]+ Q* A) J
mcasp->regs->GBLCTL = 0; // Reset
( R6 L8 c( R- a* d
mcasp->regs->RGBLCTL = 0; // Reset RX
% U. {) y0 P! j9 l5 n ~; D
mcasp->regs->XGBLCTL = 0; // Reset TX
/ a' u, q$ \; j5 i
mcasp->regs->PWRDEMU = 1; // Free-running
; f. U$ t; [% a4 i0 {
// configure McASP0 receive registers
. L! o4 m) V$ O# Q% I" e) Z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
1 z" O. ?) `: T, v h6 ^* g
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! w [! E2 U5 U8 t8 K3 t
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( L0 c$ {3 j1 D4 t
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 u* p: h! I& W+ m
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
" d- u/ h' R0 q I1 l% m0 ~+ i
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
2 I" i7 M8 W" P7 m+ p1 r
mcasp->regs->RINTCTL = 0x00000000; // Not used
5 Y6 G4 D/ i" c1 w% G3 [
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 l/ v: A3 a4 h, U! q* Y2 R
H! y/ q2 L9 I% c
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
4 E' a6 `( X' F' H
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 k- T1 A+ G7 E n
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* {8 r7 Z3 t5 [) T: w& n# A
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
! k- ]/ C- N: G# J4 C
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
/ r2 s( ~+ ?3 @$ u
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 A* F2 L: t1 m, S; H
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ d2 k5 m! @% F5 u- F
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 ^/ S+ @8 P: k9 _- }
; R; f, A/ ~4 P; ~6 t
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
+ [% X7 N% S2 Q4 g7 c" `
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% n4 L) k3 {( _' u
mcasp->regs->PFUNC = 0; // All MCASPs
7 \/ s: z# p% q3 O0 B3 s; ?
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( k. R0 l9 z9 S* p- x+ ]+ m
o4 x- o& Q/ d7 ?! K, j
mcasp->regs->DITCTL = 0x00000000; // Not used
" D9 |; `& k1 V! ?
mcasp->regs->DLBCTL = 0x00000000; // Not used
9 @! W! q# D! }* U9 M. F; F8 H
mcasp->regs->AMUTE = 0x00000000; // Not used
2 f" Q# W# H7 x
0 z; U2 _ K- G- j0 u
/* Starting sections of the McASP*/
# ]0 F3 F4 L8 {+ I! T
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
; `. L: u4 r3 o) B
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% k+ X8 i9 ^* @" o& F2 c
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 e) Q, w4 P) E( R% x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% o& A& U5 q( A% k- }
M/ p6 v: ?1 y, v) ~6 i0 w! ~- h
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 i7 m* _3 O8 s: ^3 F. o/ a2 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
]1 B a" K% r0 }; J! S
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# z8 H: S9 N$ s- j1 B [) v* N5 p7 c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ b2 i9 W' H0 Z+ C7 b. A
) G3 b% G6 E; X0 k# ~
mcasp->regs->XSTAT = 0x0000ffff;
( I1 j. G) d) H) A
mcasp->regs->RSTAT = 0x0000ffff;
6 w, Q' X3 k& X9 d: O6 O
& T- A$ r7 b& r9 h
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 H. \/ V+ ]2 v- ]3 A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
- \# _: V4 M3 h# B5 e+ [& D/ {# U
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
! R/ a8 E" b8 {6 n5 B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
. O! M+ p$ N4 r1 R+ C6 U
# Q& m9 n2 @2 U! r x5 O7 k- d: Q
/* Write a 0, so that no underrun occurs after releasing the state machine */
- Y5 @) c& ?# G9 k# X2 A. @
mcasp->regs->XBUF5 = 0;
1 Z" U$ i) Q4 g" J
mcasp->regs->RBUF0 = 0;
1 R0 m# j% `% q. V* g
5 y, E* V7 w% L1 V* l
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" _. H4 Q( Q6 Y/ r. `0 }/ J) f2 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 o3 ~) q1 T1 I8 l8 b$ E j; e$ F
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( O, D5 L, A. ~8 A( d0 A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! a( r9 P' H1 [2 X9 x/ n+ s( M
/ k6 F2 R# L. M5 ]
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( v& d# T; R6 i: d! q$ O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 A. r3 V( l$ T8 X5 j& i% n! P
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* S& Y* N& q8 f# [$ {, \" `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! G( M1 E' [ P- M
* c3 k% q: g* W& T- E6 i4 y* U
CSR = 0x0000;
1 E% J: _7 t4 K N' k
INTC_INTMUX1 = 0x3d;
q$ e5 Q$ r- P0 {' \ h
ISTP = (unsigned int)vectors;
* J# M4 _; U. t% l0 y1 I
ICR = 0xFFF0;
3 g: R$ ?- m& d7 l( _
IER |= 0x12;
# S7 B( G( i; j1 W
CSR |= 0x01;
/ N! }9 D Y7 [; q
: {+ X9 m, W5 u5 a# S4 m
& ^* X! Y5 C! l0 V
& Z) f( O$ j- `' x9 Q! |8 L' ]
还有就是两个输入输出函数:
7 a( s' a& Q8 j4 p2 f, d( _0 E
void output_sample(Int32 out_data)
6 }: s; T; w4 c0 C% c2 O! t" ?" V, O
{
) A& o: X: r9 a4 p$ N( U
AIC31_data.uint = out_data;
% `8 a& Q* k9 f: W( J
MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 o+ @# H( F) t" A: G
}
- {2 h5 }. Y5 V; P, Y
1 k2 u( h* K2 t/ Z3 }9 V
Int32 input_sample(void)
& z7 K7 r8 B- C
{
% R( W4 Z& v/ K% w
AIC31_data.uint = MCASP1_RBUF0_32BIT;
4 K/ w- U9 d* M6 ?. C# i, _/ S" u# a
return (AIC31_data.uint);
: S4 w* Z J" `' v8 X) Y+ @
}
' X a2 t3 m* x% x+ T. f" I
# y) G0 j. T" P: r/ q- s
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4