嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* c/ J2 [3 D$ n) H1 Q
main文件:
9 Y8 u+ }0 l8 m" S7 H8 I' @7 [
interrupt void interrupt4(void)
* h. I" r9 a; A; \. @2 t
{
1 O: K- T: M/ n; p# f' Y5 Y
Uint32 sample;
0 Q6 u- Y1 z3 a9 \& F% M1 o3 w$ I% o
# I1 l7 A& l4 w/ V. C6 t
sample = input_sample(); // read L + R samples from ADC
8 t# G# S& C. D2 a
output_sample(sample); // write L + R samples to DAC
: {* T2 T6 h! g, q% M
return;
2 W, y6 f4 W V- m/ P
}
8 h) `1 _: e1 j7 {4 a
7 L9 w* n& t1 q V$ [
int main( void )
' y; p D+ V! i& i+ O, Z
{
/ n! t" b/ f. Y, P; v
4 G' o1 W2 [1 k S8 U
/* Initialize BSL */
8 a8 U# P! q5 J6 {! {9 r* Z! [
EVMC6747_init( );
( d0 h) l) |" L6 ^6 N$ {8 @6 @
/* Call evmc6747_intr function */
3 l- b1 z& B* v8 Q4 n" a1 \
aic3106_init( );
) C! C6 n1 g+ ?, g2 t
while(1);
8 X; \# q S/ W' n+ }
}
4 F: t( T4 @9 g/ y
' a/ t% f" X9 m- a" `
0 q# G9 `2 t6 u& C- s, z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 O& L: D- K* `5 l7 I% }3 }
/* Initialize MCASP1 */
- Y$ P6 h5 }! U1 g
mcasp = &MCASP_MODULE_1;
% V0 I; J4 H8 ~) \' {% U
mcasp->regs->GBLCTL = 0; // Reset
& H* D# r* S$ R" K2 }/ ^
mcasp->regs->RGBLCTL = 0; // Reset RX
, W3 B+ t7 s4 P+ V Y$ c
mcasp->regs->XGBLCTL = 0; // Reset TX
6 e; Z) Y" r8 x: f/ e
mcasp->regs->PWRDEMU = 1; // Free-running
, G% Y7 B& W$ L4 ^2 a7 d* b. V# `' V
// configure McASP0 receive registers
' m) Z$ T* _/ F6 V T5 f2 z, u
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 ]6 }, U! X3 M7 k4 `
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 |/ }2 O9 D# s- C( m
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
Z% a" f2 ]* G2 D5 u
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 A8 p1 }+ v: O8 P) G l
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 F. F- y0 \" K' c1 {) [' X9 v
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
- ], D. l4 U. q
mcasp->regs->RINTCTL = 0x00000000; // Not used
' h9 W6 G- U# G6 v9 q
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- x0 k) v% m G" H2 Y8 }3 B5 S2 c9 v
) |8 W* E9 \3 A) \9 l) a! ^0 t: w7 ]# p
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
& ?! a, V, D1 ?
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ z$ } H& w; a- v+ c; N$ ]* j# p+ A
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 b5 o! ?. d9 u* c3 C* p
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, \" C( j4 K! y% c
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
7 w+ B" i c7 X3 c
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 \9 ^- d/ b/ P9 Q% |; M4 w
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& [' x" S5 P! H
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' \; B4 f( j4 y1 |3 d: V# ^
0 b }0 ^4 S6 s! [, n, q
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: O# h8 ?- U5 z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' e/ }& l6 B; L$ L5 U
mcasp->regs->PFUNC = 0; // All MCASPs
1 |9 h, i. Z" B- t
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
! h: ?; h3 m6 o3 F& \6 J: t
( z" Q; C- M8 d1 L1 r
mcasp->regs->DITCTL = 0x00000000; // Not used
; s# @* m+ N% b- {
mcasp->regs->DLBCTL = 0x00000000; // Not used
! c; u4 W9 ?6 N7 k, ?7 L
mcasp->regs->AMUTE = 0x00000000; // Not used
/ m& o( s3 F" w0 c# v5 ]
! c( I, f4 S& E0 h1 U/ [
/* Starting sections of the McASP*/
: ^3 p# B# w4 Q
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ V' z6 ^# N6 p& J3 J& z6 o2 u( E$ l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 s x7 {2 N9 \5 d, d2 m
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* [$ m. L7 z" u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ ^+ O: Q9 N$ z8 O4 }) j% h
( E6 z. o9 A4 X0 P4 S+ c
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* h* w* f1 s4 b9 i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ A, `% j- p' @# J4 ^% {
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- q' k5 \. }! h* @- {2 ^8 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
l6 v: j3 V' A+ T. G; j
) y% {- p/ l4 s9 S
mcasp->regs->XSTAT = 0x0000ffff;
# X( t6 H* M! a( u
mcasp->regs->RSTAT = 0x0000ffff;
0 V' e7 H$ a% x( ^: n4 r
( R" p! x6 _: Y- j ], `6 Z
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& K0 \$ B+ [, H! V6 Q! l- T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 \. Z2 W! y6 f5 X$ I
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& M6 U% B/ C) E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 L e( D# l+ z; P3 @: U; E
7 P* @/ ?( T* a, l, L& E
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 [/ `$ `9 x8 ^( c) w+ w: \% N; |8 c- r
mcasp->regs->XBUF5 = 0;
8 D% A3 k& O4 @2 H
mcasp->regs->RBUF0 = 0;
k: J! N* x2 `" w
( `4 c0 L* t5 d& A4 {* j+ ^1 x
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: q3 E8 O5 Y( E$ g* J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' [; P3 p1 H) u3 i# {9 q3 Y; M2 S
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
$ m) U3 L1 m W' l/ [ B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, S+ o8 \. A" F) j" j2 a
6 i$ e% n# ]# t& t( H
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* x0 c0 Y+ ]% ]. c: h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( g% `& f% \; h3 Q$ S5 E4 m
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! K! h& }3 Y" V; Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
w' n9 t! f! }! D; a! B1 K2 X
3 ~) \( z# t' z; @/ y; j2 P
CSR = 0x0000;
5 ~" x8 R1 p# W! c0 Z4 C
INTC_INTMUX1 = 0x3d;
/ q. y" J& U3 _, S+ x9 S
ISTP = (unsigned int)vectors;
5 S3 {" C, m( J! m! |
ICR = 0xFFF0;
7 E9 [$ i: s7 u9 I d
IER |= 0x12;
( ^0 f7 H! C! N, H+ s$ E9 g) q
CSR |= 0x01;
' T& g1 u( R% V' E! Q
$ O* H* Z! t* M4 y* d3 K) D
2 }3 r" o6 z+ T: ~
) y: O' y# d) r& `9 b
还有就是两个输入输出函数:
) |7 H: Y1 `3 y4 b
void output_sample(Int32 out_data)
" r. }+ y6 O! ]' F. E
{
8 g* p- Y1 T- F3 V
AIC31_data.uint = out_data;
& o' u# ^0 |; b- ^: \
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# j3 Z; Y# _ ~+ q
}
- {* U- j# M0 f# d# k& ~& c
- d3 D' q9 Z0 N- x; G. t9 F. l
Int32 input_sample(void)
9 q& `% v0 a( h/ m+ X3 g6 M: m
{
7 ~4 S8 M# [7 @/ O3 B6 T4 L
AIC31_data.uint = MCASP1_RBUF0_32BIT;
% g/ ~5 [- u7 z' E9 k/ @
return (AIC31_data.uint);
- o9 p+ V- b5 P+ c& b" I
}
" k& e1 y* T0 h% t: C
6 e+ l& k. N" L/ X7 J. z) b: r5 _$ N
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4