嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 G8 _ ~9 _9 i( I' |: W9 \! ^
main文件:
0 }5 N% ~' ~* p1 d! s' D
interrupt void interrupt4(void)
' |' P( w7 I# a) j. k6 k& @; H
{
! z9 h/ u) F9 K; W, I
Uint32 sample;
( l& T9 X) q9 j4 ]+ ^( k
2 p5 e5 }. m' M7 q: G5 m w
sample = input_sample(); // read L + R samples from ADC
& }( ?; Y) |# Y5 b, Z) W& y
output_sample(sample); // write L + R samples to DAC
6 J! F) D7 m* X
return;
5 ~) j4 e) v0 s' \! \" _3 _
}
$ ~% G$ t# r' f1 ?* Z! J4 J
; w. g2 T" h7 q% ]8 Y; P( v
int main( void )
4 U. k6 w" O0 }1 U
{
; A9 D1 G6 |4 u; }
: \) r' d g* a& l9 ~7 V! k# g
/* Initialize BSL */
( g3 N- W: o; f
EVMC6747_init( );
# r, i' `- Y1 T9 |4 y& e
/* Call evmc6747_intr function */
4 _5 _, s5 s: e3 {) u
aic3106_init( );
/ u7 x6 q+ m+ ^- U
while(1);
2 q7 j# F& v0 O$ z: n+ q
}
- [& H" Q7 T" ]& g8 k$ E
7 L8 E7 T9 e: Z( L! g, k5 h
% }6 v; k9 _% k$ S4 v0 L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. u$ I6 l" I( N, x9 m
/* Initialize MCASP1 */
! W" O& v: m6 \8 P/ ^" A
mcasp = &MCASP_MODULE_1;
' n8 E2 b. R6 Q; o, T7 @) _( B
mcasp->regs->GBLCTL = 0; // Reset
' {* M( W; ~+ F' R5 o) `6 M3 t
mcasp->regs->RGBLCTL = 0; // Reset RX
, a. d9 R& O% Y2 ?2 G1 i0 k- w% `. X7 {
mcasp->regs->XGBLCTL = 0; // Reset TX
u5 Q! Q5 ~' v5 G: P L
mcasp->regs->PWRDEMU = 1; // Free-running
6 W) P* c! i9 r
// configure McASP0 receive registers
2 v& C% ~2 B& D: A+ c; w& _
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 O V& U Z+ Q" e5 h
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 q1 a( ~2 l& X- K& C3 c
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( W# [- n( g+ P
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. ]0 I1 H' \* Q
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
$ Q" y8 b+ Z. @7 X0 l2 z
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
# z. e% Z4 y: d8 |$ O2 l* ^ ~' V
mcasp->regs->RINTCTL = 0x00000000; // Not used
7 U5 }7 v% B+ Y U7 b! c
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 c) G! v# i3 P
9 ]& ^6 E* R: ?0 x! J4 ^
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
2 H/ E+ n P' X* Y# u, M, X
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& n9 h3 ^+ d U9 q
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
; p( L% i" D* {5 p; X c" X; i: ]1 F
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
C* l5 l; R9 p
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
: k( q- O% M5 Q. j
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) X% R! X/ U( E/ G
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- b9 R3 q# i4 J; o$ i9 j9 ~' d$ n
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 ] |4 p U0 G! _" y+ ` Z0 i0 K. V) |
2 g- e7 M5 s J$ ]" {
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 s4 y- E, K; y2 [ Y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 T1 P+ B+ o2 K+ U, c" i1 v" w
mcasp->regs->PFUNC = 0; // All MCASPs
6 u$ ^& b# R6 K& ]. ^5 D
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: D' y" Q0 s) x0 m( N
; R8 t$ @4 Z6 G' F% f! t6 o& U
mcasp->regs->DITCTL = 0x00000000; // Not used
- S& m1 G7 X8 s5 u
mcasp->regs->DLBCTL = 0x00000000; // Not used
1 i3 Y0 J; g% d @+ n8 n
mcasp->regs->AMUTE = 0x00000000; // Not used
3 A1 |' z7 K; u' n' c+ c* r
& x- w" r& \8 S A- M! G/ [; e
/* Starting sections of the McASP*/
0 F- _9 W- a4 o! c6 n9 h* x1 C9 c
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ H/ s N+ W4 Z; N- M& P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 _; M4 w, ?7 X( f
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% H A9 B% h+ V' U* y; A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, I" a6 U L! }7 |2 X7 t. X8 c3 P; A
0 I, P; i$ M" [5 @
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 Q `0 x" W4 G( W- u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; z9 y! J: H" p. ^3 ^1 t3 d( o
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) E2 u: [6 I) D# m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( Y3 R( \( f! X" K b* m
- K6 K, n) h* R' [- n1 d1 h0 h
mcasp->regs->XSTAT = 0x0000ffff;
0 t6 R) W7 r* ]+ J/ w6 ^
mcasp->regs->RSTAT = 0x0000ffff;
2 o3 ~: o. W+ R. [, K# p% V! t; n$ f/ q
4 \6 S: r) I9 i- e- h$ W
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# ^8 c3 `9 n3 ~9 H6 [* w7 J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! {5 u& w' {( O: i7 S
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
h$ b/ V( v9 X+ F. s/ W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) a. t; N# o/ W q& }# \" u7 z" \
7 { W! T- _+ B! ~3 W
/* Write a 0, so that no underrun occurs after releasing the state machine */
' A% B u2 D: t K3 N6 ? m' V0 K
mcasp->regs->XBUF5 = 0;
2 u! R9 E8 \# m$ J/ Z3 J
mcasp->regs->RBUF0 = 0;
* U! s: {# u, G0 W9 t7 A
9 ~' S% T' T! z7 Q# L
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# Q2 q1 d' e+ D* Y1 [( S1 _+ y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
; v& V9 A# V# y4 c9 d5 g4 c4 P6 E
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( H+ ~7 y5 b6 E9 @/ I3 b+ h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 X e8 K' \4 m+ K
* I2 N5 @/ G4 V. d, g B4 |
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ R# q/ d# j$ e. j. U- J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% C0 `- G1 c; k7 M. z. m
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
3 Y8 f. j3 x& F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( I; T* J1 s7 E6 L8 }% p
2 H. y7 o' n! v- e2 L) d( @5 e
CSR = 0x0000;
8 z3 H" ^6 X/ P( n. l. A" A K
INTC_INTMUX1 = 0x3d;
6 K- |! i7 K% t, K+ n* P
ISTP = (unsigned int)vectors;
~% i8 z% Q, i+ t
ICR = 0xFFF0;
7 h0 J$ M, l" ]$ A1 U( F" n
IER |= 0x12;
6 g$ B; X3 d, Q0 `6 _
CSR |= 0x01;
7 u$ _" q( S$ i
/ e, j% u6 }% a# p
8 \- y, n; M, m# t$ e
1 Z* J2 {5 j( B3 {& o: t, N/ d$ ], Q" u
还有就是两个输入输出函数:
5 P6 l' b/ `+ [& r
void output_sample(Int32 out_data)
) Y1 B5 s3 V) `8 D! E, }
{
, X( k( I! y+ s V; d
AIC31_data.uint = out_data;
( Z* B) E$ S0 T% Q
MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 H4 m/ G6 m8 ?2 T
}
. Z6 N# s; ]' i
7 F% ^. F; e) z6 o: U4 H; a
Int32 input_sample(void)
# {' h% H% i3 ^$ K% F9 r7 J( @: z
{
: q9 n6 D; \7 V1 ]
AIC31_data.uint = MCASP1_RBUF0_32BIT;
3 }( J! d2 v- Z1 I! G3 [
return (AIC31_data.uint);
5 N7 {- N- R5 y( |- C( c4 G
}
# r2 C, T6 \- E& A
5 l, U; ?6 u: j/ @9 q4 _. G7 O
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4