嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
' G6 f) T! @: x6 ~( q, j
main文件:
( W2 U! Y# ?0 d! J
interrupt void interrupt4(void)
% n/ ]" ~3 v( A. K8 {, m) C
{
5 F5 }' z4 U+ c% z5 I
Uint32 sample;
, d" i! r. T: e- W
3 [, e3 Q4 ?; N% j5 G
sample = input_sample(); // read L + R samples from ADC
, D" a \. U) k9 F1 @
output_sample(sample); // write L + R samples to DAC
0 ]* c7 I9 K3 K# e" c3 \, g
return;
% ^$ s. X8 _$ H8 h1 W! `0 R
}
' ^6 W6 J1 j8 ~8 S5 W
1 ~3 S9 a) k* k2 U* G
int main( void )
8 v# k7 Y3 B, D- N* S4 {0 p
{
0 _$ x7 ?3 ^, W$ b' n* N* ? e
2 o$ C( U, z$ H& B
/* Initialize BSL */
% [! ~& @% V* }# ^ e4 L
EVMC6747_init( );
6 s9 x$ n+ v3 m& x, l
/* Call evmc6747_intr function */
4 k+ P8 i, X* i1 J0 z
aic3106_init( );
8 G" O0 d3 V( X
while(1);
/ b( B6 x5 w5 Z
}
2 b; Q1 ?+ B7 S( q- H ` E
9 a! s* o; }' v' Q9 W6 {
2 @& c2 o- G) A# m) ~# \
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 D& a9 E2 q/ H" W3 R/ _4 |
/* Initialize MCASP1 */
2 W# r' y+ d1 X5 W0 Z' i# z1 {
mcasp = &MCASP_MODULE_1;
9 o9 v5 W& t6 E9 R) D" L
mcasp->regs->GBLCTL = 0; // Reset
+ V" P7 H5 C1 p' r& s
mcasp->regs->RGBLCTL = 0; // Reset RX
4 A! b: @8 B& g; }& u
mcasp->regs->XGBLCTL = 0; // Reset TX
* U! O) e0 S; l9 g/ ?# ^1 h0 Q
mcasp->regs->PWRDEMU = 1; // Free-running
! H( M8 W' {% k/ x7 q2 J0 {
// configure McASP0 receive registers
. |& y6 _" f M( k3 C
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
1 ]; _4 @) d, @' _
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' @( \2 P# v. w( U$ M, p( w$ W) Z
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
! i/ I- m. r I E' S/ e1 [
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 |+ `$ R4 v5 K& h, N
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
L& k0 `5 i5 e7 {. ^3 f
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 {: b( {/ J, j7 b& U$ W
mcasp->regs->RINTCTL = 0x00000000; // Not used
, a% [$ ?" _- }" M0 t0 l1 ] L
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 m' \1 U" R; H
2 ~& Z" ^" p2 l
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# D9 ?" P% g7 M, H
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ u: V9 l) X, T! x* X
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- g* l9 t- {3 ]3 B, D, a, N
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 [. ]" ?" k5 b, J3 d+ D s
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
1 o( k8 V3 k' l4 B# T, n1 U
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
0 H2 ?3 T; q7 j" U+ e
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
9 V' M- m: G* ^/ K, W6 b% j
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 y2 I) G4 J+ k' Y D* ?" p
8 E" t4 g5 K+ _# ?/ O( ]
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) Y/ w/ {1 m/ j' h) B" P0 v5 \
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
- w. B$ h. U7 g2 w# Z# k6 F) Y. Y
mcasp->regs->PFUNC = 0; // All MCASPs
1 n; a' X; u$ B0 L+ ^" y7 V7 w6 ] }
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 X4 O; m! U5 T( V9 H& u! n8 v
- [! i) [: m0 o" F
mcasp->regs->DITCTL = 0x00000000; // Not used
4 r( v$ |$ p7 y- G
mcasp->regs->DLBCTL = 0x00000000; // Not used
! a5 K( G9 l. `% D
mcasp->regs->AMUTE = 0x00000000; // Not used
0 p$ n: _+ W& Y' W
9 d( r0 [' \# ` W# q: c$ _! A
/* Starting sections of the McASP*/
! j1 y& Y" w7 ~" ^) v3 e9 J: E# a
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ d& `, w0 p# H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 F F5 a: R0 z7 V# e+ {
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 p4 e$ C# B7 p: U, m/ p- [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! S/ u, y `5 b. q
6 l P' `1 ?! o
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( B2 l0 U. G: I( K) p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" Z. b6 b7 ~( h; L+ g# z6 W
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ A% O# t# L9 ]' P/ L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* }# \. @" I! ?7 f* ]) F
5 s9 m' M; V, @& {. }; H- i3 W; B
mcasp->regs->XSTAT = 0x0000ffff;
) P$ ?8 v: A1 W, }. X3 T
mcasp->regs->RSTAT = 0x0000ffff;
# |3 |) e: d- I2 n
! P5 ]0 q! i; E1 t, E$ q
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 {2 f& j3 x* [- r* v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 i% o% w) c& M/ W# L
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# {3 T% Z' o1 q5 L# _% C! I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
/ m# h; ^* S2 |" h, ^4 P
0 K* T8 }% s `8 _1 |
/* Write a 0, so that no underrun occurs after releasing the state machine */
: @& Q# ^ n. ~ @* ]+ Y% }
mcasp->regs->XBUF5 = 0;
2 \6 D2 e! Z3 Z' P" v2 A
mcasp->regs->RBUF0 = 0;
1 Z4 r( H2 Z7 O! `4 d
: F) q7 B4 m; ]3 O5 K2 \8 O9 U* |) ?
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& ]! B" j+ Z3 e6 J- g6 n0 L/ g" c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
M! \: Y0 {0 Z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 @; R7 T, U: L1 ]& g# k' R$ c9 `5 `7 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 d6 v- t; X$ z; N6 `( W
( N3 T3 R1 F6 D0 M) D
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 u- z* V0 @ d, ~) P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ @& L ~; R7 u7 h U8 k
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 m) r' j8 x* z- F s' ^- m! b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* |" [6 b- f/ \5 F
6 L; j: k% ]4 ?; m1 o2 z
CSR = 0x0000;
/ X7 [9 u7 S. W, v8 P
INTC_INTMUX1 = 0x3d;
( ]8 h* o8 }/ y/ O
ISTP = (unsigned int)vectors;
! {* K t. r0 `2 Q/ g# P
ICR = 0xFFF0;
3 ?( b% j& F! Z8 m6 p
IER |= 0x12;
4 h. i+ F$ Q: l% ]8 n
CSR |= 0x01;
8 J7 Z0 x7 g9 @2 g9 `: U
1 k+ ?# T; ]# Z
. X0 E( a, k6 q" V9 w# z9 [4 l
6 S) e0 A6 x0 ?
还有就是两个输入输出函数:
. V/ S* n2 p! _
void output_sample(Int32 out_data)
# l& F: |+ t; u
{
0 T% b( m9 ?- D5 K @: i V
AIC31_data.uint = out_data;
; [6 P% z* X9 U% O
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# V g# K4 W+ W% p/ z0 b1 u# L
}
V4 p/ u% L! i( \& T, j
' {' }( p$ c* |5 R" h/ d" w: b
Int32 input_sample(void)
7 G! V) m- |( C ~4 n4 M
{
. ^7 g7 s1 s' R# }3 r7 e
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; p4 g' w4 Z/ T0 i7 w
return (AIC31_data.uint);
* S9 D$ ]6 M0 z- V& q
}
! Z) }, ~5 q. x4 R
' I+ S5 I% y" H A
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4