嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( n5 g' u/ @0 o
main文件:
# ]4 g/ j0 a$ A
interrupt void interrupt4(void)
6 d# B. ^" |' g# v) V; R% j0 v) o
{
. w/ [) i) p- N3 s5 `
Uint32 sample;
" t% t8 O: N+ f: O* p& A
! r6 b& g+ i& G$ U4 N; p* Y1 x
sample = input_sample(); // read L + R samples from ADC
4 M/ R" v1 t) C. N& v
output_sample(sample); // write L + R samples to DAC
/ X, ]$ w- K1 `! `0 s& G4 x
return;
: j; j1 O: |, r6 f% N
}
. K% d, e x8 g7 u+ C
& n9 q2 M% [" q3 q
int main( void )
7 u) n1 {, z$ Y! U- [5 B- A
{
0 ~+ K& n G; @# g5 F+ J* P
# c( q' {& M2 K9 ?$ \
/* Initialize BSL */
3 Y" L7 _; _5 j1 f0 E( L# P. Z6 H( z
EVMC6747_init( );
1 A, s7 y; m3 f$ D) D
/* Call evmc6747_intr function */
! h: k, w+ t! g3 ~$ g5 v8 L- h* n
aic3106_init( );
0 d* k6 i. g% |1 v# F1 k: X6 C
while(1);
- ~$ ~7 [$ m+ L1 d9 u3 |4 _
}
6 H2 k7 G" d6 {- p! d5 J2 d' L
/ J! d$ ~- Z+ o4 w3 l8 M; f
# `8 Y) [) E6 P \; L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# }. C+ k5 b- V, P
/* Initialize MCASP1 */
, J! z2 C% I1 V V( \% \
mcasp = &MCASP_MODULE_1;
7 \1 c# A& j. g% U- V; V" k4 | l
mcasp->regs->GBLCTL = 0; // Reset
% K9 ?5 O4 t7 d
mcasp->regs->RGBLCTL = 0; // Reset RX
" O5 h+ K* Q& H" f, L% S0 L7 J) O
mcasp->regs->XGBLCTL = 0; // Reset TX
! ~! a" A) E3 h a1 L- C
mcasp->regs->PWRDEMU = 1; // Free-running
+ `) [! X1 @) Q, L
// configure McASP0 receive registers
. r/ @- U* t2 m0 |# v; l
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, A1 \0 R# v- N! J M+ u4 l. i U9 O8 `
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ X, F6 E( P; g1 a* X
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' y; x1 J& _ @' R
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ _( q8 A, X q1 I/ m0 u
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
A @( C# {* v+ X! P1 o$ ~. M& k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: ~8 K- S: o+ Q6 m, Q' y2 f
mcasp->regs->RINTCTL = 0x00000000; // Not used
, v! k. ?( |) U9 y" P, F! A
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 s, }5 D# i8 @) I- _- t% R& i- k
' V: w- G' F2 Y# P7 l5 K( y) V7 U
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 ?# @6 W( ]1 |
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 r \. z* ?7 I* q' y& |
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 R( T' C9 O2 l$ f
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& j/ T+ {6 r2 R; X) E
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
! k* |) w( c) ~
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; }+ K4 a' F! |: ]" o7 P. Q
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ o7 B- T1 g0 ^/ O8 ^' a
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: H+ p7 w$ I& Z4 u c
& ]9 R5 ?1 t+ o. f
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 ~4 j8 y5 V3 J+ e5 ^
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
) Z, Q f! Y5 {
mcasp->regs->PFUNC = 0; // All MCASPs
5 N' `1 T2 @" w4 x$ ]
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
, A: m @" q0 x8 u/ K
, g. t# M @" ^% D! k2 `4 C: a
mcasp->regs->DITCTL = 0x00000000; // Not used
, \ k/ P- q0 t9 @) w! }
mcasp->regs->DLBCTL = 0x00000000; // Not used
; Q# R; x2 Q" {
mcasp->regs->AMUTE = 0x00000000; // Not used
a: y; Y1 t$ J9 {7 `
" f& r/ \) l$ J, N; s7 ~
/* Starting sections of the McASP*/
# J" k: \ ^" P; x$ N/ y; W+ z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& T* n: m/ h8 i% ?7 B, ]% b3 J3 C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 M0 [- `8 n0 e8 s% I1 P6 J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ d+ S4 m9 ?3 o4 i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 @9 j: n/ _- ~
, u% U+ l2 }5 m9 J8 p
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( k: j8 x8 { }( Y7 p% k3 t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! }: d# f) A$ {* `( |* r6 V
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: A9 @, Y4 D. L) ?' U) R6 d) d8 l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; j) l- _+ k2 r+ ]6 e: O$ i
# d) v4 t1 Y5 V& t1 z/ ]
mcasp->regs->XSTAT = 0x0000ffff;
- y9 a) A- W$ y+ x, J0 k
mcasp->regs->RSTAT = 0x0000ffff;
) C5 k1 t4 w1 l* j7 b9 f
; W4 U. ]: A: j3 w: L1 n) j6 ]; _* s
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ N: ?5 s3 }1 U& S5 G6 u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, o( I% M# q+ A( o' \3 T
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: V) Q) H0 O+ I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# r4 V# v2 S/ |" H
7 W9 f0 S# M% [* X" n
/* Write a 0, so that no underrun occurs after releasing the state machine */
6 c1 z; B' T9 _/ r: M: _9 Y# B
mcasp->regs->XBUF5 = 0;
/ q1 n4 f% @6 u; f7 u0 {
mcasp->regs->RBUF0 = 0;
7 V- Q% c+ I K+ }+ s$ e
+ g3 Y4 U5 v+ Q' i; G0 t
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 D+ X2 {* C0 _$ I0 {* q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 i' M% l3 y4 p9 [: c
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ g! D0 l4 S" P7 } c; z9 r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
/ @8 u7 w! @: `/ R( d' B0 q
1 P5 Y3 s& }3 ^# h: _! {
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
4 l) k, E4 }) z5 z# j% @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& c' u1 E/ u6 `
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& G" w& s0 G5 D/ ^) a# g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- C# w# H& g! s4 W- j8 i
* @+ m5 r6 b6 _# b1 j7 ^4 ]0 ^) \6 v
CSR = 0x0000;
3 L# U% {% _0 z( q
INTC_INTMUX1 = 0x3d;
" s& E+ Y2 S+ [# U1 [
ISTP = (unsigned int)vectors;
: K! T3 f3 ?$ f6 H& M9 P% y, O
ICR = 0xFFF0;
3 |0 U0 h7 A2 `# |/ O |
IER |= 0x12;
8 q/ F; |' Q5 P, D" }4 a
CSR |= 0x01;
1 N- w- p, C3 f( X1 i
+ l5 |+ d& A0 L9 i; E3 R& Z) C
) E4 n1 o( G$ W* \# n$ L1 e
- r0 M3 I2 P& q/ m w( E' q# k
还有就是两个输入输出函数:
- H5 Y' J. s' X- a8 a9 w! b
void output_sample(Int32 out_data)
: N& w6 Q) ]- H1 Q
{
- E6 u- C) c2 n2 q5 x$ j
AIC31_data.uint = out_data;
0 i9 R9 d7 t" c. M. T
MCASP1_XBUF5_32BIT = AIC31_data.uint;
4 x, @% B& R6 b# X
}
) O, F* Q7 K# c% z' G+ m
. k0 Y5 m: K2 C$ U2 Z
Int32 input_sample(void)
0 h' v) u: |8 z2 n' j2 R) M
{
: b* ~7 {* `" k1 Y& P: D
AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 K3 n% i+ j+ G' u! T
return (AIC31_data.uint);
9 i0 N3 G) H8 s* o6 A
}
5 h |" l( \3 S9 m+ w4 V
- w$ W/ ~7 e) m1 `
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4