嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
q3 d! u) ^1 I: y0 a8 T& N; A
main文件:
2 _3 F2 f) B% A5 ^& ?
interrupt void interrupt4(void)
N' P r' u, ~- O c, U* C
{
: l* R ~6 I* ?2 r( ~# {/ {, D
Uint32 sample;
) ~0 e; u4 w1 Y0 M6 f/ Q
2 l! N( | v# {$ @# u
sample = input_sample(); // read L + R samples from ADC
5 X' }& D) d. \6 c; f+ }4 }8 s3 E1 s
output_sample(sample); // write L + R samples to DAC
3 T" K1 B: {1 [# m; N; x6 {
return;
7 L) ?* C8 k% H/ Z
}
4 q9 A7 d7 e- e
' n, z9 q" n/ u! Z; k( l
int main( void )
0 K5 Q/ i3 K* e
{
+ c. O, P& A0 ?- k6 ~) ]5 j$ \
$ t& ]/ k% D* E& V: H; U
/* Initialize BSL */
$ I N. O# V/ X8 q: G. P$ c7 K5 w/ [
EVMC6747_init( );
' `, _+ a' t! n( A; c; c3 Z
/* Call evmc6747_intr function */
' h5 X E) d; [
aic3106_init( );
; M0 G& b% x3 w# _
while(1);
9 r" P" J) C7 c0 i1 T$ Q/ d
}
. r1 }# o3 \9 z: c' x/ Y
8 Z; k) X" F' D9 v% Z6 X
8 n9 j" [! R o1 G
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 G6 T" s1 T. f- \& j
/* Initialize MCASP1 */
' }! m K# r& `* f9 p0 e
mcasp = &MCASP_MODULE_1;
# l* X. I! r: F. f
mcasp->regs->GBLCTL = 0; // Reset
! h2 I) B7 \; w7 F2 {
mcasp->regs->RGBLCTL = 0; // Reset RX
# A X6 ], }0 s5 [! X' Q. [6 @
mcasp->regs->XGBLCTL = 0; // Reset TX
. S9 |: g& c5 I9 u
mcasp->regs->PWRDEMU = 1; // Free-running
" E; b0 M( H7 s3 S
// configure McASP0 receive registers
/ G! a0 l7 R* M+ u
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
' U0 a& [* l1 w
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( Q, g; w! q- n1 F R8 P
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" I5 n5 G* o- @7 }; P/ y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
5 K2 Z6 Z6 \- N9 g! o; e
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
0 O1 ^' L7 p7 \9 ]
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, t6 `% S; h7 O
mcasp->regs->RINTCTL = 0x00000000; // Not used
: R1 e/ l6 }7 p3 ]5 q! U, i
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ w0 c3 A5 v1 s
* d5 o6 r1 w+ D$ a ~& d
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 i6 s4 P# g6 F$ h( Y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" [* A# O7 d2 x, q2 u( E1 ^+ U
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 W3 N! ^& M' ]
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
" y, a: h4 Y$ g6 g x8 F
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
( s; t v8 ^+ ]+ v0 v
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* B6 Y' F5 \4 A3 w- ^. A1 ?
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
( |! o4 x8 A, H E5 F$ z* o
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; L$ ]9 t6 ~7 B- T$ e3 Y
" v4 V3 R% v# d0 V9 Z1 b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
6 r* m9 e$ B$ L/ s' Y5 F( t
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
- J* G) ]$ }% z/ I+ E* q. l
mcasp->regs->PFUNC = 0; // All MCASPs
& [- @$ z- }+ M( b: U" a0 N
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 r, G' q1 C/ N ^! t
5 @7 W& d& C+ K$ y
mcasp->regs->DITCTL = 0x00000000; // Not used
1 t+ [ W# P6 q/ X
mcasp->regs->DLBCTL = 0x00000000; // Not used
7 @/ j i3 h& P6 Q- L
mcasp->regs->AMUTE = 0x00000000; // Not used
* u( u5 g+ i# @; W
, [( n# G, Y9 p. w3 p
/* Starting sections of the McASP*/
' z6 c: ~9 }6 I' C3 _2 ~+ X
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% i; | b9 @$ A5 `4 I& Z+ u8 Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
1 p0 [$ R! L" J0 A. j) R
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
|, x" A% P2 c2 j; Y2 t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ C% i6 s) T! \4 S: z( W$ M# b$ y
! ~* j2 ?8 K' h7 D3 U, U
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& ?2 a; v/ H, f( m$ X- C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
$ ]" ~8 l7 P/ q% q5 s3 J
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ ~) X1 f1 H7 J0 [; t. W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* w0 q6 w o ~7 {; f( O
4 X+ @ B' B' g1 x7 u
mcasp->regs->XSTAT = 0x0000ffff;
% G" \2 @3 ]% _% I: y. p o& K
mcasp->regs->RSTAT = 0x0000ffff;
: [; E$ W* H6 N/ U, L
2 p0 d" u' ~( S, V5 ? C( n
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; e+ b" @& a7 E' J9 k. v9 ?; S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ g2 P4 ~! `% z! y" l" s$ J! N
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. @4 f. N2 D c; h: i6 _! d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
4 x( a& d# E5 V+ v' {
& N+ X. V/ M8 m( D& K
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ n1 S. ^; H5 n% ]
mcasp->regs->XBUF5 = 0;
- T/ P; J$ H T0 ^
mcasp->regs->RBUF0 = 0;
: ]) K! I! b1 B6 a5 b7 ^
, c& t5 G- w6 f- o7 P9 o
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
& B: X6 X; I2 q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# m. f ~5 {. U7 ]
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
- B7 C4 s0 K L; `. c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
& Z9 B- Y; Y* h
0 Z9 m" t- c7 J* _& e* |" y
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 H/ K+ t8 L3 @6 A, w$ t+ }( L' H6 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 c5 @2 ?5 K! \1 q1 c! s
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ s0 I# g3 B7 u" P y8 C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# ]! K- i. ~$ X5 \5 d) O! b4 @( U
: J" M9 T3 o$ _. Y X6 N0 }
CSR = 0x0000;
6 F5 j1 E, U- \4 X
INTC_INTMUX1 = 0x3d;
! i. m; t8 x. V0 c/ V5 b# ]
ISTP = (unsigned int)vectors;
! b8 L) Z, q' ^. M8 b
ICR = 0xFFF0;
! S: N u8 a1 g% g
IER |= 0x12;
& t. _2 N& l$ m, `
CSR |= 0x01;
% R/ y$ \3 M! ^
/ t( N8 U4 A- c: g! }
: F0 H2 t" }0 I. ]% j/ g
' V$ ? n: n* x* _9 F2 ~
还有就是两个输入输出函数:
8 m' k0 c% L/ O. ^+ `+ |
void output_sample(Int32 out_data)
) j. i! U+ Q* W p. u
{
6 u+ g# b* \4 y/ V$ J m
AIC31_data.uint = out_data;
) w+ B9 [0 j; z4 |
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 w4 S0 q8 s% P' P$ P' _1 m
}
" t( T) `- @5 b. q
T1 X: S) }$ K1 T& h5 U3 Z
Int32 input_sample(void)
/ C$ l6 X; L9 _7 \
{
+ L5 h) M& [$ [( S; j6 c6 w
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; |0 n& _1 r' c. k2 M" j: D
return (AIC31_data.uint);
1 M2 o& ?0 L, c0 y1 f1 n# W+ d
}
8 l- d4 T" N6 q- H
2 i$ y* C' x5 `" r3 C0 t! l0 _
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4