嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
/ U% @' A) L- S. W% o, _
main文件:
3 P" ?. p( P" z1 z: }0 M; R* l
interrupt void interrupt4(void)
6 W2 I3 q" _; f2 L. o8 v
{
6 i7 H' K% C7 C6 x
Uint32 sample;
# ~1 L% N5 _2 g8 p8 Z: r
4 \1 W2 b: y7 g& I1 b* P
sample = input_sample(); // read L + R samples from ADC
' v1 O5 I V0 z2 L& m7 U
output_sample(sample); // write L + R samples to DAC
0 _4 j: x6 Y' R) _( F6 @7 i. u( u
return;
, q: g+ F) O: C0 k+ @
}
- l# [' l3 l1 u# U
, q0 S* e% Y+ Y& w9 \' \. W
int main( void )
* ?/ e- Y+ a0 ?) `
{
, J% n8 J! V3 k9 g4 R. T1 d O5 z2 Q$ y
: W2 W# S: a, p5 O$ B) P( E
/* Initialize BSL */
' l: ?% t( r: m3 D
EVMC6747_init( );
0 j' t- R- N% w( d* x3 f' n
/* Call evmc6747_intr function */
: J9 T! V! `3 ]; b% Y- [
aic3106_init( );
2 R2 O, U' M5 k4 W4 P/ ~* ^
while(1);
4 v- y! V/ s# V, w/ K
}
5 m& Q e) g8 O
' y4 s* n. R8 x H0 n
6 i$ t1 J, u+ z6 q" Z# Z c
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! i( L6 D3 E# b6 C9 d) L! h
/* Initialize MCASP1 */
, G7 g+ v- t+ E* O1 m
mcasp = &MCASP_MODULE_1;
! W1 d" t5 E# y3 H$ w6 g
mcasp->regs->GBLCTL = 0; // Reset
; b4 T3 M, y4 ?" I" T
mcasp->regs->RGBLCTL = 0; // Reset RX
4 K: ~" N5 K5 x- p: D! N2 ~$ |; \
mcasp->regs->XGBLCTL = 0; // Reset TX
1 R1 n2 G2 F' I& S- i8 B
mcasp->regs->PWRDEMU = 1; // Free-running
) G# z$ {6 W; F6 l6 K/ d
// configure McASP0 receive registers
1 _5 \7 ?+ E7 o6 d+ |) @5 Z0 p1 }! _/ i
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ b# G; b+ a' ]0 O: j
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ K" v- A& v/ m' h" Y9 w0 k6 r
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% t, i5 G* h; ?4 _& ^/ S, q) [2 |
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# @, n6 T1 E/ j' Q i
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! E/ T% @6 {( l6 p& q) Q' G& f
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
; ?- B" u2 y* k9 c- i% f/ h; H
mcasp->regs->RINTCTL = 0x00000000; // Not used
* x- ] V6 a9 @ C% f' {0 W# T" \
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ c0 x! Z9 t6 G* Z' L$ ]2 _
0 `$ w1 O* f; T0 H7 k3 F
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" k' k! g/ i) N7 i
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' a& S% A6 }- P& o% A# m4 t$ B
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 g0 H1 f4 ]1 I* A3 S2 |
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
8 }( I4 N1 N2 S) L$ V8 S
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) C) f/ W5 L% R) s2 _
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
! `2 W' U! L3 i# R1 n
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& r2 e! |: b5 d1 y- |6 [0 }
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, B2 I) f, ^7 x) c5 K. g
3 B( b0 ?$ B, o
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
. V3 S4 C8 e1 F- L8 ]$ B5 n
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 T; \+ u0 e0 A
mcasp->regs->PFUNC = 0; // All MCASPs
' U/ a$ M# t% l# f, s' Z" \2 Z
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" r0 o' U: p% X' }
2 ^9 {$ S! N h+ ^0 p6 o3 G
mcasp->regs->DITCTL = 0x00000000; // Not used
L' h. v1 L+ N9 ~; G" T
mcasp->regs->DLBCTL = 0x00000000; // Not used
$ Z' R! C& ?* Q+ z2 }- P
mcasp->regs->AMUTE = 0x00000000; // Not used
: ~4 Q8 T# R. i3 B' h
% s4 A( W# K7 n4 Y, g+ _0 v
/* Starting sections of the McASP*/
' x& s7 j) S! m8 N
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) @5 y% `$ l% K' j8 m5 o) E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: _& l) _3 h* F2 w
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# i% x4 B* v" y, b2 _% K) r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- V' @# ~; y" {. s* `
, Q/ I' |9 j$ R& L' p* _. b
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
+ G0 F* v" r8 {' q# N5 Z$ o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 @7 q. n% a- e4 _5 {
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' _9 ~& s; i6 y. p; i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) J& y$ o: T- J4 P% |2 _/ [. l% t/ R
, {3 h9 @8 X2 n7 R* e2 S
mcasp->regs->XSTAT = 0x0000ffff;
4 j& ?8 P4 T+ h3 e3 b
mcasp->regs->RSTAT = 0x0000ffff;
2 s3 D6 Q [( K1 L- J
. x( B/ v" A, l
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% q% p1 \1 K$ ?, R) L& z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% n6 R; Y; `" ~0 s+ e/ U5 i
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 |8 ~6 W7 F3 ?- N% @4 ]9 Y1 \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: G- W) H. `: | C. } c
# l: y! ^! O' Z1 B; \8 A% ]
/* Write a 0, so that no underrun occurs after releasing the state machine */
6 q, C, j( w% {$ {) G, \
mcasp->regs->XBUF5 = 0;
' p6 Y; Z; Q1 q7 J& }
mcasp->regs->RBUF0 = 0;
4 c- ?9 U+ s! \, P
3 v( e# E: B7 A) s- S) T( |- K
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" x6 S4 T1 r) V/ o8 f |! G2 d; _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 x* o: |& g# ]9 ~7 W% I0 f9 f. f
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! }% J7 y" B' N' s! _: m8 @! o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ |( q* ?5 o8 `0 \9 z& g& v
- G1 b# M) \7 [) L! \
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 {& k( h b G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
i8 ]6 K, x" c$ Y, E+ B3 P) Q% I
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 l5 E3 [8 G& h: I) E2 [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# V" O, Y( |' d; H9 |/ d$ K
" B0 ~7 E! ?' d/ `" j4 `) W2 q& H
CSR = 0x0000;
) L2 |! z6 K/ o6 P0 Z0 F
INTC_INTMUX1 = 0x3d;
" |' i+ Z% n# v
ISTP = (unsigned int)vectors;
+ h- {1 l1 F" }; L$ R0 I
ICR = 0xFFF0;
2 o+ Z+ y4 G: r8 h3 b6 J
IER |= 0x12;
* e* M! K# D3 f5 W+ u! v
CSR |= 0x01;
; ^1 Y. F$ t3 i# {& Z( `+ U2 q
1 g; N+ K3 W, ^* ^* Q! q
1 v! ]+ r& A- u t* R6 u
+ X0 ?6 f; k8 K% o6 x* p- j
还有就是两个输入输出函数:
+ {+ E/ O) r& }
void output_sample(Int32 out_data)
7 h. i! g/ f7 }/ X' f
{
. O" j# C( E' M _& o" m
AIC31_data.uint = out_data;
1 I0 R- ^0 g9 \" q* T& R" Z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 Q: d! G2 |0 b8 J# ~: n! X* O% A
}
" B- {" M: s" @
$ x( k! E5 H/ l/ @) U9 ]
Int32 input_sample(void)
. c3 ~; r( T s: P0 v2 s
{
; Y! G8 M4 x) v6 y$ p, b/ |" s
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ J7 m/ `4 N+ a1 |9 l3 p
return (AIC31_data.uint);
! U# q- ]& D L
}
8 I9 Y$ I5 E/ i y
8 @- T: O, |1 P% [7 e
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4