嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 c+ z" h: x7 Q& R/ y
main文件:
+ l/ t4 p* J4 \
interrupt void interrupt4(void)
/ P' _' V$ _% B5 I8 J& d
{
, o; M5 P$ w2 Z# E
Uint32 sample;
& U& d7 B, T2 @5 y( S7 U
) j) K* X3 r/ r' F" _2 ^
sample = input_sample(); // read L + R samples from ADC
3 o% Q v& f( T* C
output_sample(sample); // write L + R samples to DAC
' c- q9 z+ \+ [5 P: a8 `
return;
, ? j( ]% p% q$ K0 l& M; f
}
8 h, F$ ~/ s/ s/ H- X7 U0 W5 F
( _1 J3 ]1 u' `8 v2 Z
int main( void )
6 {1 m$ y* ]8 M" ]' C
{
4 m0 j& P; S7 i; G) g
& r' c7 L4 s; }+ P" G
/* Initialize BSL */
4 f: w8 W! h- A+ W7 J4 v1 O% Q
EVMC6747_init( );
- E# m6 w5 E. G) {$ g
/* Call evmc6747_intr function */
- X: A( b2 P: d! p9 \! A
aic3106_init( );
% o. B$ c% Z* x2 n$ f9 j" x8 Z
while(1);
- ]* t: P( p# {6 ?" g/ i. R. u i
}
0 \; s# k! Z& M- P, }: U) {5 u
3 b" W, l0 Q) x4 V" u0 ^3 H% n
3 B+ I, l: E- u0 S0 d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
4 z; b; s: E, A8 W/ t$ ]4 Q) ]. l+ e
/* Initialize MCASP1 */
Y9 D, B1 l% d* ~: ~
mcasp = &MCASP_MODULE_1;
9 I' ]3 F: J* a# h
mcasp->regs->GBLCTL = 0; // Reset
) W1 S- @2 ?* j2 f. O6 n, t
mcasp->regs->RGBLCTL = 0; // Reset RX
: b% a9 p; O+ l* M7 V6 A
mcasp->regs->XGBLCTL = 0; // Reset TX
* ?, m8 K% }) {, d1 c3 h$ S
mcasp->regs->PWRDEMU = 1; // Free-running
9 |; J1 B9 K, P. |5 L7 V
// configure McASP0 receive registers
/ } Y$ U5 D. v" g! U% c
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
+ Z" j" M# Y, q5 {2 B1 `2 R" c1 F
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' Q" f" h; c, }) }
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) [: n$ U7 g8 z* A
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
) z. f8 E4 Q \! X1 y1 s w
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 f( }& h: r& c6 }# v. k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
4 u/ @7 d: _9 }, ^! |
mcasp->regs->RINTCTL = 0x00000000; // Not used
( m. U; N+ n7 D' r T e7 P0 g+ T l
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 I2 G3 _0 `% [7 _$ R) c5 `* ?
6 [& D# ^/ B3 N/ v
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
/ }% t' K& K* Y9 |
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, q' Z7 @. E4 _. \% Z8 d- w
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
" O; z; X4 F0 q+ q" G6 m( w% t
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
1 v, H" w6 |- p, Y
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
' L3 {2 Q6 K/ ^- J
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
+ s# V, F" f6 k$ g2 d
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
( m" U k6 Z+ k0 u: @
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# x* c* j! J+ B0 \
& B4 D# y! Q. r
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
( s0 J& H. H a5 q) i6 |
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
: |0 }7 L8 y9 z8 v' F) |2 w
mcasp->regs->PFUNC = 0; // All MCASPs
; j. p7 v' u" @ v m/ o$ I
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
3 b. I4 ^# u7 O$ N
o K/ s4 R% D+ B6 s
mcasp->regs->DITCTL = 0x00000000; // Not used
- F( C; R! z0 w5 X2 x4 V
mcasp->regs->DLBCTL = 0x00000000; // Not used
, M: M$ A0 u* x8 ~, h# |
mcasp->regs->AMUTE = 0x00000000; // Not used
$ `* g0 i( W5 C$ S, d; A
9 ^ ^1 q0 n, c$ f( \1 E
/* Starting sections of the McASP*/
" ~5 x6 }/ \/ o* g& C& g5 O; u
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) _6 K x t0 `( m) m, M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
3 y! E0 e: J4 v4 g2 }/ p7 L
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. S7 i* ], d2 D/ |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
: o3 ~$ ~7 n8 }0 q; r5 I# A
1 H K4 r, D% J1 x$ N2 h
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
r* }8 w+ \- Y6 s$ R, O) h& |% r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
9 }; B3 Q5 E) Q5 w1 b% l
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" o) X5 c# h0 u. T5 l: n! q5 a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 X) H3 _! t5 C6 u, _
2 J9 Y; v& V' t+ _, B
mcasp->regs->XSTAT = 0x0000ffff;
) G. {1 F+ \9 g, _" q
mcasp->regs->RSTAT = 0x0000ffff;
0 A$ K% s, ^( g3 s0 S$ P/ N) L
5 o' z4 j9 W7 S' C. G: H
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% C) [3 {9 Y* }1 t% \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 N: z7 F8 l8 f1 f
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: g! c$ l% ]* w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
4 v- v6 t5 R! D' w$ P
( y) X( c) G% H9 ]1 e5 B; \
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 l: C* o4 r+ W: P
mcasp->regs->XBUF5 = 0;
' M! }- d( @# k# g
mcasp->regs->RBUF0 = 0;
; K$ T' R4 b5 F v: H+ H
6 k7 M% Y4 `* V0 N% l
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 S8 r& D I' U) \8 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) [) A1 ~6 A# ?! p) C
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; v! |" d+ F. ~* }' A; q; i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 o* S' d2 {7 O/ C* d
, z k/ L) r* p- ~ P9 ?, }
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, c9 V( `' J- f4 {( Z/ l# i; n2 V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& u! V' ~( G. ]9 X! ?
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 ?1 q. f9 @! Q! S# Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 v$ f& \* U1 q7 v
0 j5 k( r: n! B3 Z5 I
CSR = 0x0000;
, `9 x6 b3 o' k
INTC_INTMUX1 = 0x3d;
# g7 m( m9 B2 F' K
ISTP = (unsigned int)vectors;
+ E3 `! z' L% K2 S
ICR = 0xFFF0;
* s$ u6 d' |1 J6 U; i' V
IER |= 0x12;
* k, `) C& I9 }0 s$ c; @
CSR |= 0x01;
" S8 ~- }+ h9 _0 @0 v9 A
6 e8 S' g7 c2 o
7 O7 a& ]5 B6 I5 Q5 g2 U
( l' X* T; I/ I+ f5 e2 I2 h0 ?' J
还有就是两个输入输出函数:
' B Z! L5 V& S+ z5 I+ X
void output_sample(Int32 out_data)
* A2 i) ]9 _' m
{
( _4 I, c5 f# p5 d4 C" @* \: p! Y
AIC31_data.uint = out_data;
& x. a& f9 O; D8 I4 K. y
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 P& s! ?, N9 C D# D
}
- a$ |2 B) s# t4 D% w/ H
]: C- a# H' m, f1 Q
Int32 input_sample(void)
/ o9 Q6 q5 ]" Q* |: Y+ r. m% W8 K
{
) V" N4 a' }, f4 ]; Y# h: ] V( J% ^
AIC31_data.uint = MCASP1_RBUF0_32BIT;
5 M. R- X# F: ?9 _1 e
return (AIC31_data.uint);
# A" ?& Z7 J5 v# @
}
9 S3 p6 ]" G. N7 b5 H5 M5 `7 S8 g
" B2 y: \! Q4 ?1 ~! N3 _7 M! `
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4