嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 h3 L* I `- Z5 C7 c; e: F
main文件:
& s7 `3 A9 a# E; [
interrupt void interrupt4(void)
/ W- l1 v- `2 Q3 P
{
% V& v, b1 c5 T- Q
Uint32 sample;
( [5 A5 a4 e4 G i4 _
# O2 y- ]( ~: A
sample = input_sample(); // read L + R samples from ADC
! l: ~9 n8 A. ?3 V" R
output_sample(sample); // write L + R samples to DAC
' T M' e2 E5 x) g" g; w
return;
/ B5 f" |9 G+ @: S
}
7 y8 E, c/ V+ y' C( l: V
# ^7 }# ?& Z* @) H& J
int main( void )
6 g0 E$ u* O3 F$ b9 ?8 _* l$ b
{
* n, l0 S# O. J: Z' d
4 L( f: |+ {8 \8 I+ P: U
/* Initialize BSL */
) ^. I3 D J1 c- |2 ]: x) S
EVMC6747_init( );
5 I6 |7 i3 d& x" J9 B8 ^
/* Call evmc6747_intr function */
4 G# x, m7 [& y2 f! I! E. P& B
aic3106_init( );
3 w Q6 s* h4 d- P: s
while(1);
1 X& Q9 _ i. L6 R% N% ?6 l
}
. g8 G2 x! ^' n3 l. t% I; r
! s; y# [& X) R
% p0 K2 z' K% t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' X8 a: Q( J# g6 ^3 g+ S. d
/* Initialize MCASP1 */
7 h( f. O) v9 n" U
mcasp = &MCASP_MODULE_1;
* w. p5 y( s/ P- }. \. Y
mcasp->regs->GBLCTL = 0; // Reset
# @' A8 m7 }9 O/ I/ \: u
mcasp->regs->RGBLCTL = 0; // Reset RX
$ R1 g' P/ e5 f
mcasp->regs->XGBLCTL = 0; // Reset TX
q% D3 D, i1 m& q+ I
mcasp->regs->PWRDEMU = 1; // Free-running
% J/ W+ `$ \ [( O$ K# s; Y% u1 t
// configure McASP0 receive registers
- V/ {/ s, O$ J
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 H: [$ o- p% g
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* D# f: d* ?) \( D E
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ H$ p' V9 G/ f" i7 }! d, t
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! X1 U& Q( f `; U' M" |, k0 Z
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
5 x' G* T1 r; Y3 ^* M, V
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
# q0 d) i+ l1 k- F6 n; r
mcasp->regs->RINTCTL = 0x00000000; // Not used
! I( x/ i% G# Y$ b! X
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 Z! l- j& B& A3 r0 [; E8 p
' n: r$ B; ]$ Z: W
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
9 Y) F% y( V- V: g9 J
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 I; N$ V- t# ~) }
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ K) ~; g/ L% b6 ~
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- s; [ {# l4 S" V9 w. u" W3 F8 \
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
! g, X& Q* h l1 S5 N, M7 Z
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
# u- t$ ~) {" z8 O8 P
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. c; p) h/ b# U) ^
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 F; d; {& |* R' r
5 P5 J4 Z2 M" R
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 s+ S, m, f3 D+ E1 F
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
0 \ j0 B4 G1 W* w
mcasp->regs->PFUNC = 0; // All MCASPs
3 n/ H0 G$ x: J2 b# u( o
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: ], T- k' G: F" E$ k5 N" v
# P1 Z# D* {% J& X: P
mcasp->regs->DITCTL = 0x00000000; // Not used
+ @( ]) B; y" a
mcasp->regs->DLBCTL = 0x00000000; // Not used
- ~- R6 T* Y2 U) S! C
mcasp->regs->AMUTE = 0x00000000; // Not used
) {1 q3 y" l7 z1 u0 s
( A' Z' g. E1 z7 C1 C' a* G8 K
/* Starting sections of the McASP*/
" R p/ F$ j7 |. y `+ Q
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
5 _/ g& W `* D' ?7 l" b9 \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: t9 p, F1 N Y2 Q! m
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 |' O0 X h9 D* J: g" v. ?: N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 X. I/ x" }7 y" n; O( @" {: d1 u
( H, I; T) Z2 h& H( E- ^
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 q! ~# n8 {7 b+ j; J x- W7 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% h. u: g) @9 M8 P, p& f
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 u' P2 M. J8 t- G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# h. O; f3 M; K) g: f2 n u; b9 z; l
3 u; T* j- d* T$ c. K" A
mcasp->regs->XSTAT = 0x0000ffff;
; l, O. F/ t$ v
mcasp->regs->RSTAT = 0x0000ffff;
( {1 y5 h, z! B: J+ s" c4 D# H$ Z
x- C. \, H9 I& ` D& B1 }0 s
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' O9 I3 M3 B! y% T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
6 H, g/ J+ J0 i1 j
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. w9 j, _2 ^: }" t8 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 A3 @ Z2 y/ m% n
- S6 y7 I0 Y7 |+ p/ `; `
/* Write a 0, so that no underrun occurs after releasing the state machine */
) y! }# W5 ^0 Q( \
mcasp->regs->XBUF5 = 0;
4 _% W# n, h; n# {& u4 ^: q3 O. o
mcasp->regs->RBUF0 = 0;
2 B# {2 |& U+ s6 K4 v2 @5 G
; w' F2 n4 o. F0 g, {0 n
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
; v+ B9 e( c2 s$ P2 |$ y2 t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. w- q0 h- {2 `1 m
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 K; e7 k; O: a& ~% [& G9 ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
6 j/ v* e- Q1 s1 \% A
! K/ u/ G- W8 @% r; g
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
w7 w$ c' R7 E e ]% \0 x5 c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- g' L2 l7 K3 x1 i
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ R- Y/ y/ m& g6 y8 U! S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 a& C. y& N$ b: i, x
! v; w/ {# E. b9 e: H- }+ b
CSR = 0x0000;
; h5 M" x9 ~6 ?8 V' ^
INTC_INTMUX1 = 0x3d;
0 s- G" n: Q# K. L$ I
ISTP = (unsigned int)vectors;
" z: l; K# J" r* n, v; [/ i
ICR = 0xFFF0;
2 y4 P, D; h# [
IER |= 0x12;
- ?& I H6 [. g7 x* }/ f0 ?6 D8 S
CSR |= 0x01;
% @0 m% ]- h7 k. a" b
4 e3 g$ ]$ W% L4 C, L1 Q3 K, S* L
/ N2 Q2 w! q- N+ @! ?) t
" G8 U2 \# i+ c7 d/ h0 z9 s
还有就是两个输入输出函数:
) ?1 I) W9 R1 ]( y$ Y& P
void output_sample(Int32 out_data)
' [& } w; y( {# c0 i5 D
{
# I8 k/ k4 m* T& {9 y
AIC31_data.uint = out_data;
8 i7 ^2 _' l/ M* p$ f( P, y* P- Z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
* K) l, v) Q# J7 f
}
8 R) s% T9 F) m, p$ x6 p4 m$ u# J W8 }
8 ]* V- c7 W/ ~: I* `: ]1 d- D
Int32 input_sample(void)
- ]5 h7 `5 C3 c' c$ F
{
3 A) G& X: Q3 V9 \! k$ c/ T
AIC31_data.uint = MCASP1_RBUF0_32BIT;
: x1 b5 F3 j- q! k; A" h
return (AIC31_data.uint);
, L$ I+ v7 e. y+ w. V, \1 I" T7 g
}
5 y# v0 M. s, c2 C4 r/ k
. u! I8 M n% k7 s7 H
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4