嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
k. K: _6 `3 y2 a }/ w _
main文件:
# }+ z0 Z. b { x: h" y
interrupt void interrupt4(void)
# \% ]1 \% Y4 A
{
2 N$ p2 R0 W( w4 z
Uint32 sample;
5 t- \! B) z* S( O
+ F( N( x# I C7 G9 N5 v
sample = input_sample(); // read L + R samples from ADC
* T5 @+ ^. b; S! G2 @
output_sample(sample); // write L + R samples to DAC
1 N0 o3 L& D& I2 O% u" {
return;
- k* B _7 {" f* n8 b0 B
}
2 ?& ^0 ~1 T u8 Y3 p
' \7 q6 d; ?/ c1 ~, ^
int main( void )
7 P8 V' H [$ ~* G1 F7 z# C0 @! N' A
{
: H9 W! }* O1 v/ ]5 C( t+ I1 y. T
, \' c& u3 ?- Y
/* Initialize BSL */
! n5 `4 C" n$ v( M* w/ N
EVMC6747_init( );
! z" g& K/ e9 J5 T6 y: O* J) J
/* Call evmc6747_intr function */
7 v. j0 H- Y! E' [: m! W
aic3106_init( );
# V, D) N+ S7 U6 x. |
while(1);
5 M7 D9 m. K: b" a
}
5 n0 S2 e, n% l
6 C. e) v. Y" i! ~- Q6 H: ?
; Y9 k' _1 a' Y5 a$ G% j7 o
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 n+ ?% r q$ c* J( {
/* Initialize MCASP1 */
" k! Z' r0 ?* a& x" P, a5 M7 ?8 G' ?
mcasp = &MCASP_MODULE_1;
) g e8 J: R1 Q: _4 i( ?
mcasp->regs->GBLCTL = 0; // Reset
! |, W+ P1 t) q# g/ T- {4 |& T, |8 D
mcasp->regs->RGBLCTL = 0; // Reset RX
* g% s. Z+ r K" o: H/ B. \
mcasp->regs->XGBLCTL = 0; // Reset TX
; g# d4 Z! w" ^2 x( P
mcasp->regs->PWRDEMU = 1; // Free-running
. o5 o, B) l2 |# _+ ]4 s% f
// configure McASP0 receive registers
H7 U) v0 f) y) s Y0 h
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
3 h$ @5 n0 H4 D% i, ~; W
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' E B7 C) o, U E
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
& P* T0 R! _- S5 P1 M2 Y+ c
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
M$ m7 R' o# U2 p, }8 c
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
) _& F v( l9 U( y
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
- K/ {& |7 c- z, g ]. o
mcasp->regs->RINTCTL = 0x00000000; // Not used
2 i9 f" W3 O, M! f* ?
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, k2 C0 r8 U1 i- H2 D
1 u/ @( p) i2 J Z* ^8 z, M
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ r. l* ^& @0 {. ]7 ~2 k, g3 C
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 X4 Y. }6 W$ \* O4 o
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# \) s. d/ [' M$ z5 B
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# r. k; R* q/ o
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- w' L0 X ~ f, L$ _% G
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; E& H, D _& ^; Y. l- T
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' q; b$ b# g* Z% [% V
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. _) y% | p) q) Y1 V# r2 c: s
5 S+ ~7 n' h# Y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
% @/ c1 Q O3 M( i
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
M9 ]. [, N1 O* @, X
mcasp->regs->PFUNC = 0; // All MCASPs
" n. |2 [& M& O- g4 q$ W* q @
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
4 v% K J5 r4 F
* u" C% e$ O/ j, T* C3 h% Z
mcasp->regs->DITCTL = 0x00000000; // Not used
# i6 @7 B% G. }( J3 M+ ]
mcasp->regs->DLBCTL = 0x00000000; // Not used
; W: i3 a, A# d* l6 L
mcasp->regs->AMUTE = 0x00000000; // Not used
- r1 O K5 t( Q
# n$ j" [4 k. r
/* Starting sections of the McASP*/
9 [$ o9 {, V- i
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. ?2 F, {7 T& P$ T3 A/ A9 R' c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ G- V) E' y0 ~- N2 O
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ Q6 W0 P- J9 n2 T3 H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- ^0 @3 \$ \5 R( g( M% n z$ x$ H8 F
\# `9 r: ~$ S0 E, G$ a8 K2 a* u
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; r- U; R' t/ @' k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* k% w7 \; L( Q. ~: S5 P6 {
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- Y+ A% j/ k* o) L: o+ `. Z% v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" Q* a% }6 o. l
8 c: l7 p3 w7 e. J z: j! }
mcasp->regs->XSTAT = 0x0000ffff;
; [& J. O! j, o2 ?5 [
mcasp->regs->RSTAT = 0x0000ffff;
0 }& X$ F/ n/ z6 B% D
( L, s* k( N q6 w' o7 D0 u6 U% ^
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
_' I8 H e/ C9 J6 f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 t) K E0 V; y8 [
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& C# L" U% e. H4 A# L' i( O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
8 H! l7 C3 I& t3 F
7 Z ]. `* k9 \ q; q1 l
/* Write a 0, so that no underrun occurs after releasing the state machine */
* V6 D) b& y5 l; h
mcasp->regs->XBUF5 = 0;
; _" ^* V4 \: n
mcasp->regs->RBUF0 = 0;
/ r% b' z+ p4 H' W3 p, `7 z3 a
! }* C( ^( K4 z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 G! ]* B0 Z- v+ ~8 u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* v4 f4 F% D. U% R9 F
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
8 S. {( ^/ B# R# m: W: L a& U) p, x, h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ d6 j; D3 U0 _2 q& Q
9 A) g8 B: m ]
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ Q! \- J7 [1 l& p f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 n6 `2 l) E+ Z/ ~( ]
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 _: l9 F8 S, Q3 Y' n- x$ F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( @1 z8 U$ m) U+ H
( S1 ]: S0 v( T' j/ d8 |7 ~2 k, p
CSR = 0x0000;
- E8 h7 f+ W3 `6 a
INTC_INTMUX1 = 0x3d;
) ?0 @) f5 D0 A3 X; k% u; w- f8 y
ISTP = (unsigned int)vectors;
' L* F) V! ~, V# U
ICR = 0xFFF0;
, o1 ]( A( g" W5 l
IER |= 0x12;
2 H' l7 a6 ~; |" R- u0 e& a
CSR |= 0x01;
/ r4 D9 V% f& }: w
8 t0 F+ m# s$ R
+ @) ^+ a# c: {2 R8 Q w
+ D" x& ]* w! \& r. @: c6 m
还有就是两个输入输出函数:
" S: y6 m# O. m" u
void output_sample(Int32 out_data)
- s N4 F$ _( Q! [. c
{
1 {6 ]! k7 F2 b; a* Q9 N
AIC31_data.uint = out_data;
9 b! I( _$ y" Q/ g
MCASP1_XBUF5_32BIT = AIC31_data.uint;
! @# I+ N8 ~8 `; h5 p* _0 Y
}
* q' g* [+ j; o8 C7 W9 l
1 Q* J" [* i- P; u4 j
Int32 input_sample(void)
6 Z; G% M0 Z4 X6 o2 d# R* V
{
; a* V3 n* s0 }
AIC31_data.uint = MCASP1_RBUF0_32BIT;
% |7 e4 h- X( S- t5 _% n
return (AIC31_data.uint);
2 i+ z. `/ s9 H6 X |% h; D( J
}
e2 | \+ O+ y" k9 I) q* T
N# O8 u( }. R$ D6 e9 g
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4