嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 u+ f3 m+ w9 K/ }2 D s/ H0 b
main文件:
. a3 J7 r) g4 o( v
interrupt void interrupt4(void)
) y. E) a" c& t7 j+ {) V6 O
{
) U- x7 @( e( G/ G. D+ {
Uint32 sample;
! P9 {: `5 H$ M" A3 I `
, j- ?0 H, v( m. U; u4 x
sample = input_sample(); // read L + R samples from ADC
$ U9 Y9 U( F2 O8 C' c0 k
output_sample(sample); // write L + R samples to DAC
- {4 g9 `2 d3 Y' S- h- R% N
return;
2 k! x- R( ?0 h( Z g% g! Q# u
}
; x/ p. O. c: p) S& K% s s
, K1 l9 Q* _; _, T' p- f; c3 X
int main( void )
5 `( k4 N: z1 {9 `* D
{
' z+ Z' V/ o" C8 E$ ?
: H- Z; ^% _; T0 H- V
/* Initialize BSL */
1 U' C3 \3 q B+ M9 d0 n2 I$ K" X
EVMC6747_init( );
1 J2 N& K- |: y# a
/* Call evmc6747_intr function */
( I) D6 K& C0 ]1 J9 s
aic3106_init( );
5 {9 i5 ~, `" y& h+ Q+ V8 ], `0 I7 r
while(1);
' R1 ]! ^& a9 S [
}
9 P. O! f6 \( g' t& D; {3 [
; i; l1 W0 q) @' m
4 I, o- |' D2 {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; X4 I+ d6 Q" Y" W
/* Initialize MCASP1 */
- F- x1 E8 l' G5 X' Y9 `' C% R0 Y1 y
mcasp = &MCASP_MODULE_1;
5 e2 D1 t0 Z2 t2 b6 F, J1 i e
mcasp->regs->GBLCTL = 0; // Reset
7 f4 x4 P6 z# ~! r
mcasp->regs->RGBLCTL = 0; // Reset RX
7 c0 g: W6 o( V; B& O
mcasp->regs->XGBLCTL = 0; // Reset TX
" p# f8 Q% z5 s; {* e% p
mcasp->regs->PWRDEMU = 1; // Free-running
" O( o1 m5 E; Y, B- y( i
// configure McASP0 receive registers
4 I- v6 r1 H3 x3 e0 g! S
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
: Y! x( n2 C+ q
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ B/ U5 ?: T' m! ]& Z; l# W ?6 c7 t
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, `5 a1 k$ c5 P |/ o! J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
) y( e% h: }! {$ X* S' K, g
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
) U9 c5 ?7 _3 j4 [) f$ V
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, c/ _: ~+ f( ^' {
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 z( M* y$ d! r
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. T! n0 {, Z8 a: o' K4 ?
' m& Y5 s) l7 K5 r( S5 H
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
; N) z2 r( F+ U/ \, I' u( w: H
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! S5 s: o- L- a% v' U1 Z
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 r1 U# P3 D0 b. S
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 s C5 B/ x; J
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
1 q _7 Q/ x, f' }, @
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
/ `0 L* i% R" L, ^. ]" z
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
3 Q$ \# m& s0 ]" z6 \; d$ z
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ Q7 ~9 z8 }3 K* ~/ K0 X
" l9 C3 z3 T5 Q7 n' C
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
, Y) `7 r D$ D! X* ]3 W; ]
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
2 `4 G; E0 M9 j9 f4 y ^
mcasp->regs->PFUNC = 0; // All MCASPs
& l) L! I$ j+ `3 K3 p* P' s
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 G$ a% q2 o1 {) _+ e+ a, V
" N9 f. S' e, v, s% f/ }" B+ h
mcasp->regs->DITCTL = 0x00000000; // Not used
! y# Y7 U% @* ?- C! e
mcasp->regs->DLBCTL = 0x00000000; // Not used
2 o) w8 j- q" b+ a8 A9 p0 `# u) l s
mcasp->regs->AMUTE = 0x00000000; // Not used
! q' r* ` j5 H7 k/ z
2 \0 K- Y, }3 `+ U, W9 P* t7 v5 u A3 n
/* Starting sections of the McASP*/
/ Z C' v3 c; U
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( I3 x! G4 \; K2 |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
$ i9 S U# x! r9 V# `
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( O) q7 L, Q% j" g' d- p t: p9 Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ h8 J0 I& L* J+ U% r# |
7 b8 K% Y' Z" j
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; x, J: L6 d" g4 `: V" g0 \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- P0 P! @7 H% h2 Y' l9 D
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 o$ K( c' m7 p5 B4 p% v8 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ z5 j, \4 M' S& s& r* O s
9 }. `$ B4 `. O3 S4 } a
mcasp->regs->XSTAT = 0x0000ffff;
' `1 s6 N0 @7 |5 j( r& v; K
mcasp->regs->RSTAT = 0x0000ffff;
2 l- Y) ]) L8 s- d( n
& Z; ~$ A: C1 e2 `% [' y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 i* w; c/ L* }% C8 |, v8 R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 s0 {( A+ K+ w
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
7 L0 F: Y' _ a7 b6 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
$ z% s7 s1 j/ H! v5 b
) Y# }/ L% u( G5 x- @' k3 ]
/* Write a 0, so that no underrun occurs after releasing the state machine */
/ R+ n* Q0 B5 C8 v1 ?
mcasp->regs->XBUF5 = 0;
& I$ G0 v1 @, D, ^4 A7 G9 Q
mcasp->regs->RBUF0 = 0;
J& K* l( N' C, |
: a5 ^7 Q- S$ p7 J1 F
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 C! [+ g, |5 \( n7 m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
A. p7 p' I' ~; c
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
* V0 `% {; B- m7 C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. i' V I7 H6 C2 w" X
2 H- G: T' x+ f0 h& }
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
) V; F/ Z5 Z. |% b k8 W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' ]) {# a, K* C) l: i
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 l! O% u0 P( Q' m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# z! e$ u% J! P# m+ o
9 O2 `+ i0 f, B; a9 g: H
CSR = 0x0000;
! ]) x" Y7 o' U& D& R
INTC_INTMUX1 = 0x3d;
" Y/ Y9 Y$ Q' Z0 y
ISTP = (unsigned int)vectors;
! l: l* ]9 e; X
ICR = 0xFFF0;
. X) d1 r J1 w7 B: B
IER |= 0x12;
8 d7 X9 l. @* L9 O6 |$ z
CSR |= 0x01;
$ J+ i$ R! F$ U$ j
4 K3 p9 }1 O- s) u6 |
J3 n- x7 E4 t# q# c. V. E5 \
B* s. e, X3 e4 v4 w' @! K" S @6 h
还有就是两个输入输出函数:
" ] A3 D5 U1 ~+ ]
void output_sample(Int32 out_data)
& X* e7 e. V3 I& N4 G2 ]$ M4 V( P
{
9 a1 O o2 N" Q7 M V
AIC31_data.uint = out_data;
# G% B& |5 M, U+ S$ `1 w1 @0 Q/ r
MCASP1_XBUF5_32BIT = AIC31_data.uint;
% F5 f0 [2 T# O
}
1 w3 W+ o5 K5 L: x/ V e5 y
+ n j. P* }% v7 Q
Int32 input_sample(void)
" o9 ?7 Q, ]5 T. ~. K
{
; B3 E9 l! q/ d) q) P R6 Q
AIC31_data.uint = MCASP1_RBUF0_32BIT;
' n% [* ]/ P: U% C3 G* ]
return (AIC31_data.uint);
: n; Y" m) H9 u0 E% w6 d: l' @
}
' G7 h. B9 p' |6 n
. @( E6 R6 _! `
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4