嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# S. z( @$ M2 ?7 b, @
main文件:
; C4 I# k, b x q8 G' [& B
interrupt void interrupt4(void)
, H- Q" ~6 V" `; o0 R
{
, B. ~# n4 a I) C
Uint32 sample;
/ ?7 k+ G6 ^/ i7 U& m4 M+ ?
! c& V& e8 T$ m; q
sample = input_sample(); // read L + R samples from ADC
: j- V, Y! T* T3 I9 P" F
output_sample(sample); // write L + R samples to DAC
) F9 r, X9 x8 i
return;
4 `- o8 _' {& t( t7 l% u7 ?
}
' i2 j$ j9 l# S4 q4 A8 ^9 I
* D: d' r- h d5 O( L: E% N9 }; H' K
int main( void )
- x# @( H }: m. z0 A& ~( v( M
{
. h; \! N" |0 f3 q
" Q: I( E( T9 [! s" ^; \
/* Initialize BSL */
: j" J! |. q3 Y' f% R! h7 |
EVMC6747_init( );
2 V3 m& {! a* _5 Q- W) d
/* Call evmc6747_intr function */
2 r' H9 S. `5 E9 i- B! \3 _
aic3106_init( );
3 s: m1 l7 i: Q7 o- F! v
while(1);
( I4 X/ q# |; i- O( i, V4 O& \
}
) }- F; J* g9 T- ]
4 G- ~8 R/ }" V/ C
* D' J+ J a* W" ~* O9 p5 @) {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; w' \. Y' d4 d$ r$ U$ d
/* Initialize MCASP1 */
/ g0 ?2 S* N% V' U. a6 ]8 E& x9 _
mcasp = &MCASP_MODULE_1;
8 L7 H5 R' G# n
mcasp->regs->GBLCTL = 0; // Reset
! x) u7 A; [+ D8 N# E2 r2 [
mcasp->regs->RGBLCTL = 0; // Reset RX
. t2 p5 v2 T4 t' S, b* A2 i2 S8 E4 j
mcasp->regs->XGBLCTL = 0; // Reset TX
4 O1 G0 }) i* X- j, ^6 f; i
mcasp->regs->PWRDEMU = 1; // Free-running
}& }1 g' l- d1 J; _
// configure McASP0 receive registers
6 o# Y0 T% P( m5 O& D* o
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
@, C$ e. Z6 w8 ~
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 m1 N* R) d* c B, f# x
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
. S, J: s5 i. e
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, Z+ N" z0 d v. a* B# i
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
6 |; \/ e* `* [* c
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
* S5 | K% ]# e2 @
mcasp->regs->RINTCTL = 0x00000000; // Not used
0 \0 B* y2 ]6 W7 p3 m S; A! K; M
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 ~" ]8 S4 Y, m/ K0 K. T
- G& u. a& Z( T8 I3 V
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
% }/ f- Y" `0 D( X/ y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% o8 b( Q' F: S: u2 H; P
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
! V6 {' i* Y8 T( k m1 f- E6 p
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 j2 u: `6 v+ Q1 M: D' V$ o" y2 @
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
7 V1 W' ^2 D4 m9 A* F; G' {& i0 W5 V
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 c0 y% Z5 n3 u' v& W
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
+ m' t: Y% |* J; K& c
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* X0 `" f. ~# F7 S
9 J& P7 ~7 }' {
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
" z, w. X" D% i; p' W1 p2 @# [3 i: i
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
- |- ?6 ?$ m3 l$ b) X0 y8 a
mcasp->regs->PFUNC = 0; // All MCASPs
k9 G7 w5 d' ]( k) d9 X& Z
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ Q$ T% N ^3 M, V
5 m+ b8 `/ L& t: |* C5 d% ]
mcasp->regs->DITCTL = 0x00000000; // Not used
2 l( b8 F7 }3 i% {" e
mcasp->regs->DLBCTL = 0x00000000; // Not used
1 u! S4 H7 F% ?4 U# d! b
mcasp->regs->AMUTE = 0x00000000; // Not used
3 N2 h0 w: K3 ^6 g( z
$ q8 z7 X0 w. M- y8 F3 t# I
/* Starting sections of the McASP*/
v9 M' q. f: _7 i
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' ?+ |4 |& N/ X1 ~0 V1 I, v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ |$ @* R* X5 m* M2 \( ~2 w6 O/ [
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* ?7 f* A1 H, z" e' ^$ i% A6 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 i5 R& g4 ?3 u2 s/ y2 A g0 h
4 f/ k) G( w. @
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# c9 f! y {4 t s# l7 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
# `: S ~/ }$ A! F( b9 \$ j
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% Y7 [/ {$ H# i2 h( I, i' l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 k# f0 P9 G( q. Y2 u5 z5 ?
" {' x. o2 x1 ]8 a
mcasp->regs->XSTAT = 0x0000ffff;
7 o7 \% S g& `* Y; _' a7 \8 n
mcasp->regs->RSTAT = 0x0000ffff;
! k3 V$ q& O% Z% h& p6 y
0 m/ l( g' e$ v; k- h- y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
) d {# k; i/ p2 V$ g( g) X) X5 j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ H- z! U- L5 B& `6 g) X% D5 n
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; p4 F0 n* j5 m2 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) o3 G) \( l( U( \3 L* }" t' k
0 u( X# G% v5 d Q9 J
/* Write a 0, so that no underrun occurs after releasing the state machine */
/ \8 i. a# Q0 E/ b7 ?2 y/ k
mcasp->regs->XBUF5 = 0;
/ s; ?* S5 w' w& o1 H* q; I
mcasp->regs->RBUF0 = 0;
3 _/ \0 \* K& u& ^0 N, f
% w* `8 F2 R2 o, N4 b
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 t4 k1 u+ ?& D q# @- \% a4 K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" }' @! e8 ^9 a; j; ]! x0 x9 c
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, _7 [! O0 j! I. e2 ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
6 J. E2 F0 A& j) ^5 W7 q$ \
/ f$ z) n8 p( w& ~% \1 \) J
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 b$ ]% u8 v6 u `+ u8 d* L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. a5 p Q9 k! \7 G# }1 [
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 L6 _3 ]- c+ I9 d- h! ]0 G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, Z7 G+ _" F' v2 W! k
6 W. }' W; P i' Y; S0 }
CSR = 0x0000;
" y! {+ {8 e" j
INTC_INTMUX1 = 0x3d;
! c2 \8 Y, J4 u2 z" a( m/ a
ISTP = (unsigned int)vectors;
5 }1 n, w% C. k+ H6 F) L
ICR = 0xFFF0;
8 h" X- Z0 f0 J p' d+ c) a8 D, D
IER |= 0x12;
0 [( A) S$ E+ N, h
CSR |= 0x01;
2 @. w, f- P, H: W3 y
7 s0 r: f. F: b4 u
! m% v' J! B% i9 T9 r
/ O/ y$ d- h, U2 e
还有就是两个输入输出函数:
6 g4 \* Z6 v8 M$ @7 `
void output_sample(Int32 out_data)
" F5 z! x6 |7 R; [0 g( P4 `
{
6 B; E1 Y$ L/ x
AIC31_data.uint = out_data;
0 A; ]/ b: l" b4 g. w; |
MCASP1_XBUF5_32BIT = AIC31_data.uint;
. `, x9 h: a% N
}
$ x! u& n" o$ E( S
. J3 @1 m, \/ ]2 w7 p
Int32 input_sample(void)
7 ?" l! P6 X$ W+ j% n' z
{
) r( k( W5 b& ^/ z/ @; |/ o& P
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ `; [- L7 [/ A
return (AIC31_data.uint);
/ T/ R6 E& I. T! k; E( K
}
8 m$ h' k& f1 B S4 `. X
4 _0 N m2 A! A/ B
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4