嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 g2 m! U% t( K# n! C
main文件:
8 d( j/ w9 Y% y* T
interrupt void interrupt4(void)
8 `" O$ \9 P% o1 p: R
{
; U0 M, p* w5 J" f# U% n: B" D
Uint32 sample;
$ g/ k! L( i- B& B; c# r! ^% }
& F% _& W3 Z. D" @' d
sample = input_sample(); // read L + R samples from ADC
; ?7 G! x3 P4 J
output_sample(sample); // write L + R samples to DAC
: `8 d8 B; d' F
return;
) G& \9 t* I3 D5 y) }
}
' `: F3 p: V' A! S% e$ @$ ^9 h- v
' ]" M1 ?: s& P( s5 G/ ]8 C8 |
int main( void )
. t3 x3 ] w, p8 x
{
' `0 K5 W5 Q# o; f$ o" v9 ?
# j8 H7 R* l7 W: c- r! |
/* Initialize BSL */
( L e$ R$ t; W& p
EVMC6747_init( );
+ N3 Z% ]$ f% O, t* D
/* Call evmc6747_intr function */
. R# ?* Y5 D$ {$ |7 s3 A
aic3106_init( );
2 I+ t0 {* a h5 k; o% h( ]
while(1);
. }- w8 {5 ^. R+ T- b
}
3 n; F+ M- N) x1 I
( g& U9 y( s$ Q' S" ?! k- b) U0 ~
& a6 i% I& |) w& E8 u- ^
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 R- {0 s& K# r% F6 J
/* Initialize MCASP1 */
$ y7 U v. O/ b! o+ f
mcasp = &MCASP_MODULE_1;
- y% Y8 m3 T& I' l1 N: g7 X
mcasp->regs->GBLCTL = 0; // Reset
9 u) c: }0 R/ D5 K& r1 p) Y
mcasp->regs->RGBLCTL = 0; // Reset RX
$ G* \) i& Q( I t5 o
mcasp->regs->XGBLCTL = 0; // Reset TX
+ r0 S3 |1 G- r1 U! C4 i7 c
mcasp->regs->PWRDEMU = 1; // Free-running
6 A$ j" g* z r }
// configure McASP0 receive registers
2 \8 t( K* J, U, C0 `9 ^+ F
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! H! K( u' |5 n Y: {3 s
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 y- V) ?% H0 F y( j; Q
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
- O5 F9 J. U/ y2 U
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ J3 l/ W) }9 V3 K7 R' _: j# f
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
$ g4 I4 _8 i2 A5 q
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
s2 g6 E7 P! T* m: `# ]! x
mcasp->regs->RINTCTL = 0x00000000; // Not used
" ^% b/ B- I$ k& H( Q$ L
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& @, W3 ?. a% Q* c! c! x: v) x9 g
9 J) C4 |" q$ N( n S' P* a
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
4 l( V* ?: m% n& ^
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* G4 c( B6 D7 K- l+ F2 Z
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# s @3 @0 I& S1 {% G9 C% r" ]9 D7 s
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 ^. ?* k+ z% I8 V$ G. ?
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
y3 {" B# E/ {/ e/ D4 P7 W
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
% I* x3 i% m# p% l& Z! Y
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, `9 | P! J e2 g1 `* B; l* e
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. q6 e5 M6 e N- Z% o& M
" z1 p, _( T6 c- p/ \
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 [ @( b) u+ e4 h( e
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
) J/ J% l, X4 e6 W) j; \
mcasp->regs->PFUNC = 0; // All MCASPs
4 o6 a, @: H6 b" E' T/ w3 E
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
+ w$ D6 ?& K2 i) z2 g$ U7 C
1 J9 T: s6 S, l; C# S- i
mcasp->regs->DITCTL = 0x00000000; // Not used
9 }' \6 I7 J; I5 d3 c- Z
mcasp->regs->DLBCTL = 0x00000000; // Not used
* Y8 I: ]+ f% L. ^6 c! ^. B
mcasp->regs->AMUTE = 0x00000000; // Not used
7 z! F* [7 J+ @3 M0 J
) b' _2 j+ L: a
/* Starting sections of the McASP*/
1 l2 C7 B5 ?) H$ F: W+ i) O
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! m+ G% x8 L! u6 j' g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# A2 m) \: f% Y, ]# p: u/ V* n
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- u9 ^4 Z) d4 M' ?$ H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
J) ], S3 B$ q4 N/ n% r
( U; O. K9 ?/ J1 c4 C
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 x5 O7 p8 ?; V" T/ H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 @7 c4 @/ m* s
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
|8 ^' M0 A: w% T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
5 D6 D$ o4 }+ N1 L& d" o2 u3 l
5 N# @8 o. z: z& i' T2 G
mcasp->regs->XSTAT = 0x0000ffff;
, r3 F! A6 j4 t. [8 |
mcasp->regs->RSTAT = 0x0000ffff;
' Y6 C) R" T/ Z# y( `% a3 D
5 ]$ ^' b" v6 D" @" {" h9 F
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 E: q; y7 ^" |% w1 E% K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( j r' I' X- J4 m& }( q( R0 o9 X2 x
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 A! W" t2 D7 T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( Z. r) _2 H( R: n L$ v# W
9 P+ M8 g+ o; V3 I7 o2 H6 S
/* Write a 0, so that no underrun occurs after releasing the state machine */
" ?& b6 ?' a8 K8 l/ h. W
mcasp->regs->XBUF5 = 0;
, e o5 {0 d! ~+ Z- _
mcasp->regs->RBUF0 = 0;
& ~3 h' _: u( M6 C/ y: F
1 _4 U, D* r2 X% ?
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
_& x$ V; A6 y! X& M$ u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 K& X0 ?8 }* F8 b, f5 ^& ]
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 y0 s, m% O! Q, s+ l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, }" w+ B4 q% Y( l) U0 w
% u& q/ D6 M$ A; d9 j2 @
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- u* z$ A' O5 r; @! G, N% e! d% N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
9 P$ ]: c4 d1 a- _
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; P. I1 F: H: G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" N. s# z' e1 m
, r/ F7 R: J" P
CSR = 0x0000;
& n8 W2 {0 d$ t0 } K/ d
INTC_INTMUX1 = 0x3d;
- Q9 a6 X& p! I) M! a
ISTP = (unsigned int)vectors;
9 F& d2 w+ T+ z( Z1 C) k2 |
ICR = 0xFFF0;
, l# \ o* g2 F; r% B
IER |= 0x12;
( G9 ?9 Z! U# P& `$ G
CSR |= 0x01;
- e1 H3 o9 f4 j
8 Y( z( n" _ L% R* b/ G
/ d' D6 }: Y! k8 h( W5 J7 b- O
. a6 Q3 u l) I3 C3 t
还有就是两个输入输出函数:
; b% z& p( D. V+ X
void output_sample(Int32 out_data)
9 R" ^4 X+ C* p$ e: s6 S# P5 W
{
: g# n- E0 k% S3 @2 M [
AIC31_data.uint = out_data;
9 X) l( O( [; d4 c# y; f% J. b7 ^
MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 H3 [( M/ v4 |
}
( Z9 {9 a e5 L) h! ]
; \& }3 } ~9 r3 E
Int32 input_sample(void)
7 |( ~; d. [( E$ \. ?4 i' E
{
; v8 P( V& Q8 f5 U( o2 I0 c5 [
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ @- L: W; I# k2 r* u: g
return (AIC31_data.uint);
% A% M# _ k2 v& f, _
}
( i9 Z/ A9 x' E) a) {6 O }& L
, s/ u( P+ x5 {: S
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4