嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 _" J' _& D% b8 X9 {
main文件:
* Q7 y# P7 @8 ?% e6 e6 c, t
interrupt void interrupt4(void)
8 N: n. g& p4 v
{
: y: V- E1 x% N/ @ M
Uint32 sample;
* M/ `5 a* M. c% h* }( U: ~
( l5 c" Z k; G- N
sample = input_sample(); // read L + R samples from ADC
1 ]' z& U+ `, b& |& ?6 y. S
output_sample(sample); // write L + R samples to DAC
1 u5 C H6 {' \& D9 d" f1 Q
return;
) @" i% L- e4 e6 r' {
}
, `) |8 o$ k6 [
2 {+ \) c& f _& s, I
int main( void )
5 L4 V0 q0 |/ X5 [: D5 S/ ]. I
{
7 z& G3 d6 l, m; y
) Z" l+ ^4 h: }( p( W
/* Initialize BSL */
Y% ]2 Z# X: J! Z2 a+ ?
EVMC6747_init( );
# I$ d! K. T$ K* ^
/* Call evmc6747_intr function */
, ?( @( W( V( N& S) C( a
aic3106_init( );
, S7 c, `2 R/ u: Q; l* B, k4 h5 W
while(1);
- q. S C- y7 a( `; B+ |
}
" K+ T# D b+ |/ x0 @! Y5 W# C: H
0 c" [" @; B* p+ f. ?
l7 e* y, \& |# l, H' O; G' r- D
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 \. w+ D) ?7 ]) G; |5 ]* v
/* Initialize MCASP1 */
% Q o& B) @4 r3 H( h' v+ @
mcasp = &MCASP_MODULE_1;
. A/ u5 { @; J* d# }5 Y+ j
mcasp->regs->GBLCTL = 0; // Reset
5 o4 a' g! u6 l8 C
mcasp->regs->RGBLCTL = 0; // Reset RX
6 @+ Z$ f* x) a" m' x
mcasp->regs->XGBLCTL = 0; // Reset TX
4 Y r( N2 g0 x- A& [( G' U4 f, Z5 W
mcasp->regs->PWRDEMU = 1; // Free-running
; @' l. U/ E1 G' z+ Z
// configure McASP0 receive registers
0 t( I$ q7 u' _$ O/ T
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% t5 z& }1 v0 d: S
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
C1 ` w& X% G+ }( }" @5 N5 }) p
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% G E/ C' G1 |; @( a! n$ o
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, m" L" w- a! t& R& Q5 g* t; M% y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 i5 W' ^7 o1 y7 V7 n
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
" `) g+ v+ c2 ^2 O, X3 U2 G" M' [
mcasp->regs->RINTCTL = 0x00000000; // Not used
7 u: c7 i3 i$ x9 Z' V9 ?- z7 m
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 P- S; o, C( ~$ L
$ v7 A0 O$ z' S/ a/ e# p
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( P/ D& s2 x+ S. e: z
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ O' C9 A w% D4 n7 X/ t; V
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& I' G/ q2 k2 w7 k1 a+ |' \
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
% m& U# i, C+ u% o" R' `( G. l" j" h
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
. P2 w- X% n+ M5 D$ [2 x! J9 U
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ V+ g0 b2 S w$ @! q0 U0 c8 `7 E
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' H6 u; y6 {, L" J( s
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 x" {# B' b8 [! R+ j
0 w6 A# [* \8 t
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
+ j1 |) w, \& U0 v: V
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% V2 N* m, j! D u2 X7 h( L/ ]/ ]
mcasp->regs->PFUNC = 0; // All MCASPs
2 Z$ M: N3 a6 y1 d6 ^: Q
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ X5 y1 V p8 e* x' N
) q6 |7 j2 l. U; D: Y% Q5 ?! Y0 \
mcasp->regs->DITCTL = 0x00000000; // Not used
" z; z6 T( }# q/ G1 h
mcasp->regs->DLBCTL = 0x00000000; // Not used
* i: I) |3 x, ?& h% H% b( {+ Q( W
mcasp->regs->AMUTE = 0x00000000; // Not used
- V' J0 i6 {5 `
2 v/ ]/ E# q {: V2 Q, r K" E
/* Starting sections of the McASP*/
! @# E6 A# `6 X( A2 o
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! n9 N, i, P8 k: a- A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 ` @: ^4 v; n
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( o/ `# p1 c8 j* n& }* L k) l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 ^* V' S$ q. X6 F# F7 |
) {1 \, W9 X5 d8 P1 ^$ w. E
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* O' W4 I4 @+ ~* I( ~) T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, I# g% {/ N2 g
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 b% s. J' z7 M3 N. @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
, f' M$ g5 C, Q; X: l
* l+ j3 A" f4 y
mcasp->regs->XSTAT = 0x0000ffff;
: ~& A* f: Z0 o4 Z% \7 |4 F) {6 a6 Y
mcasp->regs->RSTAT = 0x0000ffff;
0 `) L4 l; A6 r" w7 y V3 J3 F& Y& R
P! \1 [$ Z, T& n6 Z, j
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ ^# |2 ~0 t) A" D, Z: E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& n5 N7 B% @9 w/ s! k; M) k% m
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ P( Y- `% \& n f/ Y Z7 q, P5 D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) `7 V0 N9 `9 P3 [6 f
2 ]- A9 q) L }. h" \5 ^, J
/* Write a 0, so that no underrun occurs after releasing the state machine */
% t. Q( G) Q! o7 h" M3 b
mcasp->regs->XBUF5 = 0;
- ~2 }6 D6 H5 m
mcasp->regs->RBUF0 = 0;
( b) n' L- \( t
% F* f- a7 N3 @. X
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, ~9 V& q, W; U. v4 y9 r1 \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 X0 L1 m! o2 F& [- N& ^$ O6 [
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 P: g6 V* J$ X. Z9 ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ }1 N* Z# |4 Q% v' X) J# ^
, i% K+ v7 ?6 ?' D) z. g
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 {! w3 o3 I% n& o- ?6 A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' {: g U# M+ \2 n! M
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
- U( f J9 H5 S9 e8 ?7 c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ ]( n% z: ^" ^0 `+ J
, B) z( D$ \" Q# t
CSR = 0x0000;
1 x2 d/ u/ y6 i/ |2 E
INTC_INTMUX1 = 0x3d;
( \- w) y$ G9 C [; O4 _
ISTP = (unsigned int)vectors;
! u$ R4 ~/ V) u3 }1 |8 f
ICR = 0xFFF0;
9 A' Z5 c' N, i8 S% {7 u
IER |= 0x12;
" M" Q& a, U. c3 m" q
CSR |= 0x01;
; l" v; x- I# Q p
: c3 ~* n' n/ B* {; V9 p) Z, v
) v. a. R- \+ ^ v& y1 {( q
- }( }- V4 [% @' G
还有就是两个输入输出函数:
# f4 A4 _- k# m* @
void output_sample(Int32 out_data)
: h9 z3 b6 ^" Y9 j
{
+ T8 j& a+ w- ^5 ~4 {: k3 R
AIC31_data.uint = out_data;
+ b8 l! \5 O3 ]+ {( w
MCASP1_XBUF5_32BIT = AIC31_data.uint;
; B9 n+ R, F9 V: B h/ N I
}
; M8 x/ N* s+ y9 y% }# W$ Z
$ ^9 q; R. @" Z0 {+ j" [9 U
Int32 input_sample(void)
. D/ t' q6 S% g3 j3 M
{
1 P/ G! Z `! n- T3 ~5 n* I, f
AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 l' P" p8 n8 c6 r7 A* J
return (AIC31_data.uint);
1 }8 H& S8 ?- h) C0 b
}
" |' q% F7 q. O% D
! g& A& F4 \, o2 M. @. z: H) V- l
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4