嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 h0 ]& a" L; J
main文件:
% ]: P" Y+ f5 g9 D1 x! d0 ?; }
interrupt void interrupt4(void)
- k0 l) Y1 H/ g8 G p
{
$ {% d% D& f R, E
Uint32 sample;
& J& S2 C- g8 n2 B- |0 e! h
% I) c. |$ O6 W' {# F+ n
sample = input_sample(); // read L + R samples from ADC
0 x; H: X' e2 e
output_sample(sample); // write L + R samples to DAC
' B- q- X* H! I8 L* @4 I& U
return;
z* G: \* I- h" o
}
* X! p4 A6 |9 T, W
# r) f* @8 J$ l; R6 }) u7 _
int main( void )
# T/ N8 N; B; f0 ]* Z) i
{
) i, G% \- K) X5 S& V) q$ d
& H, N, Q$ D+ n# t* @2 b* P1 r" X* P. y
/* Initialize BSL */
9 o( N, @' C" |+ [
EVMC6747_init( );
" A; X) n/ G+ l+ l. t" u
/* Call evmc6747_intr function */
% A4 z+ s; \2 B% z
aic3106_init( );
, l1 c d6 v0 Q5 B3 j: f* e
while(1);
& F: k3 X; m$ K' n- f( W) r( x
}
, h% B7 N' E+ z2 d+ n
" q0 J/ L) A, h: e- V4 P
) _" B- Q7 w C* z6 p2 a# \! I: p
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 u8 ~$ e: L4 N/ V. M
/* Initialize MCASP1 */
0 J' Z% j. D# Y) X( Z& B
mcasp = &MCASP_MODULE_1;
- I% k" R+ _) `- b
mcasp->regs->GBLCTL = 0; // Reset
4 o5 y; P+ X( G& O5 ~ P h# v" ~
mcasp->regs->RGBLCTL = 0; // Reset RX
' X! P) s8 W5 N/ Y, q4 _
mcasp->regs->XGBLCTL = 0; // Reset TX
4 h" v- T5 Q# e3 W, M& P
mcasp->regs->PWRDEMU = 1; // Free-running
- G% s P% f, u4 r: L- a; x! h
// configure McASP0 receive registers
4 d% L( j" r- q( O
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
U9 q7 o" u) Q
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 J% ^$ h5 E; j! Q* t1 `
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( d' u% o# D" S8 n+ R. q/ f
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# @: Z7 F3 |& t- W' p6 ?
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 E: d$ N( p D0 F1 F) v/ N) N
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 y2 R' g, I5 A. H
mcasp->regs->RINTCTL = 0x00000000; // Not used
. T" {7 m" L) k5 T" F; j
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ ^" g' D1 O- a) J
5 c. `- J* T/ w, w: k# n0 p) Q% }1 J
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
: v/ n \+ w: c; x6 m' p2 L
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- Q6 u& c. G. |5 i; C
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% P$ G- q0 o; E9 `1 ]
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 V: B N9 r" E1 b$ W
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
; ? R* o( I( z
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
A; q4 t. |, S+ W
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 ]* [* k- |! m" k; X' Q j
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# j0 a7 z# X7 w( k4 ~! T- L8 E
) c5 Q. X- p$ k; p9 y" P
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
$ g6 b( x8 r: b" {9 s1 P, A
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 H' X5 u) a% S5 Q6 Y
mcasp->regs->PFUNC = 0; // All MCASPs
) F- ]! w. }8 k6 B `
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- N5 N+ o2 i% S8 s2 F* I
! ]0 r6 z. G4 r5 c6 K b
mcasp->regs->DITCTL = 0x00000000; // Not used
( s# ^+ P4 m( T1 g
mcasp->regs->DLBCTL = 0x00000000; // Not used
; l. }3 p' l' |% B2 E
mcasp->regs->AMUTE = 0x00000000; // Not used
; d1 D3 Y9 S) t& e# o
0 ^6 E' y8 |) \
/* Starting sections of the McASP*/
7 r" R- p% ~: i
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 n1 ?6 C; j) i' S7 I5 F$ P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ \" A, e! d* A* w# _/ n. p
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, `, U! C6 l7 u S: }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
. J; y: `4 w) _1 x8 z: p; \$ h# t; ]
' [. ]- o5 Z- e! ~
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* y; q& T: [: c7 I, Y7 _# y# k: _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 h; A c$ O' |# a# G; ?: P
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& w% Y, B! y. r! ] E( ? `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
n. A$ V; B u4 B, v6 w/ D% X
# p4 q4 n* k6 o; \/ N6 h
mcasp->regs->XSTAT = 0x0000ffff;
: h5 ? N# n& ^- I+ U2 J/ U
mcasp->regs->RSTAT = 0x0000ffff;
d1 B# A4 V5 d- w& g3 J
* O6 D2 J& z7 N& n6 G
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 f2 z4 o% l9 O. U, \* M6 p8 Z: V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# l* I! J& Z( p. q7 }. F
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ J4 c& g9 j; m" X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& W% j; }* }! F% i' ?2 R( n
3 n; |; z' G. R, B v( U6 K7 A. |
/* Write a 0, so that no underrun occurs after releasing the state machine */
k( l* f5 N' c) q' t- B L
mcasp->regs->XBUF5 = 0;
' M1 d5 d& i- c0 t7 w. ^4 f, j
mcasp->regs->RBUF0 = 0;
2 j. O4 |& C- `2 H9 u
; I$ [$ _$ _- B) J( Z8 j; |
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 \0 m! R, E/ d# G3 K% _7 ^/ y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
; h' }: Y% ^6 G2 k
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: M+ _$ ? P* h4 F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% \( E0 K( n5 w/ M+ w
1 o( U3 u: O: _: y6 X
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 s0 h0 D2 ]; C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" b" m2 A9 W4 a$ V5 ?# E
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 j( M% N4 L+ p" }$ c# G; F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: ?1 U. c! I' j7 p* l6 `; C. S
# d& q4 a% D' r( C1 Q
CSR = 0x0000;
& Q* B; q1 `; P+ d+ s
INTC_INTMUX1 = 0x3d;
# k j9 Y! |6 q& d
ISTP = (unsigned int)vectors;
6 N, ^/ o8 p: M- F
ICR = 0xFFF0;
+ E3 E. P1 l& q+ N9 D( J
IER |= 0x12;
# D- g/ o. j& t& Y7 J6 z2 c' D
CSR |= 0x01;
( U) z, ~. Z6 t0 g
$ ], y: h9 W/ J# _) D
* T% E: W* y4 e' C* l; k0 e$ }
- \2 u; J( ]" P& U8 t* @
还有就是两个输入输出函数:
( o5 \& L' [+ p9 \+ y
void output_sample(Int32 out_data)
- u5 Y3 z( k# e/ P: G5 b0 u
{
9 e. m2 D0 q. L6 |2 M9 a3 s
AIC31_data.uint = out_data;
9 B* N1 }' H7 J f, A7 }5 t/ j$ E
MCASP1_XBUF5_32BIT = AIC31_data.uint;
! }& Y7 h) r3 r% ~
}
* N, k; G# {& s) {
+ [4 }' V4 ?* }, Y- `# W
Int32 input_sample(void)
" I& ?# D' E9 R) E. u9 \/ k+ }
{
0 y; l' O9 \* P; ^1 M) j: J
AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 A4 l5 r7 ^, ]. _
return (AIC31_data.uint);
; _$ F% d7 i2 B, I1 S' D$ H! p6 u
}
8 ?6 O8 @. V; k$ X$ |
: e; |" H8 u. _, p: Z0 V
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4