嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 z- W7 X3 {+ O1 @8 F# g* P
main文件:
h7 p( U2 W' \+ J" X
interrupt void interrupt4(void)
8 |6 O* o' F l J
{
5 l, s3 V, v E9 K
Uint32 sample;
; W6 R' z/ L6 F" h# o- Z
8 ~; c9 |% B8 j3 M9 m5 L
sample = input_sample(); // read L + R samples from ADC
+ g8 ~7 O# h* g) r/ _
output_sample(sample); // write L + R samples to DAC
- [; A7 G) D+ M3 e/ p9 S
return;
& g5 K9 t" @- }7 K' }$ M- C7 t& N! Z2 g
}
3 H/ B1 I _! U2 C. A
9 ?& r" _( e9 k
int main( void )
3 {( y8 F* B& |$ ]! K" A B
{
3 L+ ]9 J9 ]3 k7 |, i$ N
/ n6 u d- F g6 l, x
/* Initialize BSL */
0 n) j- P8 o, t9 F8 b9 e- T2 a1 T0 s$ b
EVMC6747_init( );
* k, Z. x) q& X( Q4 A0 `# O( D
/* Call evmc6747_intr function */
' A; Y( W K2 i8 \
aic3106_init( );
1 X8 p/ W, H/ Y7 v* c
while(1);
9 c s" Z% r+ S
}
2 S& V1 Z! a) o8 n2 V2 h! K" S; Q
2 `2 S& W2 ^* d+ b
$ X' ]) ]# k" ~; M" g$ n8 h, Q0 U: \
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 y; c( A- @9 S. r
/* Initialize MCASP1 */
( D+ m! L0 Z& U
mcasp = &MCASP_MODULE_1;
# m8 ^6 o3 r+ D( B: t" {' d: K2 S% J
mcasp->regs->GBLCTL = 0; // Reset
: }2 F7 }% `- I9 j3 K/ G! ~
mcasp->regs->RGBLCTL = 0; // Reset RX
& I. `. c% A$ g
mcasp->regs->XGBLCTL = 0; // Reset TX
9 Y% B, f' c. \- N! B
mcasp->regs->PWRDEMU = 1; // Free-running
7 P \+ U+ B% b6 y* R
// configure McASP0 receive registers
3 m/ h- C+ c2 r4 I! ?
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% M2 B7 b1 O5 w
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 Y8 ^# \7 S: P5 a: S9 {6 j, F. G( H
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) o7 \0 ^ y6 a( N6 l( X0 e1 R9 a
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ i2 K* T# l. _5 ]3 l# L" `5 s9 m
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' V* V! W: W$ c9 F I5 _
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 H$ Y" v8 I. J
mcasp->regs->RINTCTL = 0x00000000; // Not used
" U7 l- A7 \# T {/ D! W
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! Y" {& ^. j' c% U, G$ _
5 d9 q' a, n6 I; E# x1 ~
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
4 C2 r) y) U1 Z. o$ B. ^/ i7 P
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, U+ _0 R7 i2 f" r/ N
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
1 y8 @2 I* a5 [$ b5 Z6 W; l; g
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 Q# c# b- }- N% n. R
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
2 `5 D- h! a; _' g
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
5 Z' _8 e1 r; o( w5 m Q
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
! q( Z5 U _. N3 J# s
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* B; ^ v- L* b# b( L
6 b0 M# X2 x8 P- n# r- v4 W V3 ~
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* c4 D+ Q& ]. Z% `4 e0 e+ f% d
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 i$ S' E( y; @+ H: y
mcasp->regs->PFUNC = 0; // All MCASPs
9 `1 q1 X0 } B3 Q7 O
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* e) N9 F6 b" Z; p9 [
3 N" ^9 e1 F" |" M! @! j
mcasp->regs->DITCTL = 0x00000000; // Not used
* P! V3 B; [5 T, Y2 X/ }( j* y
mcasp->regs->DLBCTL = 0x00000000; // Not used
5 \9 k, X1 p4 p5 F" w. J, W# W3 W
mcasp->regs->AMUTE = 0x00000000; // Not used
! [, F: {5 D4 J& r, h
$ o8 R; x+ T7 a- e! b, [
/* Starting sections of the McASP*/
: l- l' \) t$ s* i+ Z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ I& L' v: _! i9 v- f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ I; Q% a4 M1 s0 T$ q" G* K
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 C7 N( A* k/ B) D- w, h/ H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ ~: c) X4 u$ {# p
" B% \2 U/ _3 i K% H, r0 g
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 Y( V# D* M, @# W; g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ y: W3 S+ u9 \+ d6 H, C
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" E6 t$ Z8 e# h5 s0 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' X2 y2 l: {) R, o( l5 n9 P4 c
9 G5 Z; N# W$ N! K
mcasp->regs->XSTAT = 0x0000ffff;
4 ^/ s% H+ E4 M6 R$ k4 p
mcasp->regs->RSTAT = 0x0000ffff;
4 E6 e \; i+ H
& r) w; z$ a4 s4 h
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 _- W$ F; z9 u% n, E2 k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ z% r" E1 s8 ]% P% _3 u% I
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ g& K; A# I& X# }, ]4 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 \& a r3 e+ b8 M8 P
' k5 B/ y/ B0 |. |+ {$ [
/* Write a 0, so that no underrun occurs after releasing the state machine */
9 X. h; Y! ^1 b. @
mcasp->regs->XBUF5 = 0;
e, P2 ~" e" K5 d4 r0 w
mcasp->regs->RBUF0 = 0;
/ w% }" v# O+ H/ h( N L3 p0 `# v
! g: U4 Y6 u2 a* c
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, H$ [7 E! Q" M) L# n$ v. B6 u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
2 r# g' P( @: G: s
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# _) ?( ?7 b+ R# z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* ~$ q" E7 J# o# }
# A0 T' B9 x, K6 Q( |, h1 h
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# I0 D1 D; l3 T: b7 r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 T$ S7 ?) H6 X+ ]: O/ p- |) `
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 t2 p8 @) L. E( Z8 q& M( T3 e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. x/ L( Z0 O8 W6 r
9 |2 ^; t, R* e( l9 U7 m9 h
CSR = 0x0000;
- ^% ~: b, l* c0 \
INTC_INTMUX1 = 0x3d;
' Z. G% \3 i( g; l* n
ISTP = (unsigned int)vectors;
8 W) w9 |9 v9 [1 L) E% f) f: o0 h
ICR = 0xFFF0;
+ q& R0 c2 L9 C' `3 T% f
IER |= 0x12;
- Z6 @/ c; L2 K, A' U
CSR |= 0x01;
4 j1 G a/ w2 w7 D. t, @$ E
~9 T' a8 ?# r8 f3 d2 S& `; a
! _ `' h7 m1 a0 M# Q/ A! n
/ g; p* Q; } f2 O4 K8 g# \
还有就是两个输入输出函数:
( z" a) I. H( W$ b% d7 z/ G
void output_sample(Int32 out_data)
6 e5 V% z H, m9 d5 e
{
1 G) U1 v9 o w* U/ R" V$ m1 w
AIC31_data.uint = out_data;
h. z9 N& B% x6 W& ?8 t0 C
MCASP1_XBUF5_32BIT = AIC31_data.uint;
& ^2 q6 E, K! R& z1 ]9 v6 s# [
}
2 d: \+ ~- j' A# |
2 j7 \ `: ^6 `+ o9 B% d: ~
Int32 input_sample(void)
1 _6 f- c+ ]# f3 G/ H' Q
{
! _0 ]7 P! x- |7 o2 `
AIC31_data.uint = MCASP1_RBUF0_32BIT;
. l; ?3 m" G; @* V# i4 d' v
return (AIC31_data.uint);
7 @1 \, Z7 D+ X T" F7 m
}
+ q( R6 h' [; O% O$ T! |9 ^7 y
4 @% F: f/ L1 [: M3 S* y9 g- c
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4