嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ N% x7 x* O4 n0 m% o
main文件:
0 C/ u: |! d X- x: n) N6 G' F. H
interrupt void interrupt4(void)
' |1 u* q$ w8 m' z. S
{
- c; @2 U% L: R% \; X7 G( S
Uint32 sample;
9 w2 t" @/ Y/ n
$ e2 U" @/ k/ |8 K. j
sample = input_sample(); // read L + R samples from ADC
3 k6 D" D. L; L) ]( d0 x. ^
output_sample(sample); // write L + R samples to DAC
8 k! p+ F( B! @7 X1 j
return;
9 q# d: S9 f) G! P( |& `0 K6 e
}
/ i% ]. L: P+ M: e
3 M" y. z4 U+ U# F: y) `9 S
int main( void )
6 j& D. X7 |! H0 C/ E C# y6 H
{
$ E) D$ u [6 L
6 L w6 ~$ k5 J1 V3 S
/* Initialize BSL */
3 u) `' S: ]5 y( I2 @
EVMC6747_init( );
" v' l5 s; o: \' ^
/* Call evmc6747_intr function */
( H [3 N( t, d; y1 m/ O
aic3106_init( );
8 t' d$ x$ S3 i
while(1);
/ Z( l m7 v9 W) V4 f' z, u
}
! n9 ?- R- [, G% G5 L
/ z: u2 j4 _6 l, ?, e( s
1 i+ L5 F" _' ]; H$ A
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 o8 H* s6 c1 {# t I* X
/* Initialize MCASP1 */
. C w7 x: g L) l: Y
mcasp = &MCASP_MODULE_1;
$ H5 q7 B7 w# \2 `5 F
mcasp->regs->GBLCTL = 0; // Reset
, {/ v7 o5 ~: J: a
mcasp->regs->RGBLCTL = 0; // Reset RX
0 J1 s v V% N3 u
mcasp->regs->XGBLCTL = 0; // Reset TX
+ q/ K) f9 M7 j
mcasp->regs->PWRDEMU = 1; // Free-running
" d" F7 _/ E+ v5 D, a
// configure McASP0 receive registers
/ T. q: {$ E7 M6 a: {0 X2 a3 K
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
; k# o j' C+ e: q0 r
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, }4 B7 X2 S7 z% k
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( r# z! _/ z/ O9 _ W0 C- q0 Q* s. k
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ N+ b0 a7 I! @3 G: `4 v, n' c
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
1 y4 ]: F2 i' ]
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 y" h! s! L, k) Z. L- h
mcasp->regs->RINTCTL = 0x00000000; // Not used
4 {9 ]3 s: N B9 ^
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 _4 q# d1 W2 h, I
8 x0 g- z1 v! w( w `
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ k3 g# h- @+ H
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: a+ `, b% C4 |6 S$ b
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 s% M: ?: o) {5 P B0 a
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& }+ j8 Q F" ?, M" P% B% y g
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 F8 U7 }3 r2 s' N3 |' k% `6 k
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ z: H; g# H* P/ R, r8 h+ H
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
5 `0 `' x4 {4 s# V* j. o6 X
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 h' A0 g6 Q% v# ^; M g3 y
9 t& W7 b4 ^# L7 F* e! n* y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
0 s9 K; Z" k* p+ x6 D
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
$ z: p. ?' A, N3 l. e$ E$ ^+ Z
mcasp->regs->PFUNC = 0; // All MCASPs
% j- c7 B$ G( U# U- D
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 l, k( @: |$ ~' j! ^- r- A
$ T# U! s Q8 C6 T$ m
mcasp->regs->DITCTL = 0x00000000; // Not used
; P1 a7 B( N3 U) s9 X. J9 t* P( t
mcasp->regs->DLBCTL = 0x00000000; // Not used
' J' |: A# D) s2 D0 O
mcasp->regs->AMUTE = 0x00000000; // Not used
5 D2 r: |* ]4 n7 b) S
0 F# i; w# O8 y1 F' x5 b
/* Starting sections of the McASP*/
\( l7 I! I c( z9 V: w
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
9 q- @% v6 u1 Q" n' C d. ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
+ B6 s. X# {; {' s. E/ d
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 s+ h4 ?5 d. v% W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
% T* |+ X; Q" Y. l( \4 S# _
0 j: W/ r; ], \; P3 _4 q1 k
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 ?1 [$ k9 j& ?/ z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% y9 z8 \0 a) H7 y' Y2 Q* }1 }
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
9 J$ y' V0 _) ^8 E7 m/ W: S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' R2 q% D5 q, f; A& @, l9 X- \
- ^! ~5 }+ m0 x+ B2 X) l$ M& Z# C3 q
mcasp->regs->XSTAT = 0x0000ffff;
% F3 k6 i) u, J
mcasp->regs->RSTAT = 0x0000ffff;
0 L# i" Y1 O- n8 M, m
' [' i/ Z- S3 D0 N6 a) V
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 G z A* E+ L A* v8 A, |" A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& c9 W9 s( r! R
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- g; ]% |& F; T6 J* F. L3 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( Q3 @. q5 z0 i+ n! g: S( N. t0 E
4 L, Y5 S& K0 c c
/* Write a 0, so that no underrun occurs after releasing the state machine */
: H: a- H5 q3 A# @4 |3 D! }2 }
mcasp->regs->XBUF5 = 0;
& b9 J# t8 u$ Y" l" a1 |* B
mcasp->regs->RBUF0 = 0;
6 I1 K. `0 Z; N1 U
2 _9 F, u ^, Q" h# G# E3 K, Z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& a+ a/ G4 f8 e% o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( e) B- N h6 d
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# Z$ l8 E9 z' |! L2 v3 x$ v2 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# A0 X T6 a V/ Z4 S4 _: u
% {. x2 Z, q* v/ A1 a
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; P$ e1 i- v/ h' J* j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 A! } F/ r+ ~" @
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 H2 b6 X3 Q k2 e* J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 S2 M- v' c+ C
/ ]5 @8 @5 V9 X2 v( G9 C
CSR = 0x0000;
- S3 Q$ z0 D; Z+ Z) r# w, Q
INTC_INTMUX1 = 0x3d;
" Y, g; L, h$ x- E! z1 z
ISTP = (unsigned int)vectors;
; n; s7 A" v$ m9 D- z
ICR = 0xFFF0;
2 K# w0 ~1 K' y6 b0 G
IER |= 0x12;
' y& \8 q6 H+ S8 V
CSR |= 0x01;
7 j0 j% B& T( K. ?
3 r7 M) W2 s1 Q |5 P! E
/ T3 h4 J/ G: |5 X: ]+ [) w+ S
; N, ]3 U* C5 V& V/ }0 a
还有就是两个输入输出函数:
+ G: y2 c- J& ^% t
void output_sample(Int32 out_data)
1 v/ @; ]. u. l) `& D
{
/ U2 P. P& {( P0 l$ ^ B
AIC31_data.uint = out_data;
4 K! i4 c* R9 q+ ^" x9 B
MCASP1_XBUF5_32BIT = AIC31_data.uint;
. J9 A! |% m+ D9 x4 y% z4 ?. E
}
7 E! {. e# r% I/ U
6 t& [4 q4 J; u) E% B
Int32 input_sample(void)
" j+ v, j* z; C x E2 f$ v
{
" }6 C U0 k. q% `6 `6 C
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ f! c& G& X! W: e+ w* b% ~, e
return (AIC31_data.uint);
$ C) ?( O! b( {" u5 V
}
/ |3 Y5 t* a0 _4 L
* h9 S" A: Y+ K
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4