嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
; t d! K" V% ^* x
main文件:
) ?! _( N& ^3 m( S/ s) }, o0 o
interrupt void interrupt4(void)
# Q4 \7 C; N& |# Q V+ ]
{
; g4 L6 I! c' u
Uint32 sample;
) y) [3 g V* W/ J' x1 w& G+ h
# S: X! h1 ~9 Y' W- C# m3 u% W* O
sample = input_sample(); // read L + R samples from ADC
! C, k3 N/ O9 `6 q# S3 \% i
output_sample(sample); // write L + R samples to DAC
, w5 X3 R! |9 \4 R
return;
3 A# A% p2 l; B$ l6 K
}
8 v: {2 n& m+ z" p3 ?6 T
+ ]2 B7 A1 ?" u: K: q
int main( void )
2 O2 K: j( @& q A7 B( @( d
{
2 D' s" G# C+ U) c
7 [' O( @3 ~% i, W, m
/* Initialize BSL */
9 q2 S' u# t2 y* O: K$ i9 o8 {
EVMC6747_init( );
$ J9 m0 F/ D& S: Y
/* Call evmc6747_intr function */
. T W; E5 ]) V5 }
aic3106_init( );
4 s: A$ t5 D6 }4 `- E. F6 T, K$ E
while(1);
4 ]' o* R- ?, m; T% x$ g- c
}
; ^+ l7 s) N8 ]
- J, w8 Z4 F& E# b5 a/ I& w( ]% {
# q4 H: r+ R3 Q+ I/ [2 p
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. q& N; ?6 `% q
/* Initialize MCASP1 */
9 R1 ^# s3 O) Q1 J0 c( \2 Q- ?
mcasp = &MCASP_MODULE_1;
% V7 P& E E9 y M; y! Q7 D
mcasp->regs->GBLCTL = 0; // Reset
' T/ Y% \1 ]$ _! h4 S1 B3 S
mcasp->regs->RGBLCTL = 0; // Reset RX
4 S5 G, Z: @+ {
mcasp->regs->XGBLCTL = 0; // Reset TX
7 u6 c. M: q* B8 d
mcasp->regs->PWRDEMU = 1; // Free-running
/ A$ E G7 R8 ]8 k+ \; t0 j
// configure McASP0 receive registers
0 V; q, U; }/ m. t" c0 h! K! \
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
# g3 Y; z$ p$ S. g9 H% J2 l4 M
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" {- \/ M! S( A$ s4 _( r
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
& D1 r3 a) O; `: S
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( X3 }6 m2 v' G/ J
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
- ?( I' F( F2 l: h; r8 V$ p
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
+ o* e+ {. k+ h2 g
mcasp->regs->RINTCTL = 0x00000000; // Not used
9 M% b1 ^) |( i( {7 p1 E
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% @6 Y! G1 v: d/ D' Z# \: T: S- `5 `
$ Z; _( \1 |% T, P: C7 N b
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
* [+ g" J1 P% S3 {3 M& Y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* e% U1 f2 U, w, Q/ v! ^
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 u4 F/ R6 I* z# E8 U4 a+ q7 o
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: i$ y) Y$ C1 p% |
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, _: `8 F, \6 J0 G v. \8 L2 |
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* M" C, E- G0 M7 k$ g8 t
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
8 v' c- W8 H5 C& G
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 c/ H* {" X2 c% v! B+ h
' z7 ~3 E) v! A
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 X' l! e# o6 l9 m
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 y9 S! l/ j( f' F# I
mcasp->regs->PFUNC = 0; // All MCASPs
5 @; V# l0 R& E \8 x
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" j: V. O; _2 a! B' K- W: k
% X: ^, C" ~& ^/ K; k9 s8 N
mcasp->regs->DITCTL = 0x00000000; // Not used
: t9 F5 X- A% T6 f0 P% _4 C
mcasp->regs->DLBCTL = 0x00000000; // Not used
3 Q. |' J5 v( c4 _ K3 Y
mcasp->regs->AMUTE = 0x00000000; // Not used
" d* z- R/ _+ M% W0 s: w
" {1 u7 c1 x1 ?3 l
/* Starting sections of the McASP*/
+ |4 U4 S! ~4 L( E
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% V- n$ j/ O+ R% h+ L) X( A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
2 P3 o9 Z/ C8 H/ E' K
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 [; b7 J/ Z) y0 v4 s. H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* X/ Y- @3 S9 i, e/ O5 c
$ d+ c+ ~- L; K0 x l
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, V8 C! q1 w$ B" V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 y% \: q) e5 U' H+ f: Z) k/ i* _
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; |5 U+ {. i( k$ k& A) D3 J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; k3 g/ |$ E8 j( K
+ x. Z' |6 G) `# J- [, G$ O3 K; x
mcasp->regs->XSTAT = 0x0000ffff;
( t1 F6 B: q+ _4 b/ `
mcasp->regs->RSTAT = 0x0000ffff;
/ ^! o- Y: p% m, a. c
- Y: v5 C- v/ L1 ?
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! k: v. Z0 J; t, i. K5 G5 H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, q* s0 u) M9 K" t: A
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 m% ]/ N6 F/ c) |, K" D( z$ y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; L. w2 V, X Z
) Y' p8 }. I. `2 c. [2 m! G
/* Write a 0, so that no underrun occurs after releasing the state machine */
/ T3 z& |( |4 X0 v2 _1 b) U
mcasp->regs->XBUF5 = 0;
; X, @- a. o2 H! A5 i% T6 g( G0 k2 M* N2 U
mcasp->regs->RBUF0 = 0;
& S* i* r7 C! K y
* Q0 t& T6 D% c0 ~# |9 D3 c
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
v& [- ]2 G M- O% H, Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
/ f2 Q+ g$ b: Q5 n% w& o
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
v0 m/ \! w! {# l# i
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ d8 }, A- v/ B2 n; \" n
1 ^' x& r+ G1 B6 S+ F- q, @7 _7 J( u
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; H0 G* ^1 M: Q4 D7 S- N! e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 T4 p: t t% C- p
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
, l' ~0 t6 E. T! L v0 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( w0 e9 A7 B: e
# `! Q5 U0 w @- A S
CSR = 0x0000;
% ~. J" F6 C) U) r+ J6 |2 c
INTC_INTMUX1 = 0x3d;
, u, z+ _5 |- E3 G9 L' {' u
ISTP = (unsigned int)vectors;
* Y3 ^: `( L: q' c3 W' }3 l
ICR = 0xFFF0;
1 h% k4 }! R( B) O
IER |= 0x12;
( O9 t6 B% c" ~: q S7 A
CSR |= 0x01;
- S; I, X2 C9 I! w. ]2 \- x
& O5 u. F7 V/ R& i/ [/ y
, V) x U" a0 w' H
/ P& X4 h1 f# `
还有就是两个输入输出函数:
& X' o/ t8 _+ g
void output_sample(Int32 out_data)
+ x ?5 z( o1 R3 z6 Q1 \$ `
{
6 F3 R$ c6 J) G8 |/ k' J# K- U2 F
AIC31_data.uint = out_data;
; f9 L' f: L# c& Y1 f
MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 R9 h2 {8 n; _( i
}
1 k( s6 h- M/ g9 H3 |9 T; ]; a
, [) o, P% S) y) l3 R* G$ K3 d
Int32 input_sample(void)
/ N( k& S) m& N
{
0 ^, _% a2 k$ r" O
AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 K) `$ o. j1 z6 ~
return (AIC31_data.uint);
! ?2 V& l$ l# Q; P) |2 ~
}
% c! q; U6 I) b* _1 R
% j( M6 T7 Z' e* o6 y
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4