嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 f3 C+ G- v2 o2 r/ k
main文件:
% y- D3 V4 `3 D
interrupt void interrupt4(void)
. x* ^7 a Z3 l; X
{
8 b6 S. }! \4 T- l& p
Uint32 sample;
v( L4 x# \: O+ S( l& N. g
$ x' o, `9 o: M2 C$ O' G. S* M
sample = input_sample(); // read L + R samples from ADC
* M1 M1 m* Z+ u' g3 F6 S
output_sample(sample); // write L + R samples to DAC
: E, N0 x7 f5 e- F/ M8 W( N
return;
0 u' I8 M. q. b }/ n
}
# j4 M+ M& x& p' w% G% X/ ?
/ H5 J# Y. R3 j& G" B/ i5 \
int main( void )
# l2 x4 E" G$ G
{
1 g4 H5 b" m$ l5 k' S$ F2 _5 l
/ ]% B3 l* R& R' ~# m
/* Initialize BSL */
) C3 \# q8 V0 O3 p# n1 d! m
EVMC6747_init( );
. Y2 x7 B: I* q0 M$ E
/* Call evmc6747_intr function */
& I8 r7 v5 w1 `1 u+ c8 q
aic3106_init( );
4 x3 q9 L7 z) m
while(1);
. \2 t- ?. G5 z F& _* m
}
& M# G5 E' D1 q7 `# I) M$ E2 D% a
# T4 d% a [! s% s
5 G3 @' i( J* I/ F f& J
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* O6 p& R1 E: ~ a) N( i
/* Initialize MCASP1 */
$ f6 R Q8 c# l; V: B* a
mcasp = &MCASP_MODULE_1;
- r9 t: F7 e5 O( i7 Y
mcasp->regs->GBLCTL = 0; // Reset
. @$ ~: b" T5 q$ o
mcasp->regs->RGBLCTL = 0; // Reset RX
( k# @4 E! w4 ]) y, g$ |- x3 F1 E
mcasp->regs->XGBLCTL = 0; // Reset TX
% R( q) P0 u y' L4 U; e' F
mcasp->regs->PWRDEMU = 1; // Free-running
$ J1 O! k( s6 }4 B
// configure McASP0 receive registers
2 ^! d5 X6 h$ E! J
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
1 y- Z: r$ J, j' w3 }; m8 p- {
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. f6 A# p6 S# e1 W
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* d& @6 O, q; @/ F+ n% b3 o
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 @% h2 z9 ^4 n, h% {
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 @) K3 T j, G
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
* T6 ~3 ~9 Q: ^& Y
mcasp->regs->RINTCTL = 0x00000000; // Not used
2 _, |! C& ~' d6 t C2 N2 V/ X0 L6 e
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 ]5 ~! P; P; ?
" A8 B" o2 T" ]
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
: f) m! @0 V; ` A- F! g0 r
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ t$ m" W5 \9 |. a0 E6 H
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
0 ~8 f8 `, |6 c
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 W+ A/ a4 V2 V& o$ M, j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
4 H5 |& G( ^9 w M6 L1 s% m
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
7 Y- x2 v% t) ^) u4 c9 y1 ?
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 ]; u/ F7 w5 a- D6 k1 o
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 \$ t4 G% w8 V3 R4 ]; K
3 d: [) F& v8 k1 E# D& I! b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; n2 E) W6 h" e' w1 C( T- k
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
$ x0 u) a$ ?1 ~4 e4 g% K
mcasp->regs->PFUNC = 0; // All MCASPs
- Y, O# f8 K5 G- B1 ?7 j0 k2 T5 ~5 O
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 o+ _- o; G- d, R- ]5 T
+ G' [* Y# b5 t" |5 }- O
mcasp->regs->DITCTL = 0x00000000; // Not used
0 w6 F- H/ h. j. z, I( D
mcasp->regs->DLBCTL = 0x00000000; // Not used
8 I* |4 ~- d# G% B& d1 `2 p5 H$ |
mcasp->regs->AMUTE = 0x00000000; // Not used
1 l* d) s( S$ Q- x( T+ X, X
4 @; v" [: A" i) D% J
/* Starting sections of the McASP*/
) Y0 V' M& f% V# V) D" [
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 B2 j+ N7 l& ~8 @. ~& l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
8 b9 \; \2 C- K4 q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
8 k5 e4 r# R$ j- Q ?- s* m4 H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 K i* T' J( `: m L7 M6 H4 a
7 s# S A$ {6 N/ O
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& J( a: L+ f! V o$ V0 I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 Y" e$ f3 E5 ?% t. O( i! v ~
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) F/ C/ @! J' p+ v; l' n" V% O0 H' O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! r5 ]. a; ]& L! Z9 U
; l2 n8 Y) ~2 O. v# i
mcasp->regs->XSTAT = 0x0000ffff;
8 O9 o& R7 @' M( X7 k; D
mcasp->regs->RSTAT = 0x0000ffff;
" c* n8 ~: Y8 k2 S2 o+ D3 T6 S
0 U/ Z2 m+ D. k' i9 v4 O
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# M) T0 a0 ?! U) `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 p( V9 H/ j" T! i
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 Q1 i s( o& @: i5 T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
i8 |0 |( t/ V) R7 j
6 z+ P+ B: K3 R2 s. d8 }6 p
/* Write a 0, so that no underrun occurs after releasing the state machine */
3 w2 c. \* ]& G$ B, u; |
mcasp->regs->XBUF5 = 0;
1 @: K' X2 l! h4 _9 E( q
mcasp->regs->RBUF0 = 0;
3 c7 o( I) P" c n1 f: [
' G) P! a, o. o& [4 w) |
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
* g% @( u) b9 n# G& Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( A! j" ^( p7 u. K7 c( M% U3 |
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: p" j3 c8 v; t5 u3 W* ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
5 `/ c0 `! G9 p) a
3 q& T6 d& A) g9 i' G! g& t ]6 ]- V. C
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! D6 v9 z1 l7 v5 I' P/ ]* z1 |6 u) Q) i z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& u- V4 o3 H' T! X& Q: f# \. }& }
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" W. f# ]) k* r$ f: F4 B8 h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
% \, W! o8 U+ X; U6 t* W+ t
# q1 r; p$ T) C$ u4 `7 y
CSR = 0x0000;
6 x; s% d# E; U" y6 B8 z& d
INTC_INTMUX1 = 0x3d;
4 @7 Z$ q( j* E8 C w2 Q
ISTP = (unsigned int)vectors;
7 w3 d0 Y# _: X( E0 n/ q
ICR = 0xFFF0;
, E9 ?8 d. O' s9 P& [
IER |= 0x12;
! X6 ?( m/ \2 ~: o
CSR |= 0x01;
9 b* w' o6 U$ Y X
1 k" w* k m* N
9 t. {6 R7 j9 `8 h6 c9 z- \0 t
$ X# D8 P% e) l( @4 o. i
还有就是两个输入输出函数:
0 Z# m% s" {4 G" T
void output_sample(Int32 out_data)
j6 p% I: M: M" X/ i' v/ \
{
) `! H# Z; a3 z9 S! |# n/ `7 ]
AIC31_data.uint = out_data;
3 x0 z" D3 A, c' f
MCASP1_XBUF5_32BIT = AIC31_data.uint;
$ u8 l! B" b% h! _* I2 W) m
}
. B' X* Z! q$ T; @) ]) [. n" p. `! g y0 K
# c5 M, s u$ j/ j1 `9 _1 { I
Int32 input_sample(void)
- r e& _& w% S+ [' l7 U
{
5 f. a3 @3 S8 J/ c+ b# N5 k w
AIC31_data.uint = MCASP1_RBUF0_32BIT;
) k, }8 J% k3 E
return (AIC31_data.uint);
$ F' z. `+ [) ~( Z
}
( ]& p, j# Q+ b) M! o
7 M! b0 X& C4 U/ J$ d
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4