嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 E) Q6 R, J/ ]0 `
main文件:
6 c# `# B" J% Y% X' U0 d
interrupt void interrupt4(void)
9 f; c( n" r, @8 q @# B
{
3 _; A1 O [! q8 ^* {
Uint32 sample;
# h, h Z8 @- H( k
0 I% D* L: F6 J4 Q8 Z9 k& X
sample = input_sample(); // read L + R samples from ADC
" \8 |6 {2 v8 {7 i
output_sample(sample); // write L + R samples to DAC
' y$ ?' y: P; c. v
return;
0 t. S5 b/ `4 ^% \; b- q$ [
}
2 n, M! k( a4 c( R( f7 ~
1 c U& g8 I V; |( c# Y. F
int main( void )
8 _2 e$ j, R: l9 K
{
9 t( q# l0 j1 [
6 U/ M R$ o2 F( x6 v
/* Initialize BSL */
$ w. L9 a' k# p8 ]3 r/ d' G1 }3 B
EVMC6747_init( );
: G& g; P+ u; _, U) E# \$ V7 R
/* Call evmc6747_intr function */
: Z1 G: x4 P. u+ A: R
aic3106_init( );
+ ?3 t, M9 M3 R$ F
while(1);
. T; z) @7 K# W5 t7 C$ q
}
b' g. F0 B" g% s3 y3 U% w9 U1 k
' U% _+ m, d0 A/ J1 M$ h
. ~. z/ ]5 {/ W+ C. e" m( F
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& @4 N5 y2 s' |4 {1 s5 s: ]3 k' W
/* Initialize MCASP1 */
+ g+ f5 w$ H% w# P
mcasp = &MCASP_MODULE_1;
1 I, G2 [! r; L5 s
mcasp->regs->GBLCTL = 0; // Reset
J: `2 o2 H/ b* b F* a/ q/ \7 ^
mcasp->regs->RGBLCTL = 0; // Reset RX
# e! o' j: q3 _. K3 K, D
mcasp->regs->XGBLCTL = 0; // Reset TX
8 r7 W/ \6 T' M6 m2 L8 u
mcasp->regs->PWRDEMU = 1; // Free-running
; Q) {) \* G) |: R
// configure McASP0 receive registers
' i4 C& P! @0 F, J
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
" v$ I0 U3 [4 Y, \2 ^# f6 X3 x
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ x/ j- Y* {0 d) o1 x- G# v: ?
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
0 Q9 G4 ]( `/ A! N/ E
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; W9 p$ C/ V! _
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
2 n% k" d3 u' U1 T6 t/ t2 J: L
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
& Q5 Q0 t! b0 H9 \
mcasp->regs->RINTCTL = 0x00000000; // Not used
- [8 I3 L" B6 }: z. y: B H
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 ~- X1 l5 N5 m# l# {$ t ]4 f; m6 X
& m, D' L. b2 s, ]3 `) a
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 \5 L' B/ a$ N1 w7 ?
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 T7 I. X) v; U+ T/ L- c
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 P1 \1 n% h& s* a0 L4 b6 S1 j
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 i" Y( E- z/ q8 H! M8 P
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
7 D9 N0 D X& g: [+ ?7 |- ^ Z
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
" O2 E6 Q* L6 b
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
# \' j& c' o O [7 f0 W) ?3 t! T. _
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. W' e8 J U3 m& i$ L: j6 m' k
4 r R; h$ L; ]$ R
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; @7 U& t* B5 k+ C' P y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
* R. @! _: R; _; B: G
mcasp->regs->PFUNC = 0; // All MCASPs
+ |7 |, h1 F% H6 u' t6 m2 H
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 `& F8 l, s, J3 ~5 | P& _
' X; G, Y" v" c
mcasp->regs->DITCTL = 0x00000000; // Not used
' h& L+ ~3 p W( G2 q6 n- e$ A: Y
mcasp->regs->DLBCTL = 0x00000000; // Not used
0 l& H: H, x6 m9 u( D9 @
mcasp->regs->AMUTE = 0x00000000; // Not used
Y% u9 {: w" q5 e3 m+ Z1 ~
% v$ i! z8 s# q1 l1 K6 e3 D* k
/* Starting sections of the McASP*/
/ a- B$ O/ a$ T1 i
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# @6 E" M0 w1 y3 U3 c+ y9 n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
' k: e1 W; m0 B
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) F( V5 t; ]" c3 X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ @' m1 B, ^ a, R
" {# g' _0 I7 m$ N8 d
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
d+ b2 E8 u& S: P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 h# {1 m. M3 o4 }
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ ~3 `- C8 u4 R3 F. _3 g, M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& B! T9 z3 {6 l( a% T8 d4 A, B
) V% Y# ^ C" i. e0 v
mcasp->regs->XSTAT = 0x0000ffff;
. `3 r# U" c; l8 x
mcasp->regs->RSTAT = 0x0000ffff;
2 x9 z( L( }. O+ s2 s
2 U, }# m, d* k* J8 ^9 q
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; v) H0 O/ f4 }* h* h' b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
' E9 C' K% `" |0 c0 C
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 {5 {5 x$ ~4 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 [( _3 Z/ p2 A/ M! ~6 [
7 \' f x! K4 }/ \3 E: W0 Z
/* Write a 0, so that no underrun occurs after releasing the state machine */
. J1 m; @; k$ E* o( i: J
mcasp->regs->XBUF5 = 0;
0 b9 j8 w2 V1 K+ F! d
mcasp->regs->RBUF0 = 0;
! R; k- I2 V' p, P7 f8 X" |
+ h$ c/ m/ @4 \: F' Y% C
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, B* V* B7 P2 Z# J. L4 |$ j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* Q9 I/ {2 |! g
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 R' P$ ^- U$ V" z- w) G8 I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 C* u5 y, _2 Y( p
) H* D& l0 g/ \4 I, [* Y6 d2 x- J
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
: f; I2 C2 U2 L' y* r( Z- ^. D2 U% Y" Y- n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 @" P# H( |7 E0 s8 I! D3 F
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 ~5 r% p. Z: O5 ]4 [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! V4 h' T! q: u3 C' o2 ]
. Y" S. J7 S, j: F/ S+ ~
CSR = 0x0000;
! z, Z8 S6 H* d
INTC_INTMUX1 = 0x3d;
! q4 V- D+ [! q. `+ Z8 G$ y
ISTP = (unsigned int)vectors;
3 S3 F$ ]. W( K w
ICR = 0xFFF0;
; K) k/ X+ D* v8 ^; s4 W& K& z
IER |= 0x12;
9 N3 O9 K. C7 f2 @+ [
CSR |= 0x01;
1 E; ^/ v7 v6 `5 P
' y; O5 D! t4 ?' | M* w8 w. O( B# b
$ y( W# D/ |. C0 g
" Q/ S6 N8 D) e& k) Z/ E# A
还有就是两个输入输出函数:
- D* _0 \9 {6 k X! C
void output_sample(Int32 out_data)
4 S' R! A5 E8 k8 v
{
3 ^7 T$ Y, M4 t" z" p+ y) N
AIC31_data.uint = out_data;
0 C: h y4 S V
MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 h# l+ j: ] K9 Z& Q n2 T
}
+ A7 J- j, o( x$ P9 U% a3 m
: D2 J! v7 D! D& \. N
Int32 input_sample(void)
& N- o, x; Q. y4 h7 F
{
9 G' D5 a9 S8 g
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' Z) @5 R4 x6 J9 l% r; S
return (AIC31_data.uint);
! }. I- s4 L5 u* s. n1 K1 V
}
1 A$ r# g" p& U# R
9 H0 p# F# R+ d$ Q; _9 J
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4