嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 ^! h& i c9 O0 z- e& Z$ ?" A3 B
main文件:
0 N9 T; x* Q2 K& Y i9 ^: M2 z% C
interrupt void interrupt4(void)
/ p' U5 z! i2 E u# Q
{
1 s0 A" t8 ^4 [& t& r) t
Uint32 sample;
9 U. u2 M# Q" J$ \# [5 l
5 X2 V& I7 K7 w
sample = input_sample(); // read L + R samples from ADC
0 @- N- d j: u$ y! x& h
output_sample(sample); // write L + R samples to DAC
( j: n' l4 o3 G# k4 Z
return;
. b$ i5 L+ n3 V- F: D+ e
}
- O) K' ~/ B/ z; ]$ c% W
' H3 o' {8 N$ B: y; N1 E# M! C
int main( void )
2 d" N1 I7 c) h E
{
& P, J" Y: ]+ \, G9 s) i% Z
+ i7 q7 L5 i* |( K
/* Initialize BSL */
0 s) j K' c- }! p' V1 N$ P) P4 i
EVMC6747_init( );
/ `: W) M' s* f" Z3 L4 C* x! l
/* Call evmc6747_intr function */
4 e/ |5 @. k/ G+ B2 J( w2 p% B
aic3106_init( );
@( r2 y0 X0 `+ {2 R& h" ~
while(1);
( U: _& [, l# q6 }; c/ W$ o
}
+ ~% d- |2 G5 Q4 }0 ^: f% \5 h& y
* E% n2 `( ?2 F
$ D! d; v9 i3 C; Q, e1 H) M: o
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ |$ e& y/ W' k5 s( p
/* Initialize MCASP1 */
- Y9 n1 {- ?6 z! d
mcasp = &MCASP_MODULE_1;
/ p" V' | }5 ]3 E; t4 p* q0 Z) H
mcasp->regs->GBLCTL = 0; // Reset
4 i# [& ^+ J2 ]- g& G2 J
mcasp->regs->RGBLCTL = 0; // Reset RX
" \( B& N$ O' G. y5 }0 _2 \
mcasp->regs->XGBLCTL = 0; // Reset TX
! |! R7 j6 ^ A \7 M7 j5 z
mcasp->regs->PWRDEMU = 1; // Free-running
1 I4 F( G8 }3 O& \: a8 w
// configure McASP0 receive registers
. w9 @ `; l/ e
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 _! U8 z3 X" R4 K" Z$ e
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 Z+ U8 M% h, d3 @
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
4 c% Q* I- D5 O, \! b
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, o+ S: U1 x2 E& j7 j9 j
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
* m" _/ `7 P* y* A
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 i8 _5 F4 B9 \; T! t. O" v
mcasp->regs->RINTCTL = 0x00000000; // Not used
0 t: o! o3 J# X* H
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
v, L, C+ z- `' u( p6 F3 n
# \, K' D, [6 |+ ^; L9 M4 e
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# v7 u+ ?0 a1 I" R/ ^, C
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 |, j7 A0 `( `- U1 i
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ |$ y9 r$ V! Y/ L7 J7 ~- b
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ B: u! Y- U2 e3 _ V" h: D
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
( ^+ P7 r: L( v n& y8 o
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
6 v' Y; {5 B5 D7 M
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* o' V! ^3 X" X6 T# q
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 w$ V" d! {4 X# u$ Z* Z- K
/ O3 I; d9 `% w H- J& [* ^3 N
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
% L k% ] `6 Z6 @: b: A3 Q
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
0 W ]! N5 s; X- e- y; h9 X
mcasp->regs->PFUNC = 0; // All MCASPs
/ s# K$ n7 l3 S" l
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& U2 }. \- A& E/ [0 Y! \* ~
- `$ }8 k; @1 ^. u, g
mcasp->regs->DITCTL = 0x00000000; // Not used
: T8 N- b; Y# H# a3 c& Q6 U
mcasp->regs->DLBCTL = 0x00000000; // Not used
8 D! h+ W* }* Q7 N9 x
mcasp->regs->AMUTE = 0x00000000; // Not used
% \" Z% ~8 h3 E- @, M
+ D9 S+ Q# B( z
/* Starting sections of the McASP*/
+ o+ E! S/ a: L4 u, }/ t, R% w* d
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ N2 S, D9 u8 y4 x/ }, }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
' m2 r5 A1 g1 Q) h1 [! ]' r
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
7 ~3 C" Y: o4 ~2 [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 |' u6 H9 ]6 }- O0 Y* n; k. l
, S* I& q) |, f, ]+ e
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
6 [9 T" |/ K7 w* y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; Y4 s) r* ~$ y Q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 Q2 f8 S3 f7 O9 i, `3 H: |$ s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 I3 p @; E8 O$ n* {2 H; x; o4 T2 W
" d+ t& |) q: \' o2 G# P& C
mcasp->regs->XSTAT = 0x0000ffff;
1 N( s* \3 v( e8 N5 `( H
mcasp->regs->RSTAT = 0x0000ffff;
% c0 V! u. E- f: h' e
7 m3 L S, f' b% M8 e$ Z; ]8 E
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ u. z, n5 c) T, N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ d1 [1 c: M n! ~1 |) a* ~/ T6 O
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, q0 P& u1 f& @4 i! w$ c, I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 f, C" n5 e5 o. G/ r' W
7 ], B1 f, _% n$ E3 {+ y3 d# {2 k
/* Write a 0, so that no underrun occurs after releasing the state machine */
5 ?- Y& w: K& d; R3 V: o
mcasp->regs->XBUF5 = 0;
! N1 m! d0 n4 E+ G4 N7 q) O
mcasp->regs->RBUF0 = 0;
$ e: P: }6 u/ \& ]
$ M0 b6 S7 k( M2 l2 n. c
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 D" f( W' E) H( O" f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* S6 M U; {' `2 q. a- m+ y
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; J* K7 d$ p4 v2 \0 A" A7 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- O, I) K8 h6 X$ Z6 m; G1 q
, E- I- d, _1 f q, z+ `; }
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 j2 j8 K' u4 Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" ^- H& m; L: g c+ G+ i
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" X/ z6 d2 d; \2 z8 I+ @3 N m/ f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ \4 }, ~& T$ f% [1 B2 S
, G3 z/ U' g) C0 V5 G- i. b
CSR = 0x0000;
+ ~5 T$ }) ?+ d
INTC_INTMUX1 = 0x3d;
/ g3 o$ I! E# O5 b# c2 J* X/ i+ w
ISTP = (unsigned int)vectors;
5 W, U, A! O$ r0 x
ICR = 0xFFF0;
& b4 R2 ~- _ x* _& W; U
IER |= 0x12;
- |: @/ j& @% a
CSR |= 0x01;
- R2 O6 f" T% e
9 d2 ?! n6 A4 H0 A/ \: c f
3 y0 s+ i/ J# G* Y) N
- c: f2 Y4 i) o- r, |0 ^! a+ J
还有就是两个输入输出函数:
( E, g0 y: L0 v3 I( L) Y5 ^
void output_sample(Int32 out_data)
( v. i: e4 U0 A! n$ o/ Q9 K
{
. Y( J l6 {' P' j" c9 ^8 J
AIC31_data.uint = out_data;
x% a F% p3 M& y. ?* V, _
MCASP1_XBUF5_32BIT = AIC31_data.uint;
- b4 a+ y9 r& F8 O0 a
}
8 L q# r" `4 N! F, c
9 r! ]$ u2 L$ N+ d
Int32 input_sample(void)
& m; N" Q$ w* p2 g" M+ t% t0 A
{
+ q+ b3 _( a5 ^: [. i1 A
AIC31_data.uint = MCASP1_RBUF0_32BIT;
8 ]- t) A3 Q/ i
return (AIC31_data.uint);
" ~0 E& m& t1 ~/ \: {* }5 H
}
) Q: p A( n' `: K) o5 h3 ~
! s) O2 x$ t6 o9 o4 a* U
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4