嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 Z/ y( K/ @1 L% v- A. ~6 [+ m0 b
main文件:
, _) Q7 |5 X+ I: b
interrupt void interrupt4(void)
' q8 Q2 d& _' v4 X: q n9 c9 R( R
{
$ [6 h4 u- S& p! K& J9 q/ A: r
Uint32 sample;
; j' I, Z- s# e. m' G' B# A
: ?; Z4 ^; T2 [/ F4 \( o2 I
sample = input_sample(); // read L + R samples from ADC
& E3 Y8 i0 o1 C7 \9 x/ l6 J7 I' q' d! d
output_sample(sample); // write L + R samples to DAC
) x% s' `5 Q0 i$ @6 J& }7 H$ ?
return;
9 A( |( m9 H1 }" |' \
}
3 |" @' \' a% Z' p2 h
$ V) f4 e- A# e1 O3 Z! I+ w
int main( void )
6 y, S1 w' c& o" L3 p
{
! t- L6 n; x; y$ [# O
& Y/ l1 T0 A, T4 s4 D
/* Initialize BSL */
5 a: I# K l5 g% n: u ~6 s) w
EVMC6747_init( );
2 ~- v1 j) d" `. ]. m0 H$ L
/* Call evmc6747_intr function */
; H, @ _0 A5 U, y: D# O' _* K
aic3106_init( );
& `, ~8 _, H3 K5 G: w
while(1);
& L. ~8 t+ T: s a& ?
}
0 C( j1 f2 A3 {
' t. m! d) E+ v! y
$ |6 ^7 d+ ]) g/ i7 a( s8 K& Q
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" n ?, {5 x4 |* {% b: g- u
/* Initialize MCASP1 */
: G8 k7 T1 J. Y! L3 }6 ]. g- a
mcasp = &MCASP_MODULE_1;
4 p F4 m! b. T) m m, Q/ Z9 t
mcasp->regs->GBLCTL = 0; // Reset
. M- H6 b ~$ e' o# i+ o
mcasp->regs->RGBLCTL = 0; // Reset RX
0 w# y8 L" s% u0 @7 k. y* F
mcasp->regs->XGBLCTL = 0; // Reset TX
4 N. R8 K& R- n1 t4 i. n- f
mcasp->regs->PWRDEMU = 1; // Free-running
9 t9 X, R5 C8 ]# A# ?* ~+ L
// configure McASP0 receive registers
; W( b' K9 |+ x0 p3 ?1 D
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
0 @3 g4 Q' I8 W& w$ w" I* X
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
`! O" T4 N/ q: I7 v; I
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 @, q0 Z7 a1 q/ @
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
) m" y8 N; `( D" y( r/ q- ~
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
+ R: b, e W/ a, ^0 f
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
d! {& x" G- ?$ S3 M4 }
mcasp->regs->RINTCTL = 0x00000000; // Not used
2 ^& @, u& M1 @( m5 D
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! L, W4 `4 j; }& W3 W+ e
/ j9 Z7 E9 D4 i) A0 C9 r1 \8 u$ H
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
3 P" i4 E4 ^0 d( N; m
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% [: e% \3 S5 f9 @+ {7 u+ Y
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& Q; i. F9 @7 l1 Z, i/ {
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 p" V- C1 K) }+ `% l4 {4 Q
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
( q8 p, U- v3 p* S; d( g
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 f9 I, n' ]( V: V- T$ j& s
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
0 u. C% f/ a6 `0 `2 ?. V: l: z/ S
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- q; K9 q# \9 t( u* M2 U* D. N
, H$ u1 ^8 g4 \4 g; {! @
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; o& @3 s) P- j8 }8 `0 y. @! D( ?
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
! X3 L+ D- _! e: t; g* N
mcasp->regs->PFUNC = 0; // All MCASPs
) o: @$ `1 W! z# o1 r' [" o
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! n) x& x( P) _9 s. _
6 o) B1 l0 v) m- L, \, m, s
mcasp->regs->DITCTL = 0x00000000; // Not used
) f4 S$ x' h- }; D/ R$ n
mcasp->regs->DLBCTL = 0x00000000; // Not used
( r0 e! g5 x/ p) A2 n
mcasp->regs->AMUTE = 0x00000000; // Not used
. g8 I. ]. \0 g( I4 @
4 {9 q& _; `( W- M4 ^4 v
/* Starting sections of the McASP*/
& O! @& b; `+ p/ W$ S5 ?, S
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
h9 a" x/ Q" A. q/ }& Q3 ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
. ~3 s v. p P$ |: |: \
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 Z$ c( g1 V$ V: B" ~; N9 e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ [# S; J+ `6 V; k% y7 H. C
; r9 y" _# S. I5 ^) r
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& D& K% n9 o/ [5 |1 H6 Q8 w6 u# p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
( [6 ^# L( q* b
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ {0 }* ^ ~, f- h7 b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: Q( d i* O6 e. S' }+ t& B
" |3 l& b6 c$ i0 `
mcasp->regs->XSTAT = 0x0000ffff;
6 g& W/ i1 x" X, N
mcasp->regs->RSTAT = 0x0000ffff;
- A3 I3 r, N& ]; I' F
; l9 F: e* N n9 X1 y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 }: ?# I2 B b8 G3 i8 P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) v y4 B. M% U4 D+ ]; g
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- t3 H# t4 a. B; ^5 v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 D" K" y/ h" x
" t% P( b, s7 F9 M3 i6 s& c; {! ^
/* Write a 0, so that no underrun occurs after releasing the state machine */
, J/ J6 e+ N7 C: Y: q
mcasp->regs->XBUF5 = 0;
3 q0 j5 ?3 l) r9 Y* @
mcasp->regs->RBUF0 = 0;
, }* {7 `0 Y& N- B* [! c# Y
7 t0 F# h8 K' c- g
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" l* v2 ]% V7 `( R5 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 g9 ~- Y/ W$ b5 H5 F6 I, n' Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 ]( S4 y9 ^7 E; o- K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# H( C& e2 i5 f4 R D
3 z* `) V* s+ j
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ [% `% `* \2 G7 Q; {' H# o) |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* H( s5 a! E# O, R# O; n+ {/ S
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" X) f7 [. O# _( s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
[( G3 ?) K* c6 p" e
1 H# K% _. p8 f" p& S* d7 f( m0 e
CSR = 0x0000;
- f; }6 Z) _, w; j3 k! k2 P2 G3 O
INTC_INTMUX1 = 0x3d;
! ]4 j+ @$ m3 l& k/ f4 F
ISTP = (unsigned int)vectors;
3 a% r( @9 F b; Z0 t- B- y) Q7 P
ICR = 0xFFF0;
+ t& X7 p- c& U
IER |= 0x12;
. E9 @+ R" ~( T3 O
CSR |= 0x01;
- {$ F/ S1 b) y
. U/ K. p* `* y& K) W: P- I4 I
/ K$ l! ? [7 F8 [# B
1 ?+ { Y2 `) D* ?/ `( a
还有就是两个输入输出函数:
4 ~0 b% u% t/ q, H
void output_sample(Int32 out_data)
p& R3 _- Q$ V2 y' @0 s
{
1 W% W, N2 Y- G( S! [0 W+ q- l
AIC31_data.uint = out_data;
5 B7 F: G! Q8 {2 b7 C# Q
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 U" o) H+ M* q9 e+ Q
}
% D, x- @; k: C' x: v& Y4 ]! S' a
7 a; C9 Z: M k. ]6 o/ `+ k
Int32 input_sample(void)
8 l% q; b" V4 a6 A3 x
{
% ?* r) i4 o5 z; c9 e; }' k! O
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 W& w: w" a+ A8 g
return (AIC31_data.uint);
+ _7 q- I: H# @# _$ x% m
}
~, u, g* d/ F/ @4 }% D! U
0 U) D2 M# O1 f1 ~( d6 m$ a9 b B, D
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4