嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ x5 P: O e& I2 F- @- q2 }
main文件:
' O1 v! F! a7 a& n# y
interrupt void interrupt4(void)
7 P; X. j! z* X/ h% m4 b; P* k
{
9 O1 C- ?3 G3 c- d x" e
Uint32 sample;
8 J* _/ {! G$ C: [, v# E; z
2 T; c* w( x- {( A7 s, F
sample = input_sample(); // read L + R samples from ADC
+ @1 u; V' Y$ i
output_sample(sample); // write L + R samples to DAC
% J- v" F! S3 Y" Q
return;
9 F; Z3 L- z/ e3 A: H4 Q) N6 K [3 B
}
$ x/ @4 s$ F3 G) X" S0 m( [: Z
4 h2 D/ e3 ^. F' f) l! n: {
int main( void )
z3 C! ?1 Y6 y$ b* a1 o" p
{
9 u+ ^0 l/ f0 T3 o$ {2 a
" Y, p+ B* j# N% O' }
/* Initialize BSL */
$ \$ Y1 X" k0 B
EVMC6747_init( );
6 Z" O8 [4 {, K4 m3 C
/* Call evmc6747_intr function */
$ A; T4 `. ]2 j# e; L0 q* K, o
aic3106_init( );
' V) x% T0 R1 t, p& d& C
while(1);
% ?+ V* J' e6 k- _; P! [
}
: _. W$ a: @1 {; R0 O' f# o9 V
7 k& ~% r3 A8 @# x) e1 }
; w$ E' G4 G7 L1 }9 R- N- H; n
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 x7 c" e- K% k* z# n- ?% f0 v3 E6 _# A
/* Initialize MCASP1 */
: x$ _# L# V# |: z
mcasp = &MCASP_MODULE_1;
5 G- ?. o, K- e% F$ m) s
mcasp->regs->GBLCTL = 0; // Reset
% J2 w4 P8 x1 R- ^" n
mcasp->regs->RGBLCTL = 0; // Reset RX
" O% T7 B* {( r, C
mcasp->regs->XGBLCTL = 0; // Reset TX
9 E* J7 D- o9 I( h
mcasp->regs->PWRDEMU = 1; // Free-running
7 f! q1 O& U+ h H# Z7 ]4 L8 V
// configure McASP0 receive registers
. e6 {7 ~+ d- k$ m0 h
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, k# m& \/ f& I' g
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* m5 J4 C* i5 f( S4 P4 y1 n( T/ H6 |
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 g# h+ G7 C; ^- V2 h
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
- [/ O% S5 O% [% M a: z
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
" A5 v* J ]! m3 F" I+ J
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
0 q5 n7 H+ y. Q/ b& t$ _( S5 A
mcasp->regs->RINTCTL = 0x00000000; // Not used
. V7 ?2 H+ a) t" ~; u: x
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, G5 a6 T* i5 I
: Y) m, p4 A8 r% c
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
8 e' H$ t% q% ?& y" w) y3 Y& f
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! c" N" Y$ H, o% v+ Q8 i% h( t4 } X
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
" {# u: D* K, O
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# y2 ]* j! Y6 |- y
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) \- T# r6 y# B- C2 _+ @4 I
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
+ V; v; g% A( e- m5 U" ]8 F
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
+ {" l e- |) ?
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! C( p, {/ O) s
( y+ i8 X2 L# C- U5 S/ z
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& ^+ m( L( J" j5 N5 X3 u3 Z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
3 Q( \; p5 V' I) R& j
mcasp->regs->PFUNC = 0; // All MCASPs
. V' L* b8 X& |% F @. O
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ r! ]' W6 B, K6 l' d& c0 ~" y
+ V- |5 ^" e! ?# p, N
mcasp->regs->DITCTL = 0x00000000; // Not used
9 u/ O* \: |7 o% m0 ~; u; o
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ F& j% |0 c$ M3 Z' @
mcasp->regs->AMUTE = 0x00000000; // Not used
! l1 k9 L- y/ O' o: k$ m
" t* q- Y! D$ P( S3 j
/* Starting sections of the McASP*/
+ t9 {6 X. @0 F7 x* \
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 H# D' @! I, L6 z; a( T) `! s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
$ N' L0 Z: K0 {8 }1 n
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 ~, T3 X6 s' y( \+ j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 J* V0 t# Y" z
! S/ b! ~- U: I2 c1 \
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 X8 t* t/ s, R0 C9 S( y) y5 `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! a& S1 k, w0 B( v4 T
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 h$ K( `# ~" T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ T9 ^. m' {9 a
8 [" u8 ^4 j' X$ o$ |7 i
mcasp->regs->XSTAT = 0x0000ffff;
?4 V, r% O9 }* v1 d ]
mcasp->regs->RSTAT = 0x0000ffff;
# v- ]6 L6 r! d; k# M- a7 H
: W4 S1 R+ V. X
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
t4 s( q( P5 F9 Z& G( s" k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
: s; o1 f9 j% `8 d( p1 J9 e: x
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; J8 D1 v, @* k- A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
% T' a6 h+ [# e
. E% [ [0 d, e5 F+ R
/* Write a 0, so that no underrun occurs after releasing the state machine */
( I) Q( L2 W) s: C" T$ W% l. i
mcasp->regs->XBUF5 = 0;
, t7 h! |' G$ w2 [: P) B
mcasp->regs->RBUF0 = 0;
# Y( j/ |* k+ W" K
* D* o s) Y w3 `5 B- ^
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 P6 |, W. S( b; b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, p C# _+ H4 e0 P5 a
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 J" f: y4 G! _- z8 t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
7 w) F, f$ {" I; i# z( l' y
) K3 u- }+ s2 ~2 G# P: R1 U
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 T! n9 s6 F- ^1 P. _+ U" F: _+ A: O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 a8 N. B V" N* J g
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
- b. i) W5 C2 e# M8 Z" E( ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 ]* E6 n+ ^4 ^& q4 P9 E
' G/ ~0 X8 b1 D6 |* v- u6 M
CSR = 0x0000;
$ \3 _; V: M2 [; B/ r0 a; u
INTC_INTMUX1 = 0x3d;
- z% h$ a+ i) t3 `9 X
ISTP = (unsigned int)vectors;
0 i- t7 R! b2 z! `1 t" {$ C$ g
ICR = 0xFFF0;
3 H7 d( \1 V# s ~5 Q# m0 ^* _) Z
IER |= 0x12;
3 F" w& A/ P; p; \) T5 U$ }
CSR |= 0x01;
$ G0 i! H# V/ |. f
# ^- O6 a( B0 Y$ I& F
0 N, j t" t3 i" [ a6 F8 {! Q' t
. y# E Z6 g" ^1 V2 a
还有就是两个输入输出函数:
, j& u! x# M0 K
void output_sample(Int32 out_data)
! C% Y9 f! J3 Z: r6 z
{
0 l. Z& N; h9 F
AIC31_data.uint = out_data;
& Y( b( K& z) B' [, T
MCASP1_XBUF5_32BIT = AIC31_data.uint;
% `% N- I. Z* `
}
+ l" }" O: _* F* _) Y. y' n7 S4 \9 y
6 Q0 e. W% s n2 N1 V1 ^: Q; f& e
Int32 input_sample(void)
5 l1 Z: C, `- x$ b6 [6 x3 n9 g
{
' @; Q3 f+ P' [1 R
AIC31_data.uint = MCASP1_RBUF0_32BIT;
7 K$ o* _& a& {* R) M8 j- \
return (AIC31_data.uint);
" A0 l. j' Y5 t! H4 B9 D/ p
}
& T8 j2 b) D7 f2 ?1 ~3 a6 I
) U* C6 ]# a2 K- ~9 n
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4