嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 ?0 w3 v8 F6 ~4 D
main文件:
4 n2 M# l: V' E2 f6 s3 ]1 \" P8 A
interrupt void interrupt4(void)
! i4 ?" Y6 |2 R( g5 V& l2 E
{
4 t/ d5 s D7 }' T/ i
Uint32 sample;
4 j# n2 ~+ H$ N$ {) y
' x* t/ ?! b A6 g+ V7 H$ ?7 n8 K
sample = input_sample(); // read L + R samples from ADC
, l+ X Y( n! J! Q# T2 ~
output_sample(sample); // write L + R samples to DAC
`4 z9 x0 F! K3 v @
return;
/ n7 E$ ?* T B! P* [$ G9 Y# `) T1 S
}
2 H9 {" S3 q! Q% n" z$ |
5 V, b# ]2 K; S
int main( void )
+ {( f7 \+ `. K0 r% R
{
2 O- o0 s9 L+ P4 k4 R
! o/ g; j) {" d8 K( I w4 D
/* Initialize BSL */
# a0 X* Q$ T, `8 f
EVMC6747_init( );
6 Z5 p+ _( U6 ~( ^+ ~) g% s0 k' E, O
/* Call evmc6747_intr function */
4 n/ X- G% J' x& s, i
aic3106_init( );
: c1 @+ f' d' d& l7 u5 Z& _& w
while(1);
$ v+ y' Z1 d' x
}
$ E5 d& s& Q4 R
! Q$ D4 ^$ J3 U- M$ ^4 D7 u
3 c7 F% K- J z2 i+ m
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 H. g: x6 U0 t Y2 Z
/* Initialize MCASP1 */
9 K5 Z1 J# n5 x6 m3 R( L J
mcasp = &MCASP_MODULE_1;
, Q2 A- u6 T3 ^' Y$ \+ z+ B7 d1 Z
mcasp->regs->GBLCTL = 0; // Reset
0 { }/ E; u4 L$ i9 U
mcasp->regs->RGBLCTL = 0; // Reset RX
$ M$ @, n5 p0 w3 e5 V9 D+ ^! K& F. [
mcasp->regs->XGBLCTL = 0; // Reset TX
/ S4 ?% l: P% y9 l
mcasp->regs->PWRDEMU = 1; // Free-running
) c" t8 P; ?/ E
// configure McASP0 receive registers
C1 h' q3 M5 z& R! J
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! ^4 `6 H' g- V6 a1 J( |
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 B- b# G$ g$ m4 V& `; e
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ E0 Q$ W/ Q/ W. Z. } _5 A4 E
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
' D7 G' W% e" _3 @
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
3 ~( }' A, h J5 t1 ~
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
5 J; r$ ^' t: `! U ^; |4 {2 E1 }
mcasp->regs->RINTCTL = 0x00000000; // Not used
( O+ v" ^9 l5 r: R: q
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. w. h( o! v- y& _
1 x1 q0 K. z+ g' c! [' s+ I) e4 X' `
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( a1 {1 }: g) b- ~: z3 w8 Z7 n
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- ]& C% O7 d$ t, x
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- U# [$ v/ R. P/ n' |
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ m }% t8 z( s' F- N& r3 X! Y
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
9 P7 j2 r1 X5 W9 m0 {& H
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
s9 p+ x! r& d) [5 N) a( L
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
& Q+ ]" x; q1 J/ v
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 N9 R" v/ P5 ~5 U: {
" \, {1 h% O/ T7 @9 c' s
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: t! f6 k f, O5 g# a* g) Y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% t+ m( `+ M s. F6 W L
mcasp->regs->PFUNC = 0; // All MCASPs
/ `# }, q7 H$ F, k0 O
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
K7 j- L& b9 |8 y
$ r# d8 g& D2 k* y4 [, m; a1 m
mcasp->regs->DITCTL = 0x00000000; // Not used
5 x, I) A# s5 m" I2 h H
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ U$ }8 s8 A! r# A: _
mcasp->regs->AMUTE = 0x00000000; // Not used
! T8 I& H+ g6 F" o1 R1 M8 ]
0 I8 G" T+ o3 R$ J, F
/* Starting sections of the McASP*/
- S+ \5 F q! @6 F0 ?! t$ g
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) @2 }" O( E0 l* d' ], @' `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
4 F/ Z1 o8 c9 k: o
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 ^& y) R3 S# F* p0 `4 t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
. Q4 o1 D4 i/ R" J
+ M7 T u) s0 ~! k' q
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% a/ {4 A7 s5 D3 Z0 A( |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& L8 \3 I$ S" @: j. U
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- K' R! e5 h/ L# h4 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! {& F9 h' z2 O
% l/ Y4 J [- a6 N% J, e P
mcasp->regs->XSTAT = 0x0000ffff;
7 r. |0 h1 f5 X7 A) c
mcasp->regs->RSTAT = 0x0000ffff;
2 S ~9 W6 ?3 l! H! w8 m& y" \7 @
5 Q# V ]6 o5 V) Z6 ^9 T$ G
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 ^. Z- F( R$ f" T. D* Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ n8 b( o0 S# s5 P
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" j& A; U; I- [+ A# r3 v5 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
" H, E9 B7 ^$ ^8 |, C% n5 C% B
; c6 Z9 [& H- s1 w' z# @
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ _( K) G5 f7 \. @
mcasp->regs->XBUF5 = 0;
8 M$ u% m- }' X2 k3 x) N k
mcasp->regs->RBUF0 = 0;
, s9 o) U. @7 X5 T
5 l% ]% d- B5 E
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 G( u% x" O+ y, O" f" W- |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! ]: K5 y+ R$ N$ m3 Z1 H& }# ^" c
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' ?- e* x1 M% E- P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
{# ^' v0 h) V6 \
& Z2 e8 V# ~0 [( a* p1 K2 |* p
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ \* P I6 X' [/ |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' y* G+ N1 Z1 X* `
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ E y2 o |$ s7 o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ i6 N; s) ?, B7 d) [
, Z3 ]) e& t# E' u
CSR = 0x0000;
8 L7 `/ M+ w5 q7 @6 t* j
INTC_INTMUX1 = 0x3d;
# A) h2 r8 G* ]
ISTP = (unsigned int)vectors;
% X( }& b, C N0 y" y+ H. g
ICR = 0xFFF0;
9 O: e/ e& c$ j f( I0 O8 A4 ~
IER |= 0x12;
# f( R" E4 p" o. Z) c! _
CSR |= 0x01;
( ?5 k1 x5 c8 ^
" T1 i. G$ J+ D t3 F3 Q$ \8 Q+ c
. a( L. f1 R$ ^
4 G. T/ Y6 ?$ ~* Z, e/ C) }
还有就是两个输入输出函数:
5 [5 p& @% A d/ o, f; U; [
void output_sample(Int32 out_data)
, H6 }. k/ V$ m! n1 x
{
( j. O& I2 w2 {- \& Y( Q5 \2 c: c
AIC31_data.uint = out_data;
?; ?+ R4 w0 L
MCASP1_XBUF5_32BIT = AIC31_data.uint;
. J$ z( @2 T( ~( o4 P
}
9 I2 K: v. ~7 Y& E% |
1 K, v" I Y/ _* ?# M' ?. S
Int32 input_sample(void)
0 h1 @- y8 P, O g6 c; v
{
; e* W" a: g0 k2 D/ k
AIC31_data.uint = MCASP1_RBUF0_32BIT;
- ?& y. K- h" l
return (AIC31_data.uint);
5 p3 ~ j/ O# d& T: j- U
}
& R0 s! d* z- U2 s8 p9 ~
+ f6 Z9 W; n, e; h+ L& ^& @
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4