嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
E: K- V8 e/ p! n9 x6 k L
main文件:
( ~# d/ C& Q$ {, p5 g0 ~/ ^
interrupt void interrupt4(void)
5 ~& V c& l5 V" Y
{
' I0 L! |* x4 z' d5 `( n4 p9 T# ~, i
Uint32 sample;
2 X1 V) `$ m- x f% [
/ A& d5 S5 P9 T% ^; m6 k0 G1 _: p
sample = input_sample(); // read L + R samples from ADC
1 r! z1 C$ W1 o
output_sample(sample); // write L + R samples to DAC
6 |( V$ {3 ?0 J) K
return;
/ W" ^2 @7 }8 G& F- i8 e8 c/ Y( G3 M
}
3 ]2 V$ @8 ~: _: l
# W& x; t6 c) o5 ^
int main( void )
& B3 C8 B1 t. q/ Z# x/ E$ e
{
% q' B' e7 B: [% B; {+ E- v G
* }5 d* u* c# S5 m# j
/* Initialize BSL */
2 O9 y& p0 X' S& o- r9 {* ^& n
EVMC6747_init( );
Y) ~( P" i: n8 {; q9 E0 n
/* Call evmc6747_intr function */
: f; p3 z* y$ h" T9 A- q
aic3106_init( );
; L2 f: H+ O+ o4 W9 e1 c
while(1);
, [( [) w4 K+ x4 w
}
) o* } y. ^, J5 Q0 i8 n$ H n
2 S1 p* u: _8 Z5 `
' J- X2 R) o" X' c5 p
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 }% x0 [3 [% }
/* Initialize MCASP1 */
$ Y4 s7 `/ ]0 B {
mcasp = &MCASP_MODULE_1;
7 f( r8 v" w, G% c x5 u4 }7 A
mcasp->regs->GBLCTL = 0; // Reset
9 F8 O: D' W! R
mcasp->regs->RGBLCTL = 0; // Reset RX
! D6 C5 L2 s- L
mcasp->regs->XGBLCTL = 0; // Reset TX
* g. T% w1 X- `5 ]+ W3 z6 @' D4 s
mcasp->regs->PWRDEMU = 1; // Free-running
" ?5 a" b$ K _ M# e* R
// configure McASP0 receive registers
- {2 V2 {/ g! z1 ]# T
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
+ n' f4 r) e) p6 A: `
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 `6 M3 V% ~; d' w
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 @$ g6 K" T1 t' R }
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
: ~+ ^; r" v8 @- e$ K
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ E; o- x# e0 b4 j# [
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' n# S( h- E& X* a5 o6 G
mcasp->regs->RINTCTL = 0x00000000; // Not used
$ \6 e5 w- E: _
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 Z8 N7 k7 d$ P' A2 S
9 n7 Y* c `1 y! B' p# V( K) U
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
! F! N. S, k- R5 C" O
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 E* A; L2 ~: ^9 C9 h. {
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 J$ h( c* b, \% `6 [, j
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, y: ?3 e/ b8 z
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
8 S! p) _% }3 l( `, W5 o0 }& s5 ^& h
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) j4 k! o+ ?# K; _; I, Y
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- C( @9 j% U# R, T
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 m/ B- X0 M7 L- j% y9 d
0 g8 r8 ]' K+ o. H: `& `
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
C% b7 Z$ w9 W/ H- H
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% |& L* q! {; F
mcasp->regs->PFUNC = 0; // All MCASPs
5 J% f5 f6 Z: S8 V4 J4 m4 r/ A
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
. q$ N3 B! s' c# n# L: s# g; `2 r
: ]5 f. b' J( W+ U
mcasp->regs->DITCTL = 0x00000000; // Not used
% H' y: b+ o; K/ f8 x' l1 x) U6 Y
mcasp->regs->DLBCTL = 0x00000000; // Not used
) x8 X8 ?6 P2 }# ^4 P ?9 Z8 j
mcasp->regs->AMUTE = 0x00000000; // Not used
3 c8 d- B K2 B" S$ c: @+ M% o5 ^
m& }) C* L1 E; e% ~1 A; Y
/* Starting sections of the McASP*/
" \6 n* B; ~) b& o
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 [# C- N2 M5 m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ @; C0 t- Y; g! ]
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
; @4 E g, }9 g5 N# I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% R$ r- c6 K+ I3 a
$ g* A) Y8 E& S" I
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 P; ~# W) T+ F, f' X+ X0 i( f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& m9 s0 T& y1 i! o! O; I4 k/ X6 H
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# G, n- {2 K1 R, ?& K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 d/ P& j( o# u. }) ~& R& ^
, k! m* G* q1 T' @; K1 a
mcasp->regs->XSTAT = 0x0000ffff;
- W/ ^+ C$ G: {
mcasp->regs->RSTAT = 0x0000ffff;
0 {5 Y, c I# i7 O) q) T
1 G3 y! i2 v3 c: i0 P
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; M1 L) q& z8 w$ ?$ W* }6 ^) B, R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; B! I F" a2 b1 `# e7 l. B
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 T2 K# u. j8 k( V( ^ x; Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
% H9 ~# v) z) [9 X
5 M" _' M% ~% O
/* Write a 0, so that no underrun occurs after releasing the state machine */
5 O5 I: B3 y# C
mcasp->regs->XBUF5 = 0;
; ]/ C& F+ t! X3 F6 n
mcasp->regs->RBUF0 = 0;
2 ? I, a- Y+ ~0 I6 ~- B/ }
( P2 T e' g4 O& b3 J6 t1 `! w
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: n% p/ ]$ T) r r$ _$ A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
q7 U* v4 {8 l! a
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 ]7 [' S' {$ |' m/ Y: F. P2 g5 ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ I4 T |- U' S$ d: z
3 `3 ]+ y8 g2 n# z
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ c( M8 n% x5 \' y: ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( _- Q5 D. M2 E
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 i& f! w9 f( u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
6 i6 k; \/ G8 J8 J9 N* K
' S, N' e! Q- S
CSR = 0x0000;
; t2 A& f% \, Q/ S0 X
INTC_INTMUX1 = 0x3d;
* R& a! E, z, b. n0 H1 g! k6 b
ISTP = (unsigned int)vectors;
/ d/ e* M2 y. W" d" \" w
ICR = 0xFFF0;
/ ^$ J' Q: k5 u. h; I }
IER |= 0x12;
1 E: n" J" h: e a9 B/ W4 T! m
CSR |= 0x01;
1 O% p: F4 T: m- F5 ]' f2 A y
?- l+ z0 j9 N) e- }6 u
8 r$ S4 Z2 i! p* @. ?
. j. F- f/ w. {5 G$ i+ T- d* w4 V: Z
还有就是两个输入输出函数:
, o" o6 m3 }7 i, o! [
void output_sample(Int32 out_data)
4 `$ @7 {; D6 o5 w
{
$ @; ^* J2 g8 E- v
AIC31_data.uint = out_data;
3 W0 h$ l2 ]# n3 |
MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 A7 t/ t" g, d3 W
}
# S2 A" n& _3 Y& W& \
4 n w% a# N; g9 d: \* M
Int32 input_sample(void)
* t8 h. ~4 k% {+ p4 {
{
* S T0 |3 Q" P3 [, @* R
AIC31_data.uint = MCASP1_RBUF0_32BIT;
6 ~' p# E& @ U, d# d. t
return (AIC31_data.uint);
8 ?: S) S0 `' S! P6 |; ?8 E; ?" X
}
6 O$ U$ T- ?3 F% t/ h# F% D# ^% W% c
' Z& ?; ^4 o( v2 Z
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4