嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" ~% E/ Q. T5 d1 C2 _4 Y
main文件:
3 T! [3 T: d' M' {. _; h. J, c
interrupt void interrupt4(void)
4 k0 J% f3 u0 K" o: I. E8 Y
{
) q5 h2 N+ S% ]2 B. V
Uint32 sample;
/ u0 d+ m7 V3 ]5 {5 @; K6 o
3 K( r1 J0 Q l- n9 C
sample = input_sample(); // read L + R samples from ADC
1 l% \$ y; Y4 k- R8 T* q: i
output_sample(sample); // write L + R samples to DAC
; t# J* K3 ~. k( V& u; F
return;
# r8 H `& e+ x& N9 U
}
: ]3 ^! R# c4 p; }) A& _1 P- h
& u+ ?4 n5 T$ t% d9 f: v# R# }/ u
int main( void )
3 v! ?; |" I0 D0 @. [
{
* b2 g3 C3 E$ e- n
5 R( B' Y5 S# u; }) u/ |
/* Initialize BSL */
1 m+ V: O; X* e8 J- u P# X
EVMC6747_init( );
7 q( ~1 q' n7 c4 V3 W5 X
/* Call evmc6747_intr function */
% p6 Y* ~ Y- v
aic3106_init( );
# T9 d, Z% Q" B
while(1);
+ V F0 r+ P" l; D1 o
}
1 w j, E9 o$ X2 c$ t3 j' x
: F b E4 D& |
: W# {3 y' |3 T8 n1 e( h: R) ]5 {' K( y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* U) A' r+ G/ `/ y! A! ^
/* Initialize MCASP1 */
/ I8 F3 Y+ I% w7 w4 k3 z
mcasp = &MCASP_MODULE_1;
. u: e( \3 ?% U b& q
mcasp->regs->GBLCTL = 0; // Reset
5 H+ [: a4 o* v- |
mcasp->regs->RGBLCTL = 0; // Reset RX
. d% r3 w+ G+ d1 e8 R5 p
mcasp->regs->XGBLCTL = 0; // Reset TX
K0 r- `- X# `* z+ m0 y5 D
mcasp->regs->PWRDEMU = 1; // Free-running
! `) y9 w2 p9 `9 u
// configure McASP0 receive registers
* Z, a* R# B H+ |
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 q& [) w, @" a) ?' k2 N' {# g
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" G1 p8 W! f8 b |1 m7 ] K
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
M7 R- }+ w1 p( D$ [, ^
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
- S5 `* D% m7 l3 r! [: _7 v; S4 B3 A- Z
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
5 n/ O: a& u+ y
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
# o1 c. N6 C) H& ]7 [" F
mcasp->regs->RINTCTL = 0x00000000; // Not used
9 j2 G/ I6 F4 T( E( g% x, L
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ h2 B' r; y8 j# ]( D2 G
4 }; ~) l$ _ f7 p
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ |2 x9 _' `( G; e$ s
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. K, l# |5 H, T1 `/ N2 {+ q
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 x+ U- | W/ k- N4 m3 x+ ]
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
% i9 R8 R |* t
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
' Y8 r; H7 ~' }& D P& Y: ^
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
& o8 r1 r3 y; z& H& i; I
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
9 }( c) l6 E. e( j; H0 Q+ `% y9 Z
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* `+ Q; A+ s$ N5 L4 ^, r$ m. m6 y
/ {2 H2 L; z. D+ L( Q: E% Q
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
4 j# @2 b& U) F* @' u. ? b
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
b' _' w& h0 H6 M! ~
mcasp->regs->PFUNC = 0; // All MCASPs
# {6 L m/ R0 k, A Y3 \7 X3 l6 p
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( ~; N9 f! P5 a, P3 U; s! N
$ z A/ O5 v5 z! U" F
mcasp->regs->DITCTL = 0x00000000; // Not used
' @$ s3 ]3 K2 z/ d' w$ @ K
mcasp->regs->DLBCTL = 0x00000000; // Not used
S( [7 W' E, X; Y8 A
mcasp->regs->AMUTE = 0x00000000; // Not used
' M, F: k* F7 B- Q V, b6 C* Y) Y
% ]9 Z4 ^& F: q r
/* Starting sections of the McASP*/
- k+ D/ c; ~% R9 {
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" ]3 H- A* M% {/ C& B4 R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# P. ?; N# B9 m7 G' L
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ _, A3 U4 G8 H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 t( A+ I- ]( {* S/ c/ @9 j2 h
, `! \6 R9 J# } ?* A
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' N1 d" b$ Q8 O% m- Z2 d1 Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 @+ Y3 n3 z' T9 r$ n
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 s2 n+ ^6 J0 q5 m9 k! R$ I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 p2 R: a. B- d7 Z
7 r; B1 j$ a, e8 A
mcasp->regs->XSTAT = 0x0000ffff;
) w1 R; O5 J6 _. A# O# b O
mcasp->regs->RSTAT = 0x0000ffff;
* r6 Z# ]/ j$ Y9 P$ T
% H! d( V# n& Z. \3 s/ S& ?
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 R9 P3 g8 n+ E% N, {. \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( ?* E( n; D! X: r; O: A/ D+ L
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 x" e7 n5 v6 Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
8 z( {( @+ G4 K* _) i
$ I2 u; }" ]8 j# O
/* Write a 0, so that no underrun occurs after releasing the state machine */
5 J: B" l1 d+ N6 U( _$ Q! Z
mcasp->regs->XBUF5 = 0;
% e& c7 X5 P" L2 q7 I) ?" g
mcasp->regs->RBUF0 = 0;
/ h; @0 j) M r( W" L
; n$ O: k' b9 o5 C c; N8 k
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 y$ y6 l: K2 h% j& N: |( j; z' A5 e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! Y) j7 I8 E. u
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# j- a9 Q) S) h# \$ L R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
) Y$ h) G1 e* v9 b
+ L- |* c$ ?% ?. _! T% w$ J
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; n Y- ]% |; z0 M# ^& R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- N& z4 h- P0 c9 r. g3 e
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* k6 d3 L# [) M5 a$ ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: w& ]5 f0 v7 C( q0 a( Z$ C; r9 N5 _
" f1 g" E% w% B% b6 h
CSR = 0x0000;
& [! b% o8 z/ _( W2 o% o
INTC_INTMUX1 = 0x3d;
1 X' n4 }- m) c+ C# r
ISTP = (unsigned int)vectors;
3 t! H ~6 }. m: k! Q# c: \
ICR = 0xFFF0;
% o. _, s8 b& l7 k3 w# p
IER |= 0x12;
' {. o9 S0 U3 L- u
CSR |= 0x01;
3 \/ m e. N) K7 E8 u
+ ~5 p4 b5 U* O" D) M% C( A X
% f2 u+ `+ D. x. S
2 v" Z2 E5 J+ A) o
还有就是两个输入输出函数:
! H' X2 F: I* o4 `; n& [! a' b
void output_sample(Int32 out_data)
# ~9 N% d E3 a4 Y# W+ s/ a# y/ c+ d! t
{
4 ]: \( R$ N* E- B, U2 W& d! f
AIC31_data.uint = out_data;
6 [' }0 A* Q' T) q: i3 e
MCASP1_XBUF5_32BIT = AIC31_data.uint;
% S0 [6 I9 s0 s8 u3 ^
}
% m' V/ h2 K1 e" W. o7 u
2 P- l# E C O
Int32 input_sample(void)
0 a+ m: q. e9 Z
{
4 f! r, m$ Y% b* y- l! N
AIC31_data.uint = MCASP1_RBUF0_32BIT;
% }' r6 Z, R- `& G$ k9 G9 s/ J
return (AIC31_data.uint);
" a& l) D3 N f6 e9 q. V
}
7 a- `7 N% j. O a6 n) }; {, Y i
/ u& q! K7 B2 _) G+ Q( o& y6 f
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4