嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 I. G% W) r, Z
main文件:
8 K& K! m. _( A) z
interrupt void interrupt4(void)
3 O4 h/ A+ w5 k+ p: T' w3 ^: A
{
# }' o# [- S: J$ J% j- o. p2 \/ J2 Y
Uint32 sample;
, D4 u, ~0 `, k3 o% |
' j7 E/ I; ^% p) [7 |4 t
sample = input_sample(); // read L + R samples from ADC
- d9 C6 Y+ R/ Z, d$ L0 I. A1 \. G" a2 Z
output_sample(sample); // write L + R samples to DAC
* J0 `* u' x) j" K* t- Z" w7 U
return;
# }' d$ i& @2 i! l c: k
}
; W% _; f7 f; k J% B1 N
' f+ P% R+ B' H* g2 U6 ?
int main( void )
0 v& b4 L3 m c7 N
{
! }" W! ?7 }) _7 q+ H$ U
' Y l4 V1 i% @! V, Q
/* Initialize BSL */
+ h- `7 i/ t4 q, J
EVMC6747_init( );
. ]4 |; B, {9 U: [
/* Call evmc6747_intr function */
N( k9 `! J; [+ L# B: ^" M
aic3106_init( );
/ d0 R/ D: T; @, |/ C4 L2 E$ i/ p
while(1);
# P$ |2 N/ @; g2 R6 o. p# G
}
/ R7 L3 C7 J$ T) X5 O
' N% B% _- r6 m
5 D' o) s5 {# z$ K5 y$ z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 R( s. L7 B+ d* ~* m4 v
/* Initialize MCASP1 */
x! l1 [2 K0 O/ G' Q
mcasp = &MCASP_MODULE_1;
5 u7 e( T% W. R o5 R- m: d
mcasp->regs->GBLCTL = 0; // Reset
' O: |! s' `, q' n/ N& d+ E
mcasp->regs->RGBLCTL = 0; // Reset RX
7 ^2 f- q8 o# \% g8 h2 ~
mcasp->regs->XGBLCTL = 0; // Reset TX
) e& G6 e- I6 N+ g( `$ k$ Y, F
mcasp->regs->PWRDEMU = 1; // Free-running
) O8 D1 O) h4 e+ y" b
// configure McASP0 receive registers
* H6 i6 \ Z+ O8 t
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
5 i' |, R) r' `9 Y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: _3 D# e3 B7 a
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 u6 b' r( W4 a; U) V- u9 Y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ i* \7 b( x8 Y3 P0 b( n
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( A: f! b* D4 e
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ ~' w8 `5 T4 L6 W1 y) o2 } Q
mcasp->regs->RINTCTL = 0x00000000; // Not used
; W: H) G- \( Q" f j
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 i; h( Y7 Z) W/ l- C# u
* R) L, ]7 E8 O+ k
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
8 o4 w a# h# K- z, n
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* [. i- h/ ]" w% c n
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ e: G* W1 N% e+ ]5 I2 I( S
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ W8 n, Z- _% o H4 K" E9 B! Q% e
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
9 B; Q" l4 o0 u# v; A, Z. ^- ~2 r
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
" B5 r6 m5 \) W+ b! P3 @: B
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
$ \5 j8 s) l1 a
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 o. P, @' i: b# K! R
3 _. o/ B( T0 h/ c& w
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) R8 {+ T+ T5 ~+ x* x* g
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
0 }& r0 P# M3 ~+ G% v; u
mcasp->regs->PFUNC = 0; // All MCASPs
' t- E/ K$ ^- u) o* S$ J+ }% W
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 g- b/ n( L% L& v; N. [
5 P# j L! T, G
mcasp->regs->DITCTL = 0x00000000; // Not used
) a0 r9 }8 B# H5 S# c" {* u" V
mcasp->regs->DLBCTL = 0x00000000; // Not used
% ]4 v4 q/ w. m9 D" {9 h+ A& _
mcasp->regs->AMUTE = 0x00000000; // Not used
( u- u5 y1 N5 v/ s& h2 d
% O# g3 z' N# K$ f: C! i7 k
/* Starting sections of the McASP*/
2 Q$ M9 z: k) o2 Z) r$ @) y0 |
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% _# s& @& p6 i$ n9 i- \* B
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 h, R* u3 Y. _" T. Z; L6 I
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ ?7 Y x3 `" h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 g8 ?, d- g1 E, S6 p& s5 t
; Y& j7 X" V! n" l4 P2 L
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 Y' ^1 K( ?. \+ w( h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 C Y k* e2 D* {, g; f
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- | o# W" y' `7 v, X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# G" c/ t5 l9 K& X( e$ o
1 e- c6 |: x! _# c& i
mcasp->regs->XSTAT = 0x0000ffff;
% E- K2 ?* O H# U
mcasp->regs->RSTAT = 0x0000ffff;
) P0 h; ?: m3 c* Y6 ?9 Y5 Q j
) Y" b- Z9 p1 j% t
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- L) k6 Y9 h$ O6 z W: n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 h' E4 S! N" c" a0 n: h; h
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. v( W6 ^+ C; p$ i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
C. t8 ~7 P% r, b* r B- f
* w$ Z; `& c; h, X- E
/* Write a 0, so that no underrun occurs after releasing the state machine */
2 m/ k: E- G& F: a N0 w) x& X& w
mcasp->regs->XBUF5 = 0;
M2 p6 G" I: O) l; E
mcasp->regs->RBUF0 = 0;
0 I8 P" B: N3 _8 l: W) O) [/ e+ }6 {
8 P6 s4 v1 o1 t2 M, k1 [
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! n( t0 [5 _" b5 r) _5 I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) |0 y5 n; q: @, C( l
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
$ s1 a+ i. N2 [9 ? W$ p0 y7 G O: x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, {; @2 X( Z: e
: n: l3 O6 B2 P# c
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! ~0 N5 C# C2 P- }8 O6 a/ _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ Q7 Z# x# m% }- f
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) \9 \* H. J& |4 W ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
. U( z1 N5 c6 f
) v7 t" O. V6 [5 P( C! v
CSR = 0x0000;
H. O; B8 v, u, O4 u
INTC_INTMUX1 = 0x3d;
8 ^2 b9 B. ]7 a2 ?
ISTP = (unsigned int)vectors;
3 K, F& t% T) W/ y# Y. s+ F
ICR = 0xFFF0;
0 b6 S1 h& `- K7 _
IER |= 0x12;
' V% K0 O j4 {0 | O) r4 f
CSR |= 0x01;
w8 [. D# f5 s2 _ C! |
: q; g. V) d# R! E6 ]7 U% n
5 Y& X+ E( F9 c, ~+ o e
) B1 S" g9 w4 d" `. F
还有就是两个输入输出函数:
% S( U _+ j7 F& I) U0 p2 I+ |
void output_sample(Int32 out_data)
7 u* B" w Y, {) Q, Y
{
+ R* Y P5 v7 H- s2 q
AIC31_data.uint = out_data;
2 C" o1 G0 |6 m! ]0 B
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# |$ L- ^7 ]$ [
}
4 ?2 c0 S `- e
; t6 q8 A# }. z% w" Q: ~/ U
Int32 input_sample(void)
* p) H, E2 M2 k' g: t& t8 x
{
. e0 P) j& g$ c, D3 M/ j' L
AIC31_data.uint = MCASP1_RBUF0_32BIT;
O) M# q; X' ~, Q
return (AIC31_data.uint);
& {$ o* n; ^$ _4 y
}
* K0 Z! ?1 D/ }2 I& a$ ~
% a) B, @- I7 H" C/ S- P( G
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4