嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
+ e: @5 }+ f3 a% n* }
main文件:
( ^) b8 D$ x s9 B( ?6 e
interrupt void interrupt4(void)
4 j( j* d! D# G. Y
{
5 x; e2 ] n& j3 Z
Uint32 sample;
/ u7 ^ q' h/ D' x; B4 m% Z/ A
3 I% x1 a$ ` h7 Y$ D& G* z( W
sample = input_sample(); // read L + R samples from ADC
/ Z. H5 p3 _$ t3 C& u; q
output_sample(sample); // write L + R samples to DAC
/ v- _4 R, ] e" D7 {- A; |
return;
; z" }! E; V& @ q- ^
}
2 y8 o* [7 O' l
2 f, ?6 }. i6 ^" f1 @
int main( void )
6 l0 | w% h- W& W I
{
" X4 B. I- p0 i& S3 q
/ p) U; V6 P8 B: \
/* Initialize BSL */
" b0 I( |4 d3 L
EVMC6747_init( );
9 [$ ^7 K4 H- x* r5 G! N
/* Call evmc6747_intr function */
9 W4 B5 B7 X0 z% G5 F
aic3106_init( );
0 C R+ w. j9 y$ d, T% [
while(1);
6 R0 r& [) F' V/ ?$ N
}
% W: s* L( q- l3 C& K8 M R
0 y4 D0 S0 W3 _( x5 j* i5 [* I
* U( m0 U9 \7 |7 M+ f: E- {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ U4 `- P Y7 H
/* Initialize MCASP1 */
0 Q" v2 J% I& r0 V
mcasp = &MCASP_MODULE_1;
6 E* O1 Z4 f' T9 A
mcasp->regs->GBLCTL = 0; // Reset
& D6 O- w# W* h6 B7 U( I; H p
mcasp->regs->RGBLCTL = 0; // Reset RX
. n/ c E3 M; f: C, Z$ j, o) G9 E
mcasp->regs->XGBLCTL = 0; // Reset TX
: ~& c: `6 J: b' o
mcasp->regs->PWRDEMU = 1; // Free-running
* N2 O8 @5 M3 ]
// configure McASP0 receive registers
7 M3 d8 c" ?. I& [' f! T- z- ]
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
* F7 F' Y. [+ E2 q
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 A' a5 N" @3 z* l( V; ]5 W0 [4 e
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 j! [6 Y1 O# I: M
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 u3 I1 [6 L/ }0 C% }6 O k
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 o+ }9 l% j+ N [6 t- Q+ \4 q
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 e @! o% e; K$ m
mcasp->regs->RINTCTL = 0x00000000; // Not used
; h0 f7 a" M! H# |$ _5 I2 f) T8 A
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( l/ N2 Q: N" Y7 |
& j- Y; U; l# S: g
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
u( Q8 M; z0 C7 @
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; o q u7 F5 B+ |
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) P1 u0 D! X( G
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
6 @2 |4 \' a$ `& h
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 W: W- `2 o' _. @" y- @
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
+ s& r2 z/ b: m, B
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
1 J5 K# E* J4 s+ f% m
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( K* d# j* | k0 \2 H& V/ E
5 Y- _# n3 _' ~8 `5 Z5 m- [
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* ?) {6 x& y% Y+ _. L2 Q
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
7 v$ s3 u6 N: V, y& w% M; i
mcasp->regs->PFUNC = 0; // All MCASPs
8 P! l3 N* D! t4 [
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! u1 z& }: ^5 a1 u) Q* e
( s2 ~+ v$ `3 q( m; M ~: k" ?
mcasp->regs->DITCTL = 0x00000000; // Not used
4 y2 @- E& f5 h6 ?& F
mcasp->regs->DLBCTL = 0x00000000; // Not used
$ S3 f+ S. A3 x: Q# z6 S
mcasp->regs->AMUTE = 0x00000000; // Not used
7 S# u7 h% u& N" u3 ?" [) c* r# D
2 R2 r3 P% [+ L2 {* _: @
/* Starting sections of the McASP*/
9 j* B" @5 n- g" o1 M" A: R
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 k' B b/ C# \" u+ p* \7 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
1 ?/ s" [3 h4 ?6 k" l" A
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# m* z9 u* M" r: m, T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 S. z6 P1 I2 p- J9 }( s3 C% X
# o" e+ c. P4 w, w7 ^8 J
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 t4 E, A9 r0 q8 V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
A3 d4 a4 y4 A
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& }& A. F" Z- O- Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" ~4 A( c1 y) v1 c- [$ h! P
1 o4 x( d! W- N0 K) A6 f& J% `
mcasp->regs->XSTAT = 0x0000ffff;
( p. c; H$ E9 S8 r G6 B9 Z
mcasp->regs->RSTAT = 0x0000ffff;
; G7 j8 T$ U, {
: C p! v; n: I+ q; }& h
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ g( R; l$ R1 U+ c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
O: i8 }/ W3 E0 m) U
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 N5 ~: L7 o5 P: l1 g X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ T0 ]- P/ {# t
- v3 F8 p- D" m
/* Write a 0, so that no underrun occurs after releasing the state machine */
: ^7 _" K/ p" c
mcasp->regs->XBUF5 = 0;
* r# w! S, F1 ]
mcasp->regs->RBUF0 = 0;
4 d5 @0 H+ b; V2 X$ N' z
% Q) X: l( r7 M! Q) ~0 B% ?; L' H
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 I3 p7 D; S g9 Q8 \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. E% y" G9 X- ^! k7 v) t6 |
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
* i& M" k9 Z& t* Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, }. d3 N: x5 t
4 B% _4 e8 ?" i
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( S' e- D5 R/ O3 u7 h2 J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# P, T9 q6 o8 @% R7 j' b
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 U! d3 W5 R4 p8 V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- i, u$ ^ Y3 x) f0 o2 f1 @
\3 `0 E, g& ~" W1 w: V. ^
CSR = 0x0000;
: Z, y1 }( Q' K1 m( {7 i
INTC_INTMUX1 = 0x3d;
F A, k& l' r
ISTP = (unsigned int)vectors;
5 ?+ K1 ]2 m4 W& n; z9 I- g
ICR = 0xFFF0;
# L. y, i3 Q1 a/ G" T3 h& e' V3 K+ @
IER |= 0x12;
9 Q! n1 k4 Z0 m$ E$ C
CSR |= 0x01;
) v9 \: k! X) C, `9 M
8 ^ j1 a$ Z, k% I R# L
5 S% Y6 c- W i) t: c7 P" _1 G
; U- a M0 }9 f! g0 k: [
还有就是两个输入输出函数:
6 f% {* B6 J2 d. _1 ?: b1 `
void output_sample(Int32 out_data)
, h3 r% d) G/ }1 e& ~" z. j
{
& H5 ^6 u# Z5 h9 l: _# H
AIC31_data.uint = out_data;
4 t( s4 R) K- @. z' q* o4 p) Z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
' j( w- G+ H0 E7 l. F2 f+ W. j0 ?+ I
}
t) `1 e5 | J, o
3 H( w4 q G* T5 A; {
Int32 input_sample(void)
: F! T2 @$ L' j" d# L+ H8 c
{
- L/ U+ q, {8 N9 [: a! D2 a% R
AIC31_data.uint = MCASP1_RBUF0_32BIT;
, y# J7 B7 I. o* F: ]5 m" r
return (AIC31_data.uint);
" B4 ?) E3 E: L' g" k# x
}
: K' X4 e D2 ^4 J* e8 x
3 z7 b6 c9 {* S# \7 l
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4