嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! A4 d2 O1 b" R
main文件:
3 M( {1 r2 q2 E! T3 @ g
interrupt void interrupt4(void)
# B$ [- ]9 ^" D* }( i) ^2 \! }) j& Y
{
9 I' j. `+ r! @0 a/ w; }
Uint32 sample;
) z" H5 O: r$ L: _8 h4 o
9 g, A% [; b, I$ x
sample = input_sample(); // read L + R samples from ADC
9 B! k; r+ [- X, P9 y% g
output_sample(sample); // write L + R samples to DAC
8 ~* A! y* a- _2 {, z
return;
7 K3 D8 q: a# j) M
}
) P, r& l5 ^& t) J: w
. O8 K ]6 i, P: N5 h0 _
int main( void )
- Y+ O) W: m$ Q2 C0 R. O, m' I
{
/ z+ v! P0 e1 N
. H4 \ l% h; e: H9 W
/* Initialize BSL */
4 d4 K9 n0 P v9 }- `6 V& `
EVMC6747_init( );
+ m/ I! B$ F( [ w" [
/* Call evmc6747_intr function */
6 ^0 x9 n- V) M
aic3106_init( );
, i0 r0 Q5 J( t0 \1 V" p
while(1);
9 Q" i! x1 f( o+ E6 g) w, R
}
& B* g/ x; m9 y+ w
" T$ I' X, H( }+ V
2 O" }+ S, J$ P6 g3 v4 N) t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) @; O* h; s" Q3 i9 _; @( P
/* Initialize MCASP1 */
0 F2 i; u- i: `" a% b* Y
mcasp = &MCASP_MODULE_1;
2 J$ z3 H+ U- x. L7 }7 V8 ^5 z
mcasp->regs->GBLCTL = 0; // Reset
4 [2 n) [8 \3 K1 [7 L0 f! B
mcasp->regs->RGBLCTL = 0; // Reset RX
1 F1 i& t1 j" p& D
mcasp->regs->XGBLCTL = 0; // Reset TX
. f, j/ i; V: T5 n6 Y
mcasp->regs->PWRDEMU = 1; // Free-running
1 C7 ^' R7 h+ p; Q% e
// configure McASP0 receive registers
/ X, U) h/ d6 H0 d- u1 |
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
2 P) I) Y- P' ^- n3 {
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
# L6 X m/ ?! L+ z! K
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* Q8 d% M) Z% c% n
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 E* x% x2 d8 `9 G
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; T6 \% w6 h& L8 Z7 e' V4 O
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 X# ]' L% U% {& r( d( g, g
mcasp->regs->RINTCTL = 0x00000000; // Not used
# L* K' r' p- t# t% b8 t1 @
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 L# ^: j0 L E3 P! B
& `0 t# E3 k0 N+ d4 c: \% k9 F
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
! W Y/ T; ]! ^, u1 I6 U; U8 Q
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; Q1 i! Y! J2 k4 ]* K6 P( L
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 J* k, z+ [4 n
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 E. t. Q+ z/ M7 ?% {
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
9 @. P3 P4 y6 ~& |* U' w
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) t: [2 O7 U) j, e6 V6 j
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- F6 x/ q( i, T2 N* c
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ @$ ^0 O. h( Z( V s1 x7 ~: r' g# v
# q: m9 ~( U- b6 O
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
+ ^" k" B9 T* E' l- D9 h/ x, o: y/ m
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
# [7 w$ p3 P7 G& |2 H& [
mcasp->regs->PFUNC = 0; // All MCASPs
5 a1 o! p* M6 d: n1 f
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& d0 o/ H# _/ B2 o" V+ S
9 ]; J: E0 o" E7 L& m: l
mcasp->regs->DITCTL = 0x00000000; // Not used
b l3 Q% e0 E, U1 a
mcasp->regs->DLBCTL = 0x00000000; // Not used
* K0 W1 Z5 W3 g- G5 Z+ ]
mcasp->regs->AMUTE = 0x00000000; // Not used
2 X4 J4 d6 g4 B2 ^% S- C% L+ w
4 b+ U! l: @2 M5 W
/* Starting sections of the McASP*/
7 B, u- [* d7 q# i7 [, U$ ^
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% X; z- y9 H, ]' d. }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
Z2 h' _6 J. n0 ]9 b0 ]
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, ]! O" o3 Q0 g9 R; p7 w1 T& b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, R! s; a% s/ t7 P" y
5 T. G( `# I1 u) h* f% `2 d
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' P( G( U4 Z( p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 N2 T. a9 ]9 b( Z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* U0 x }! O' q q' p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( d* t# o- \5 h: Y8 s& P4 O0 J
9 L& L4 A0 |. H% ?) N3 y
mcasp->regs->XSTAT = 0x0000ffff;
, g/ J2 W- k! @% I& G
mcasp->regs->RSTAT = 0x0000ffff;
/ n9 n; i4 E6 z3 ^1 O* d' S8 E
O3 v9 K9 v& C$ w
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
: A4 J" j! K0 |* |" |& W1 c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# S. F7 g. ]$ ?% k; T
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- G( A- E$ @3 l+ i& q V# W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 M" A, C( K# v6 X, o
' d6 w4 n: {% ~# W+ ?* C" W
/* Write a 0, so that no underrun occurs after releasing the state machine */
, B/ L& G, c- k: r
mcasp->regs->XBUF5 = 0;
* e+ c* y) P S3 o* {6 K
mcasp->regs->RBUF0 = 0;
( N0 c7 @ o P5 e: V+ b
5 _, G+ @ C% L( r7 K; f; s- \
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 H% s3 y7 G& q0 D, ?$ o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
/ A) F t+ ]9 t" G
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: |, t) p V- N- j9 H- x ?2 c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 \) f; L9 y6 i) R" `- [; u/ ]3 S
- ^2 G1 X& S$ R0 E
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( r$ H% T9 {$ b' ?$ s$ U6 m0 k) n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# t# C4 P6 o+ B4 p) x: _. o) O
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ H9 B- e, [% V$ o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! e* t! v1 R7 b3 v5 U
: P1 w$ C! Q6 P3 @1 ^
CSR = 0x0000;
8 ?4 r4 N6 O e. M0 `& N. i3 P$ X+ v
INTC_INTMUX1 = 0x3d;
1 \) ?3 f8 r9 E) |! h* G+ l7 N
ISTP = (unsigned int)vectors;
- d( ` b$ Z7 z, h
ICR = 0xFFF0;
& F2 z+ u S" o0 M. w
IER |= 0x12;
- o, j" h" {. p( S8 c
CSR |= 0x01;
@, y6 j; s1 I( l0 \, T: e
) B+ b& P# J6 j1 X
4 _" S2 S5 V; e3 n& ?6 W- _; {
& ]) f' y9 [# O, {1 A- |0 f
还有就是两个输入输出函数:
2 w& n( i) `5 N8 F: t" {+ D
void output_sample(Int32 out_data)
0 y3 i( E' b$ t# u* t8 B
{
2 K( B$ l7 l' ?0 m; b: R/ _
AIC31_data.uint = out_data;
% D0 U+ k4 `8 p3 J- V9 ~
MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 ^& x; b4 P+ ]7 M7 G) x/ N# I: R- m
}
# @! e5 A! h* q! x
) |$ E; k) p/ f
Int32 input_sample(void)
9 Z9 @9 v. h# G- i" H2 ]2 ^8 ~5 ]! M- B
{
0 y Q( k, R. L1 e) J6 T
AIC31_data.uint = MCASP1_RBUF0_32BIT;
% {# }1 E1 `. h' Z% W
return (AIC31_data.uint);
5 G. r5 ]* Z) H; T$ K! h6 U
}
* \8 V* X3 o7 y* E$ y5 p5 `' h
3 A- Q! u3 O4 ?5 Q+ n5 r
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4