嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# X8 d6 @$ j1 e7 r; x+ b. Y
main文件:
$ x8 s4 {$ `# W* ~0 [* L4 I) \3 R* M
interrupt void interrupt4(void)
4 I# J5 M) r( t) j6 `" e! m
{
/ q5 G* ~6 C3 g: o* N( t: g
Uint32 sample;
9 k- H: n4 S0 x+ }
6 O6 F; y. l) f
sample = input_sample(); // read L + R samples from ADC
; v# Z* m% Q! P
output_sample(sample); // write L + R samples to DAC
5 r2 n- l+ Q0 w( G6 ~% w, T
return;
0 C1 L S+ X* ~* n! \
}
* X! [0 W, }+ d/ x4 _
$ {2 o8 O' w. _7 }" G
int main( void )
3 T) J# ^$ c6 J2 t3 c: p% N# P
{
/ r% ]/ U) ~: }1 `: r
$ ?" ^! Q( h t5 K6 q
/* Initialize BSL */
A+ w$ n8 P6 R
EVMC6747_init( );
' ^1 p+ g( L4 u, ] g% A
/* Call evmc6747_intr function */
/ z* _- h# H. v2 P( z* }* v% B
aic3106_init( );
% [# e" z, U P( F8 q5 Y! V# J; F
while(1);
+ K4 v1 b3 o# q1 U4 e3 ]
}
! \7 h7 |9 \5 x* V( l
* }) ?4 F' s5 q
6 [/ N- o" V" A) W' U+ `
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) \, Q$ g/ o- i# J% z# t3 B
/* Initialize MCASP1 */
1 {8 n3 F% [3 v8 k6 _, _9 ^
mcasp = &MCASP_MODULE_1;
5 g& S" j9 p$ ]$ i, Y+ X9 c, w; l# B
mcasp->regs->GBLCTL = 0; // Reset
7 Y7 V! O. n. t0 G, `
mcasp->regs->RGBLCTL = 0; // Reset RX
: M3 w; B% y+ c9 c6 `1 }: ^% {$ W
mcasp->regs->XGBLCTL = 0; // Reset TX
" ? x* M& R1 X" J; m7 ]- C
mcasp->regs->PWRDEMU = 1; // Free-running
- f1 k3 @; c: Z0 A8 P
// configure McASP0 receive registers
! a$ a0 u' j8 \5 D
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
1 m9 T- }6 }* D$ K9 Z; S% {
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 m9 d- x7 e4 u/ G5 K
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
x1 ~) r) S# c- A9 ]" ~
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, r0 Z9 g6 F6 L; i( o
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 S/ A0 W6 W! k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
! p7 ?1 T- R+ E1 _
mcasp->regs->RINTCTL = 0x00000000; // Not used
: b3 a& c5 l1 V' a3 [1 v! M( P
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 U' A+ o; x% V- ?! }! }0 Z8 `
9 t$ d# v/ u7 n1 y- x7 a' M
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
3 R' q% d- I$ T7 b& ?7 }
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: ~1 x8 a$ C6 x$ j: t
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' W! z" j. k- m8 R
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
( m- L6 m' S7 e8 m# E, f5 Z1 j. e8 W
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) D4 g# C$ H1 U8 r! l) ~4 i
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 E! I( H# j* t" R
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 F% O1 T7 X) q9 Z; e& K# {
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- D, v1 L: e% ?; K! @0 T2 Y& p
5 ]) ]6 V' k8 x- o& ]$ C l! J- }
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
/ q# u; l L. s0 v; _8 z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
8 z9 o8 [ u+ o7 ` r1 |
mcasp->regs->PFUNC = 0; // All MCASPs
, Z# l; e, X% `# i) R# F: d$ ?
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- N, g) {. n+ }$ J
- A) K+ R' h1 ~. P G7 T2 Y
mcasp->regs->DITCTL = 0x00000000; // Not used
! M" g t8 l1 d2 C' W! s9 K6 a
mcasp->regs->DLBCTL = 0x00000000; // Not used
" `4 z7 ~" v$ Z& Y& E$ l
mcasp->regs->AMUTE = 0x00000000; // Not used
4 F7 {3 [, K9 G% b3 y2 K4 m2 L
0 {( F, M, ]! ~& ?% |( C
/* Starting sections of the McASP*/
. E; d) f; {9 d2 V
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ c7 ]9 u+ |4 ^5 Y: z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
8 o; {, b5 ?+ P6 G
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 I" _/ ?1 }1 ~0 H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* f+ B" P5 I v+ e4 f
- |" S7 {+ D, l ]! l0 e/ H
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, @" V6 t- M# C- r1 r% B" q8 y- ~" i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 ^, n0 D9 u7 _6 x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 a5 Q, s: f7 b& D1 v9 O$ C/ \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
9 L0 i, o; J% ?( `4 c
0 J; O y0 S! E- @, l) Z
mcasp->regs->XSTAT = 0x0000ffff;
0 Q/ K- t, R' E. T0 R8 j
mcasp->regs->RSTAT = 0x0000ffff;
; s+ z7 S/ _6 [& `; l
. V6 y" N H1 i7 n2 f: J1 m
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! }2 k8 | D8 J* k( T7 c) I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) d4 f- D- c0 ?7 q
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
5 {1 v0 ?4 A* k$ _9 C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
i0 X, O4 m9 f4 D3 m) ^( W1 z P5 |
7 O! h8 ?/ v. `" _
/* Write a 0, so that no underrun occurs after releasing the state machine */
7 N2 m- O; n; U& r5 c! q3 M6 g
mcasp->regs->XBUF5 = 0;
' c* C( n, i0 v3 A& R
mcasp->regs->RBUF0 = 0;
! F- G$ W0 M& g
4 L! D& G, K! I
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 B, M! Q! }" X% O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 g" H) ]$ |' E, p' }5 Z7 ?9 J
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 F% \. p" ]; n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' f# F+ g5 }/ q% [4 ] i
, G* i4 |* `( f9 y6 |. C$ ^- A* W. l
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 R5 o' `& E* Y9 E/ Z2 M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" O2 [1 u0 a! e* }8 O
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 f/ y$ j b1 W* f- f4 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
% F0 }' E( J) A8 l
4 N6 S+ ?# L1 C* A5 v# ]
CSR = 0x0000;
g" l6 i8 j6 T( @. e
INTC_INTMUX1 = 0x3d;
' d, N5 K& v0 t! _4 J8 g& j% a; g! e
ISTP = (unsigned int)vectors;
~, ^4 m1 f: n* ]& h
ICR = 0xFFF0;
( G+ P( f9 z3 z) _/ \; I( K
IER |= 0x12;
% K- N v+ g- w+ O/ h
CSR |= 0x01;
9 _9 _: a( }# l4 v4 c: r
( n# e) P( l* ~7 E; X! O
+ t, S& x4 K* |* `( S
: f2 z/ f1 y2 [' }' L9 W% `
还有就是两个输入输出函数:
1 T* U; c. e; E: Q; K. a
void output_sample(Int32 out_data)
( V9 @( [7 F1 t: [
{
: o" v9 C5 f h' i" z/ p9 x3 I
AIC31_data.uint = out_data;
( R2 U% ~3 }# T4 D7 G
MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 R: y2 K# N& v" L z
}
* k# M; a' Z3 r5 N1 q" p4 ?2 y
2 R% v' S/ F3 `* `8 Z& d9 x: h y
Int32 input_sample(void)
8 `4 L k0 J0 ?9 N4 j
{
9 k; t: U# i9 t! j, s. ~) E
AIC31_data.uint = MCASP1_RBUF0_32BIT;
4 O6 L" b8 r" Q. [# e5 A& l
return (AIC31_data.uint);
* p$ v! b4 R0 ^& f$ X' N
}
3 v3 m0 k( s5 s2 j
# [) D$ F( O4 K- h) R5 |+ ~
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4