嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 n B0 a% Z( d7 p2 Z D. R
main文件:
2 Q/ n8 d, Z# x3 ~* @* b4 [) {& e/ K% ^
interrupt void interrupt4(void)
) i; o2 W7 B/ B0 P6 G8 G
{
* {2 I% _& C6 F. j9 j& X
Uint32 sample;
" s3 I! |5 S% l' J p
6 T" t4 \1 I% V% t7 u% ?4 g& N' Q
sample = input_sample(); // read L + R samples from ADC
& j2 w! R7 Z* q
output_sample(sample); // write L + R samples to DAC
+ r7 s+ Q# H6 F$ U, j5 u; i
return;
% m5 U, m9 G* T' K
}
" e2 d1 Q, F' u$ ~
9 s- R2 j' }# Z* W
int main( void )
4 \1 p5 E e! K: j
{
8 _3 y0 I% X5 U+ W
: M, q. u; P' H. w
/* Initialize BSL */
9 C. x) w( N }$ P
EVMC6747_init( );
& R+ J( n: Q. n# X. `( Y! O0 a1 p( {% x
/* Call evmc6747_intr function */
1 w7 q' R! d2 y
aic3106_init( );
- {# _/ T1 G, Y
while(1);
! T {$ l6 g# n' [
}
5 e9 ?- [2 W1 C, _ O% g7 b2 }4 M+ D
9 P: I0 _6 a5 k! M; {* v
$ C( J* w2 B: d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ g0 d2 p' |+ D' P! c; M0 j
/* Initialize MCASP1 */
. L7 Y' a" ^) Z5 \! c6 t6 z$ X! J
mcasp = &MCASP_MODULE_1;
7 D9 [) G0 O" j. |+ X. \+ `- R2 `
mcasp->regs->GBLCTL = 0; // Reset
* O! x# H7 q+ s/ [. d! Q
mcasp->regs->RGBLCTL = 0; // Reset RX
- B0 g) f+ M5 A! G- h/ i
mcasp->regs->XGBLCTL = 0; // Reset TX
! R8 O7 Y# _9 Q& _ X2 m5 C
mcasp->regs->PWRDEMU = 1; // Free-running
( e+ W/ U; b1 T% V0 i* F
// configure McASP0 receive registers
1 I0 t E% A2 m9 C6 q' `+ y
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
2 o3 \' ] o Y( ]. O
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* I3 W$ z% p) S! E% a% X
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) K: z2 [( _# l5 @
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 F' o0 `/ O/ d$ g6 D B
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! k1 O e, }' b1 I# a0 b9 e
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 T- a' e" J/ z5 Y% R
mcasp->regs->RINTCTL = 0x00000000; // Not used
# N0 B; ]4 }0 B) s( M" O4 m
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* M1 \0 _! b; U% k! z& Q
7 _9 U) H/ `" S( a8 C' z7 P
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
- f2 P$ Z, U9 ~( F w
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# W' P% R& c* B( H( d- [+ S
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 y& d) ]% s: Y. R' z4 x
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 h+ y4 V. \7 c) h
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
6 ~/ x/ \0 }0 W8 E2 y! m9 z% ^6 ]
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
/ f) @: U* k, d) T/ R
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- L& e5 M* ]4 u+ @! l
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! G+ e4 U+ ]( J' ?7 W* D' }6 R
- P5 h( o+ C. V1 U! p
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; i& O4 c B; E( W: l- o2 T0 b
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
/ `) c3 Y5 o% }3 K
mcasp->regs->PFUNC = 0; // All MCASPs
5 ~% R! Z( v3 k
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 ]' n; H8 y6 k! p. `) g" @" ~* F. O7 F
# W3 G5 G* V" J$ K. [
mcasp->regs->DITCTL = 0x00000000; // Not used
V5 b( j8 t* [
mcasp->regs->DLBCTL = 0x00000000; // Not used
# a v P7 d+ K. A
mcasp->regs->AMUTE = 0x00000000; // Not used
! l) X) t& K- w7 a# d
0 e# ?* y) @: J5 Y
/* Starting sections of the McASP*/
0 K |8 G2 G4 d8 e7 ~& z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: t& \' I0 b. v/ R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
" |- D5 k+ ]& S/ W7 E* Z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
: V8 y0 i# `% O* }( A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
m3 v. [. @( ]! {8 p8 f' X6 X" f& x1 b
, s7 z9 S$ k) r7 p* g
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 e6 Z; v+ t" U5 T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ F* h" ^7 k. j* c; Z* f/ D+ N
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
6 g N# {8 r+ F7 g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
. w, _- \8 z( s! K. ?6 d
' e; g) r; T5 b$ V# t
mcasp->regs->XSTAT = 0x0000ffff;
; h! |8 o# z7 f; F+ I" A8 n Z' s
mcasp->regs->RSTAT = 0x0000ffff;
7 E9 z: O1 V$ j1 N, N/ B
7 L- V/ t9 Q+ G* d7 R7 ]
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- q3 t: s& X% A7 H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 Z! {8 M# {/ |- J" R
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& s$ X. ?3 s( q% {! _% U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# @7 p( X5 L1 D. N2 R4 ^4 A7 ]
7 ?. N; L8 k/ R# c: `: n
/* Write a 0, so that no underrun occurs after releasing the state machine */
8 W" @- ?) [7 o) ]: ^( ?# S* {
mcasp->regs->XBUF5 = 0;
% S& v2 Y6 V) t4 Q
mcasp->regs->RBUF0 = 0;
9 `/ g* ?) z6 e" M) D& i' @
9 L- f: [6 M' P: a/ x; C
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
* d# Q( y! ~# P3 l, o1 ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 @3 S E" g G9 A2 Y0 ^
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 l4 x8 G( U9 _% n$ S# I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 R/ n1 V8 B5 j; t! f! j" j
- q' L! j8 X ~' ^& N" h
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( _% ]( ~5 E1 W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! R- K( j' v: z8 n: h
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
4 G0 v+ H2 ]; c: ^ J+ }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 T" d7 f$ X( E: v' G
+ ~6 u1 v1 J6 H9 Y5 n
CSR = 0x0000;
, X7 M& z& r' f4 ]2 J
INTC_INTMUX1 = 0x3d;
; U2 P- j6 y1 n" |1 H
ISTP = (unsigned int)vectors;
7 j( E' }& C' u: F- e- {5 }$ O
ICR = 0xFFF0;
$ _7 w6 B/ `% Y7 U5 v. z8 G
IER |= 0x12;
/ c% E' R* T" v W9 ?3 p
CSR |= 0x01;
4 I' I9 N! j X0 T2 g8 ?
$ q; s" [' O8 z; q4 u& K; j
% B i& ?& {1 E/ S6 |1 j
( w! P [: q& V1 A2 x
还有就是两个输入输出函数:
. w. L3 q& Y! y7 e7 H2 ~7 q) x
void output_sample(Int32 out_data)
6 J @, V5 Y5 k" n8 ^! V l' M: y
{
% {/ f, g% X9 n4 E n+ Z# }
AIC31_data.uint = out_data;
' b) {3 K6 ~8 G" g
MCASP1_XBUF5_32BIT = AIC31_data.uint;
- S- Y& L# y* g9 n) l- ^
}
- _3 x; Z% l9 J5 R) y7 t( z
% W& a0 _2 p; w9 g/ W+ y" H4 k
Int32 input_sample(void)
9 b% c) M( |, O, z. Q' k2 t
{
# d4 H3 [5 w- O' B4 S4 z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* B% ^/ j$ J' @- ]. A/ B
return (AIC31_data.uint);
- u5 F9 S. ^( T( V
}
6 V1 J) A3 Z" X. @2 h
& ]# p# Y- _/ W$ {" p5 @6 j
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4