嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" G0 F0 u, K a. y7 S/ e
main文件:
% ` U4 p" x6 s, K
interrupt void interrupt4(void)
& ?' ~9 S' u8 W" ]; [
{
- g! l+ A1 J+ ], i+ w* G, {2 ]
Uint32 sample;
' `& u9 p3 Q Z+ z( Q. m) a1 C$ q
* T' m4 \9 f' U1 s. W8 O5 X$ E
sample = input_sample(); // read L + R samples from ADC
0 j/ {: `- {1 I
output_sample(sample); // write L + R samples to DAC
# Y7 h+ ] ~# [7 T1 z5 R
return;
8 I9 }; {; P% T( U/ @0 j% G
}
' A9 e) G: k9 d
4 F) L% S1 J. C! R; n' z6 X
int main( void )
, \9 W9 p. c! U1 j2 }
{
; i. U6 T6 j2 v9 E f0 P
6 N- @. p" q C4 p1 m
/* Initialize BSL */
% p; q( M3 `; _! o$ H
EVMC6747_init( );
; I( S: L( {8 |$ ^: Y& `3 n3 H, R
/* Call evmc6747_intr function */
4 s9 x4 p/ R) O
aic3106_init( );
2 _: U- C, O( v2 C6 t1 P% D
while(1);
/ a; E& G. E1 U. |$ ^8 m+ l5 a+ L7 E
}
; Y8 o9 j0 q: `5 z% ]
; p8 O5 y$ S" v' [$ J
2 u: o9 p* S" a. N1 c' n
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 {) J+ ]* q( w9 Q
/* Initialize MCASP1 */
6 l* t2 c( R, s7 Y
mcasp = &MCASP_MODULE_1;
# z, D- p# q4 w O; i* t
mcasp->regs->GBLCTL = 0; // Reset
( i8 m3 d( L# T- W
mcasp->regs->RGBLCTL = 0; // Reset RX
. \6 _$ e2 x4 S
mcasp->regs->XGBLCTL = 0; // Reset TX
0 O% q+ g: f& U+ L
mcasp->regs->PWRDEMU = 1; // Free-running
5 ^, @/ V% k0 ^& F( i/ ?7 S
// configure McASP0 receive registers
) [+ ^2 i% f4 t
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
; ]5 S9 o. U9 y0 m
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
C2 U2 g2 B1 P% U D5 \
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
0 x1 {* p1 f8 ]8 L, U+ R
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 m9 z4 r$ a5 x% O
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
" I' o6 L- Y$ `7 ^
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
( V' }6 _+ T2 |$ e9 H
mcasp->regs->RINTCTL = 0x00000000; // Not used
; ?* q7 V+ \2 S. M) [% e+ I- _' m
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ e, F7 v2 R V5 a, j4 C
$ Q' z- c0 _2 _0 G9 `$ y7 X
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
1 ?. ?; \& r$ V; e3 u9 ~+ M
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 ~) Y9 I. M! |/ X7 {
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ |2 P) q7 b/ i
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ K3 y# U' Z7 _6 n; Z$ ]. e
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
; t% W3 }4 X+ P J+ U0 B4 A
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 s* M" t4 Z5 q7 `$ H
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
$ |3 a* t8 c3 A5 K; u- K* ~" X# b
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ i W t0 G( o6 [- x, K
1 s0 j) W$ B* {6 M
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& N6 L `# i. y. E! I& w
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 C" n5 {# k* w$ U1 A
mcasp->regs->PFUNC = 0; // All MCASPs
( K1 x+ Y6 L! I
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: T& q5 b) g, @
/ K& R0 O- W0 z0 o/ }5 u
mcasp->regs->DITCTL = 0x00000000; // Not used
/ V/ f) G% D0 [5 r1 K
mcasp->regs->DLBCTL = 0x00000000; // Not used
2 V( E6 v$ m1 J' O7 b' U; ^
mcasp->regs->AMUTE = 0x00000000; // Not used
' {! s& C9 j$ ^# \- u4 C0 g
p/ B3 m# _* g( I! k1 b/ \7 m# j
/* Starting sections of the McASP*/
' Y2 I, a/ o% N1 O4 t
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 E5 q2 Z9 k$ l/ s( s. a% ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
2 U& B6 c4 w2 E H
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, {& U2 \7 D$ Y9 G& [' W: q9 N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 L+ Y( I3 r- N7 \
! W( y4 |# R" B1 K6 \
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% {( s) \4 E- w; \ i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! w8 k' Q8 a$ n1 X
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 C; x5 u7 }1 H- Q/ s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: ?- q8 v! N6 y) ?
6 G7 n; ~) k; G. b9 J- ?+ w- t9 q% Y# `
mcasp->regs->XSTAT = 0x0000ffff;
) J% R0 U0 U0 z
mcasp->regs->RSTAT = 0x0000ffff;
' s/ a1 U/ U8 m
5 y: \5 r5 O; H+ ]& h6 ?" N, h2 H
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
, ~/ b) r/ c, }- {! J% P; q; ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
2 p D% H5 s4 B
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 |/ i9 L# ]& o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
% [4 F2 J: c+ C% j! ~ r: Y i3 s3 m
) ], h- q( G5 d2 ?
/* Write a 0, so that no underrun occurs after releasing the state machine */
1 a; z, d7 r9 A' y7 T
mcasp->regs->XBUF5 = 0;
9 y E4 F3 L0 z, M1 z5 p: p! Z M9 O
mcasp->regs->RBUF0 = 0;
* b, ~- w, z: s) t5 X2 N
' q' U# |+ y' \" R O
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! N& a u# f7 D% C/ {! }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) ~/ @% D( [" j% r! J$ \7 i0 S0 Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: [# H" m( e" m: U! X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 D, T3 F; J V8 S! f4 Z
+ D5 {8 {/ w3 V `
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 y! r- J- \: O) H# i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! U" I0 _% \) A) H
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 b# j3 f* z+ a2 n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
( B, G! j a9 ~" b( C8 d
; f; M' V8 x. f( Q- r
CSR = 0x0000;
* G9 ^0 I2 r6 ]5 a! T$ N1 f
INTC_INTMUX1 = 0x3d;
! d# W. e# H4 ?! Z- ~ S
ISTP = (unsigned int)vectors;
% ]* t, p6 K* }6 a' l6 S
ICR = 0xFFF0;
2 ^1 f7 e- O) G, ~3 w4 r! }' B
IER |= 0x12;
4 k9 ?9 w+ `" ?) O Y5 e, Z# a
CSR |= 0x01;
: \, E6 x: j" D7 E
$ j7 r$ c$ {, a4 N/ @$ G6 w# ^
' r' u# }& ]9 x! A" f) M9 V; R9 B
" q, K& d, o% U }# U3 x* B
还有就是两个输入输出函数:
$ f8 e# ^- y3 R1 y+ ~
void output_sample(Int32 out_data)
& T3 o( O+ u7 h* k# m
{
; B, N6 _2 j$ p, `& m, Y0 A/ K
AIC31_data.uint = out_data;
( P7 t/ U9 z) {( D) L6 e
MCASP1_XBUF5_32BIT = AIC31_data.uint;
# d2 G. j5 q- [1 @4 ~' r' z8 R
}
' y1 Y3 ?) j: y8 D
& T# R$ G9 U- L% @( {/ L
Int32 input_sample(void)
& T8 N( i" y4 m+ H, L: x* m5 l
{
) I! T i3 j% p/ K3 l3 b& C
AIC31_data.uint = MCASP1_RBUF0_32BIT;
! J G4 N0 K% n* `9 T
return (AIC31_data.uint);
7 K3 |: r0 a; f( P6 e
}
6 y& @& k% N# B% [
3 ~ D- u( q% P0 f6 S0 R& C
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4