嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% G' ?+ I) {2 I7 I8 r
main文件:
. ~4 N7 J2 X' _4 {) g; O5 D ?% V
interrupt void interrupt4(void)
+ ^2 S6 G8 g$ L% `3 @
{
+ ~& N# S3 C7 G" r; q
Uint32 sample;
2 `, e0 r5 K( B2 |
0 A) h2 y- M- u( Y" j- c6 x" o
sample = input_sample(); // read L + R samples from ADC
; m9 `; \# v" n/ [+ h3 {2 X3 B% S
output_sample(sample); // write L + R samples to DAC
6 o2 W" D L* G$ D4 G
return;
, _5 l5 `* w6 v4 n+ [6 P8 f/ Y
}
( X/ r9 x9 e s L% o- g2 S
3 x/ J$ i h) b% p* @
int main( void )
. j/ t5 |% Y% _1 O- L- x3 j' K
{
6 M# E7 F/ W, x+ d5 b
3 O$ L3 J- X: z, U4 D
/* Initialize BSL */
6 Y: H% g" M' l( M1 x F& b8 g S. I* z
EVMC6747_init( );
. y- |7 ]; `. l* v( o* p7 M
/* Call evmc6747_intr function */
& N' S K" ]2 L! g6 u
aic3106_init( );
) F: P/ n$ u' |9 z3 u
while(1);
5 b, |# B( }8 ^1 y5 I
}
+ J! Y3 N; v6 } ?
! }% A! s; z( F/ J& e
1 I, E5 J! T7 c% {+ r' h
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 c2 [8 f3 z5 v! g3 J9 K( m) C# e
/* Initialize MCASP1 */
+ K Z% o, S4 c4 O1 M
mcasp = &MCASP_MODULE_1;
8 ^% I, @) F3 L" H# {
mcasp->regs->GBLCTL = 0; // Reset
% K9 [2 z P' O3 v* R7 E
mcasp->regs->RGBLCTL = 0; // Reset RX
- ^! ~7 i h( g3 Q$ p
mcasp->regs->XGBLCTL = 0; // Reset TX
; J# j6 ^5 d( B+ c1 K
mcasp->regs->PWRDEMU = 1; // Free-running
: G# E* B9 U4 } i
// configure McASP0 receive registers
& Q% @$ @1 X4 c+ ]: d5 T
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
' P- K8 o2 R7 ?& P# y6 `9 _' U, C' d
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' X' e& V( b, f' D0 g
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 U1 C9 L& {* p2 R0 L* w& u
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 P9 @/ g$ {7 E8 l8 q+ ~
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
" E) _, E2 s9 c4 R
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 w! E+ o; B; ~8 O$ J
mcasp->regs->RINTCTL = 0x00000000; // Not used
2 m9 _$ ]5 U* i9 G
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 _9 d. |5 _+ ~7 {
# U. W+ X% ]- Q1 c4 ~" h# E# M
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
7 T [# \3 G$ z0 O
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! p6 w6 [5 a* F7 n: g# n# W
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) K) I9 r0 h& b7 p
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' E; K A2 X# s: @
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
4 N8 Z: j; k# J1 w: r( {4 b5 F9 X
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 c) v/ P7 V1 v9 Q" H4 J! l
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
$ s# k8 S( z6 ?: P# n- S& g! I% q
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( U: a1 V7 U# h
8 Q! T% I1 R, Y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
C) r9 _1 a. v1 G6 p! @/ V! h( W5 d
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% X& \2 T7 K$ ?: ~& l
mcasp->regs->PFUNC = 0; // All MCASPs
: Z1 W6 s6 ]$ F& K
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 R1 B/ d) _5 v6 i1 I* N
, [+ X2 t, K. q8 y- ?- X- n- q
mcasp->regs->DITCTL = 0x00000000; // Not used
0 r; Q# c6 D. M7 a
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ s* y# [5 @- X' ~
mcasp->regs->AMUTE = 0x00000000; // Not used
7 {/ l; U7 p: n
0 |0 [2 K9 M E; _
/* Starting sections of the McASP*/
( g3 ?) J- l- Q' |) y
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
9 k7 |7 ?5 q* H& d/ ~$ Q4 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: m. f( X! P" w
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 T" {& y* I; v2 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 O2 H' P* a& x" ?: [( y
) d0 |6 [- U. m
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
p# z! u: I* [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 B! B5 ^& V4 E: Z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( H3 p2 t# S% I# t; u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 k t4 ?- J) F
5 W5 J# ~# R2 Y f( v
mcasp->regs->XSTAT = 0x0000ffff;
0 j$ ]9 w* U# q+ w
mcasp->regs->RSTAT = 0x0000ffff;
5 f" I( H: |$ o/ f! E3 M
t) R1 E+ [* l, a+ t8 f2 \$ R
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* H: P, G- k. b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. K* }6 }$ ^/ x5 k9 A& H, s, e
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& r8 t4 S' d; g+ [. Z- `+ d* A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 _- l- V8 U- W3 }
1 M& U& f2 [/ D! J1 p
/* Write a 0, so that no underrun occurs after releasing the state machine */
- f5 q. J, Y) K3 U' n
mcasp->regs->XBUF5 = 0;
$ R+ s( k8 M" I+ R- h0 u$ P
mcasp->regs->RBUF0 = 0;
7 s5 {6 C2 c* O: y/ L8 f
. c/ m8 v7 s' G: o# y; G
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
' R- Z& y0 Q. n7 u% k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! S: [: r0 M; | O1 K3 |
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ O1 @6 |- ~6 g- L6 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ X2 n% b& E! ^; r) _& o5 E
- y0 _6 g+ _3 U0 J
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
. i4 A t0 @0 I/ { \" J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
; l2 Q' E4 S* L
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' b' I7 t0 s; y' D- k; ]5 L9 A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
% |8 v q ]# W# |( N: z: d7 ]
: M2 |0 q5 X- x, n# \
CSR = 0x0000;
6 @+ u; ~+ j0 h; L7 U3 C
INTC_INTMUX1 = 0x3d;
5 x% ?$ |4 E- u! `3 _
ISTP = (unsigned int)vectors;
4 x/ N# f) Q( ?) o3 n1 T2 A4 J2 Z
ICR = 0xFFF0;
# f7 b6 W- Q. ^! M5 |1 C
IER |= 0x12;
t9 Y. H4 S) n3 K0 Z4 C+ V4 T8 w
CSR |= 0x01;
_' R: v; D" p
- k" J! |* Q; N$ Q
8 w. d7 Y( F* e8 U% ?) l3 l1 [
' [* G4 t j* j5 q0 e
还有就是两个输入输出函数:
; [, G+ k$ v. `7 s0 H& t: V
void output_sample(Int32 out_data)
6 b2 O$ l3 l4 Z
{
/ Q' ?1 t! [; |# l4 z: i5 C
AIC31_data.uint = out_data;
C6 u* t2 }4 V
MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 W; K( h/ d$ s7 l& j* K2 ^) B
}
N, ?& L' E/ P" K. j; r8 i- R
, {6 z* Y: j/ s$ e( b! f' c* P
Int32 input_sample(void)
" u2 y) N% ?' d/ e
{
7 O5 [' m, Z2 i+ M6 ?
AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 \0 l! l* j Q5 e/ \: y
return (AIC31_data.uint);
' C5 ~- z/ ^ X5 U1 ^9 W8 u
}
6 u) D) \1 H& C5 m5 P
4 s Q V: J( e' a6 Y, P
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4