嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, Y0 I1 @4 i8 x% J( D/ b2 u' q
main文件:
3 g ~ I% i# m$ Y% D6 r
interrupt void interrupt4(void)
' O6 Y3 v5 {& ]5 H' A
{
6 b. `: Z6 Z, w+ }/ J$ V7 B+ \
Uint32 sample;
# _+ J. [: ~) R3 D" Y, ~$ P1 `) t
( M, h8 X P7 r2 k1 D& u
sample = input_sample(); // read L + R samples from ADC
3 `; r: \5 n9 Q: a5 g7 y0 _
output_sample(sample); // write L + R samples to DAC
! [# o, y* H- Z8 { s( ?5 {
return;
: }' d& {) x) _6 t$ G
}
( w) T. o. e" D, S
: K7 J: f1 J# E- p$ N
int main( void )
3 Y- a2 N5 v; S4 q
{
0 \/ W2 e& W9 U* [1 u5 ^5 D, s/ f) Y
: r: C* L3 B8 Y5 `: S$ \6 I4 j: a
/* Initialize BSL */
T. G$ V) W+ V4 ]) t# C( a; t
EVMC6747_init( );
# s+ I8 S4 D9 `
/* Call evmc6747_intr function */
8 V ?6 h5 |) A! S4 ~ a& E& ^
aic3106_init( );
: [' a( t$ Z% x# f4 E( k W, \
while(1);
5 ~, V! v5 K& q
}
+ x+ r. p9 G7 R
- `, B, ?1 E( _+ Q
; m: C. l5 j. C' {: L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
2 r* o6 m" h: r( K
/* Initialize MCASP1 */
! g2 U- R8 J( b5 V* i4 a/ r, v; |
mcasp = &MCASP_MODULE_1;
$ Q, y' V1 G" x$ c' Q l1 H
mcasp->regs->GBLCTL = 0; // Reset
# P& r& W& s/ B' |- _( n( O
mcasp->regs->RGBLCTL = 0; // Reset RX
8 d# D E9 P% r% t9 C$ Z% k; y- p
mcasp->regs->XGBLCTL = 0; // Reset TX
7 c+ x$ o8 J3 ]( b, p
mcasp->regs->PWRDEMU = 1; // Free-running
' O' e2 A; ~; d+ y
// configure McASP0 receive registers
2 V% U1 F% Z% ~3 x2 E
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, j4 j( q4 H, L8 a S
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ d& S2 o% m4 C$ }
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" c+ `! I* Z; d( J; F
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 v& Y% ~+ `' k0 x$ C. R
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
T$ [& B. W* u$ T: s8 A
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ Y0 f1 m# H3 D5 d
mcasp->regs->RINTCTL = 0x00000000; // Not used
; J; \+ Q E3 _$ M5 B3 U! A
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 [$ p0 O5 @1 w! o
: C* J9 l0 Y5 J% y9 L1 N( |
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 W1 F/ c/ d5 {( q
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 ?; b$ Z$ g, w# N' J: L4 g8 U
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& o, w; n' ]: O
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 q6 M' v- Z5 m9 E' F a% D# B3 i
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
6 Y; X% c" r' n& Y, Z3 }7 ^. ?
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 X$ w# O0 W- j: b p2 |; k
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
# l3 |% t$ q6 j/ ]4 k
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( K" w$ o0 D: ^* d3 u
. a5 L. G; {9 w! n8 c5 k1 w
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
4 p$ I7 A6 @2 }3 h* o3 [
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
! p& @3 l& t' N7 q) m# T, G
mcasp->regs->PFUNC = 0; // All MCASPs
& n( A% l: ~: Q1 r4 t( O! N! P
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ V. ^) ^/ y) t! t; w$ N
+ H3 [& Q/ L, {* l2 M, J+ }
mcasp->regs->DITCTL = 0x00000000; // Not used
* p* R9 g) c* e: _
mcasp->regs->DLBCTL = 0x00000000; // Not used
F0 c f" Q& K+ \7 `* d$ c) K* i/ V
mcasp->regs->AMUTE = 0x00000000; // Not used
0 N, j& `9 v" e) G3 Y! F
3 A4 m ^& N$ w; W
/* Starting sections of the McASP*/
5 C/ w4 J' x x0 K
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: n% x' X7 W4 R6 @( X/ X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: V5 g) O7 z( O3 D+ e4 [7 Y
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, w {3 t% x& j- n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 Y# S1 C; I* I
: P1 M$ t+ n* y, V
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 F$ j: Y) K4 D8 R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; e& f( L( ~* q9 f+ W. e6 ^
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: m m1 m& j# A) i$ P: K* ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- `9 g6 H( Q& J; f1 a
# ~" |1 Q; h0 G+ C9 v1 p" H- }
mcasp->regs->XSTAT = 0x0000ffff;
2 n( D$ E0 t1 i; i
mcasp->regs->RSTAT = 0x0000ffff;
' T {, a& {4 V3 H% A
; c2 [; H% u( f2 b
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# t9 N. Z8 L) I2 \1 e9 n8 u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
6 V L9 p: ^$ O# B# W! ^8 I6 J
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ m8 }" v) \( I7 N. m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ F/ k5 ] Z* E
1 @& B1 D+ O9 ~5 Y* U$ \( w
/* Write a 0, so that no underrun occurs after releasing the state machine */
. i4 [9 Y( k2 ]3 f, L! V R7 w
mcasp->regs->XBUF5 = 0;
' v1 B8 M% r" P4 j h8 I, [5 c/ Z
mcasp->regs->RBUF0 = 0;
& c& j8 Z$ ?$ z% w
! \! T- |' h+ @ K& w
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 ~. D# k* j3 b3 ?5 U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% ]. V( |4 }; R$ H! `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 {" S6 Z( w- y7 V6 w" x1 e% p' y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 r" S& A8 j" g1 i7 ?
9 m. _: [# b" m+ V
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 E+ y" D& Q& C+ U; x2 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# e' b) C# p# d5 M7 \ s
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 v! a& C1 s% |7 R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 { s. a: s# v# T
8 x" {+ \2 \% I9 U- r; A
CSR = 0x0000;
, }5 Y: T% q C! G4 u9 A
INTC_INTMUX1 = 0x3d;
# y" r5 U( `# c0 l+ T: b7 @- }1 B# E; l
ISTP = (unsigned int)vectors;
' d& J. i8 H, y7 r& o
ICR = 0xFFF0;
8 F: V: d$ o* D- d0 B, `
IER |= 0x12;
# X5 Z/ e. o; u {8 b
CSR |= 0x01;
, w y; m, W* n6 t* h
0 R9 e; w7 r8 X( o2 }6 Q, @
" [/ `2 Y+ v$ N! r) w. |
' i W6 U r# @% t$ a F/ x1 h
还有就是两个输入输出函数:
! c5 }3 J5 J. n% G1 m4 l0 J, o
void output_sample(Int32 out_data)
1 u z" c; J- u9 L% O9 u7 a
{
7 L) J+ Z7 Q! |8 o6 ~) F1 b
AIC31_data.uint = out_data;
4 R8 K U% p! ~: t
MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 \. j8 R. W0 h- `0 _5 L) d, p7 c8 }
}
C o, f1 H* @- ~8 R8 T8 l5 N% { [
$ O9 H2 }! _7 B7 Z7 B' a% `" m
Int32 input_sample(void)
% ~6 S, ]7 Q% w( H- T, U
{
5 m5 Z$ G. `4 k1 m4 c" u* ^+ x7 E" E
AIC31_data.uint = MCASP1_RBUF0_32BIT;
- B3 U, b. J% i* d. d0 V' F& i
return (AIC31_data.uint);
8 F" ^7 ]+ M8 m" n
}
" `- [/ L+ A; y5 `0 ]
- ~" K h# V" L$ {. g" c* H
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4