嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* |4 I9 `$ u8 `2 o) C0 K4 ~
main文件:
* N+ e) S4 U: C- e. u' p
interrupt void interrupt4(void)
$ Z: w9 {6 S/ V
{
3 F- y, u1 R( A
Uint32 sample;
3 s) o2 \- J+ c" D
4 ]8 p1 e! e7 D2 [- B
sample = input_sample(); // read L + R samples from ADC
! i+ U5 _* v. M# _/ ~* G1 r x; E
output_sample(sample); // write L + R samples to DAC
) W& d1 T! s! z& m. L
return;
/ z$ z# N9 C+ h: E
}
& k- Y$ Z0 u1 ?1 r
2 i& h2 l) t @* h8 R ~$ ^9 ?
int main( void )
' z: S. Q! z" w5 n d
{
4 m) k+ X3 t( v5 a! K& v8 t1 a7 t7 P
$ r6 D! a X! u. i
/* Initialize BSL */
- e# j% X2 r$ H/ L, s
EVMC6747_init( );
' K7 [: q4 W. J* F8 F# _
/* Call evmc6747_intr function */
7 @" C3 X( L* x* g+ J
aic3106_init( );
+ P+ G% W! K3 I8 E
while(1);
, ~4 s9 s/ g4 i' j4 Q
}
! q) y3 R+ [& h: k# g3 q9 q
7 ^& }# ?9 `! x2 i4 R( x
& x4 f7 Q; r8 d$ u4 U* z* ]
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' V2 Q+ D& V. T+ f% I
/* Initialize MCASP1 */
: N. _- m a5 o: \ @ [
mcasp = &MCASP_MODULE_1;
. ^3 e" x5 v( X6 l
mcasp->regs->GBLCTL = 0; // Reset
. |* A1 @4 R0 h {' b8 S
mcasp->regs->RGBLCTL = 0; // Reset RX
- {! Z4 e L- q4 ]
mcasp->regs->XGBLCTL = 0; // Reset TX
% r. F z/ }! w) e
mcasp->regs->PWRDEMU = 1; // Free-running
0 b; L3 t; C! j8 Z6 X
// configure McASP0 receive registers
! l) d- L$ v% L6 b+ ~, M' J3 F1 m
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! ?! f W3 F) Q" U
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. \: u2 ]( H- {, I! U& u
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
! \" t& K6 |5 N7 d+ [) J* J* z
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
: S8 m( k) C7 b- n0 e
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
0 G" W! a4 Z7 e, {& d
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
( x o! t$ d P: E( g3 w
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ H6 E! m2 u& F0 U. G
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& M. t% }3 W, x! H+ G
7 z8 E+ y# l, D o8 a. G$ X
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
! v& l7 I. h2 B/ a
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, U7 h: X( @! w* O2 a
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& j( x' C) J6 s. P) H% m; ]
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
" j7 A( r' j5 N- ?/ @
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# P/ U/ t6 r6 U; M4 W3 g, b
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
5 V# U; W1 b& A/ M: g& @# ~1 H
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 p" J! A/ u; y0 G/ P3 {! r0 c
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 B6 ~6 \* T# N
5 d5 A7 p" G4 w3 h9 b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
3 G: O+ c9 K( Z. f' f/ m
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" M( X- p/ C) Q9 N( W+ D' N
mcasp->regs->PFUNC = 0; // All MCASPs
* D5 s& A. p2 K0 l v+ c
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
# z6 Z9 F; S7 v% O# z
" ~( J3 [' U, c& l
mcasp->regs->DITCTL = 0x00000000; // Not used
3 J, Z; n; f% D3 Q. |1 v+ T/ o
mcasp->regs->DLBCTL = 0x00000000; // Not used
. ?0 w! S: O+ t: c7 s
mcasp->regs->AMUTE = 0x00000000; // Not used
/ b7 `" F k. `) s0 B3 q" Q' ]
5 \- X" |# j7 B
/* Starting sections of the McASP*/
& }% S/ N' t3 |: T" h- c
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 @! U# N D- a5 ?# i4 O+ \& g2 D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
) X9 R0 c. [ e: ^* ~& q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
& _$ q2 F, k" f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 t% e; n2 O% R T p+ p2 J( I
+ S r' L. P( o @- k
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 ]6 ?: ]: O! P: M# b6 { S( P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* Q% n: A3 U% z- |6 i- _1 V
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ x: b) g+ k* e5 L/ Y1 X3 ~2 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& `6 |& v, ]/ {) G3 k, u: X
( Q0 N# w/ S& |8 x, }4 b. R
mcasp->regs->XSTAT = 0x0000ffff;
( i( Z( i1 Z* A) V
mcasp->regs->RSTAT = 0x0000ffff;
* H& i! [+ C8 N3 \2 g/ p- ~
$ d2 f' w5 u; m2 P( {' P1 n4 K
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
l# W2 M1 H1 I9 y$ c( M7 C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) {+ e, j7 t& R& C
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
8 o! l7 `* |1 L) s. ]9 o) _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 @, ^( r! _5 ~5 T4 o
: l: @( a# P% x( ^
/* Write a 0, so that no underrun occurs after releasing the state machine */
' C! Q6 F# z2 H' Y7 k% { c
mcasp->regs->XBUF5 = 0;
* B5 x: Y- n. O% C8 T
mcasp->regs->RBUF0 = 0;
& m* l& ^0 {9 z2 N
, g; u) U* ~! @# W( C0 j2 x; m* Q
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: ?- E" x7 L% n" J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# y& V5 u: b/ ]+ w* K8 Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( A9 |# x/ ?* ]# e# L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
/ K8 T; q6 O6 e* J* P( ~0 U
9 S; ^0 r* _2 [
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 J) E4 N3 f0 a7 ?$ Y2 I9 i% E4 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. d1 C. a/ e8 y
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; z) J1 f1 I- e6 Y2 f6 a _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
0 r* r1 j" S8 \ `+ P
" ^0 Y, D6 C) x4 L u4 `
CSR = 0x0000;
, i' X/ ~. b) d; C
INTC_INTMUX1 = 0x3d;
' b" `5 E7 i/ ]
ISTP = (unsigned int)vectors;
) j/ t6 s. I* x8 {
ICR = 0xFFF0;
" T% }& _4 G# r, h0 w
IER |= 0x12;
9 @3 c! S/ s0 a- V- [+ Z+ \
CSR |= 0x01;
* Z! `/ E+ u% @. C/ u; z
$ [, \$ @" e A% }. Y
6 V" z# ~0 e! F! a& [/ s
+ Z5 } a3 Q+ u C$ ]" |
还有就是两个输入输出函数:
1 ^+ S% x5 X1 v- U- V
void output_sample(Int32 out_data)
. o, ]+ B5 A4 J) h+ [2 g* g, f; P
{
8 U* [9 u3 B8 {0 P$ i
AIC31_data.uint = out_data;
- o9 y; r& j. S
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 o6 e5 P8 c( E$ ?* `7 I
}
- m* o9 f, A% x/ m7 A9 X! v: ?6 {
+ H+ T9 ]4 _% C- I
Int32 input_sample(void)
8 Q6 v) z/ [4 e- |$ @* v
{
7 ~0 P& b4 E9 g1 P7 y* I- N
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ o B. S6 a# j! R" d, }9 Z9 }
return (AIC31_data.uint);
9 @# g2 q7 |7 P0 x7 W
}
9 C+ `; E5 B( V( B- L* r7 w
$ j% M9 h/ B5 t8 K/ u
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4