嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. R4 ^" }8 k, p, _, d- [
main文件:
( O F' q0 H6 ^% _0 @, M
interrupt void interrupt4(void)
2 v! U' i. f- i* G* O
{
7 m$ M& L' r% c/ o4 P/ X
Uint32 sample;
\8 [! ]# I" U; C; u( {- Z5 C
1 s5 o f. n D
sample = input_sample(); // read L + R samples from ADC
+ w k( B: y% ^; _4 U: A
output_sample(sample); // write L + R samples to DAC
5 C e9 ?& }& u$ \. N+ c9 Z& r/ \
return;
- m& W& y& @" _. ^# v
}
& \- N$ Q. Z! F& |8 S' `
# Q+ k! c7 f1 K
int main( void )
. k' n3 p7 W2 S5 } T6 Z& ?7 E
{
2 ?# t- _ A9 j* v* K+ n- K! C
4 p' N, o( t, ?
/* Initialize BSL */
# F4 k2 V! ^% }
EVMC6747_init( );
4 [8 q# v9 V, F6 [
/* Call evmc6747_intr function */
9 L; ?2 A" q4 z. E
aic3106_init( );
; M4 H, v8 A- s- d
while(1);
* y8 Y' v+ f4 M
}
% U& R* N6 A) M* Q4 f1 \; `4 A
% {, w! Y9 i7 @- ~/ d3 t
/ {- E/ ^3 I9 o6 d0 E( P8 ~$ z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 F8 a: _% j9 ]# ~7 x
/* Initialize MCASP1 */
3 u( t. a: ~9 ]7 m8 _# h
mcasp = &MCASP_MODULE_1;
/ k, d# O. T0 U7 V& q( ?6 [$ Y
mcasp->regs->GBLCTL = 0; // Reset
( p- x1 l( p& v$ p5 f/ h8 Q/ F
mcasp->regs->RGBLCTL = 0; // Reset RX
+ V6 H& V, `# @3 Q7 C+ a
mcasp->regs->XGBLCTL = 0; // Reset TX
) `- V, T, Q# C5 R% c, u1 p- b
mcasp->regs->PWRDEMU = 1; // Free-running
/ E8 F7 y( L, I" V' C3 T B
// configure McASP0 receive registers
* A. m5 D# g% r* j$ f. R
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! ]: ~' s- G$ E! B
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 L+ _% R3 Y4 U% P0 J
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' Y7 `" Q+ A s6 l5 G ^3 i
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' [- X0 ? m4 o1 d4 S) V+ D' B8 z
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 C8 @( V0 R+ s3 T; Z1 S" Z
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
3 G! I$ K- T2 j4 P9 l$ E
mcasp->regs->RINTCTL = 0x00000000; // Not used
, }! Z( B' u$ x3 O8 J
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ `" ?: j; A/ L
6 D: H K7 ?: M. _- M0 U* s Z: l
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. N% Q& i! G+ N8 C# w/ k; c
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 S8 U9 |$ j5 j$ @1 N7 W# T/ E
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
. o$ c1 j# l& C+ t- w: N |
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 `$ }: K- E) U
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
& \7 _/ h1 y9 ?: Y4 \0 i5 ?
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
i9 `: U" H) p. S' B
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& F# ?% W5 `8 j7 Z0 u' y% `
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) k; j0 w- l6 C; W! D- z$ ~3 M
. ?, W% F8 K: t" @' D" T6 ] h
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
! `. L: W3 w3 B1 L/ e+ L; y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
$ [/ M' Y/ G v* Q4 Q
mcasp->regs->PFUNC = 0; // All MCASPs
2 ^: ^# ?! d7 r* X/ R; @
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: }3 R( |4 O" w; a
7 T. O- G b7 m
mcasp->regs->DITCTL = 0x00000000; // Not used
! h. Z# F! T d
mcasp->regs->DLBCTL = 0x00000000; // Not used
6 v/ S- W1 a4 Y
mcasp->regs->AMUTE = 0x00000000; // Not used
H0 t4 ^$ H% f& Z
: M! t8 s4 _9 Q; C9 i0 t
/* Starting sections of the McASP*/
, g) z1 d$ n8 x8 y) r: {
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 r6 @5 _" A4 u; z; M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
! Z7 l: b& X' x# E+ a% @, g4 z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 ?& d6 t$ r; H, N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* r3 h% B2 a; U! }3 |: Y1 o
- E, ^' o% T ] c3 p. |; ?0 x
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) F8 K9 r+ I& i& {' X. _, k0 l5 c3 x3 C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
+ w, K1 D2 l3 m% K
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' Z! F0 [: l! U+ z' K$ g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! O8 ^5 O9 e' I$ X7 a: {
S- u+ g5 |; |; {. F2 |, U
mcasp->regs->XSTAT = 0x0000ffff;
* Z, v# ^( }2 a! K) t9 b3 A
mcasp->regs->RSTAT = 0x0000ffff;
; x( p) {+ @6 L9 D% I
. R# c# U2 v5 d7 @- k# r
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& T5 e' [- \! R* \5 F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! ^' ^; ^. T" M6 n2 Q8 g
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
! T2 J# Z8 W' z0 U5 t& c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 K9 z# y/ c4 g
. [8 T% u: }! T1 B( S e
/* Write a 0, so that no underrun occurs after releasing the state machine */
, Q, T+ i7 D: P0 W, I/ A
mcasp->regs->XBUF5 = 0;
. y& v+ M" V8 K$ x
mcasp->regs->RBUF0 = 0;
' I6 `' @# i0 _- ?8 I% {& k
: L! ^& X& x; F' Y3 F
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
+ t# R$ M5 @' \ U- I* d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
2 T1 a5 y7 _' r7 i( `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, }+ p' f+ ]* u! s# r. [0 K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( N! c/ O' a. l& I" L; l) O
. a' N$ J/ m9 D5 F3 J
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
9 f/ V1 N* B v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) I! p4 s% k+ H F9 H+ x* L
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
& @4 g5 u; P% @' \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" ~0 {" d+ b, d
7 p/ b7 W2 e R2 s
CSR = 0x0000;
' z- `6 z- F$ J T E0 n
INTC_INTMUX1 = 0x3d;
% O/ k: n* |3 U
ISTP = (unsigned int)vectors;
! ^0 N! y* ]5 o$ h, _$ q4 ?
ICR = 0xFFF0;
+ D H+ }- E& d' E6 v8 \' q1 q
IER |= 0x12;
; U( `( i: R( K$ g9 J: m" K' l
CSR |= 0x01;
" N; A% B# c) e; s$ s9 E& K2 v
3 x! D c8 i E/ G
! Q# r9 x; x' H
! D! L g3 t/ x7 P0 [* X
还有就是两个输入输出函数:
. L& V, j, P5 P$ @. ]" @; d0 Y( x- q
void output_sample(Int32 out_data)
: r: L: u P, t1 h; G1 U- n
{
1 a- M, K# [1 }4 a
AIC31_data.uint = out_data;
4 p" O: b0 w, O$ _( @; k! ^. i# b
MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 G! j, b/ a. h6 E% g9 P
}
. K) h7 x3 `" b. q7 i
( n: A" |. d9 t" K7 \/ V
Int32 input_sample(void)
" N8 x3 f$ h" n* D5 c1 X
{
, d2 J8 Y* M7 K0 ?- M
AIC31_data.uint = MCASP1_RBUF0_32BIT;
! j( ~4 v& @: `$ G% A- J
return (AIC31_data.uint);
1 n5 X0 S& J' l# s# y; H. p8 n
}
* d6 [) x7 }$ x: s5 F6 Z
) ^6 \/ @2 X7 G- d" l5 v7 ]) v" q
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4