嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" l, G) l% j, I
main文件:
2 m. Q' ?$ b( ]5 a' c
interrupt void interrupt4(void)
8 g" Y# y0 h6 ~; l& x) O9 l0 U' Y
{
: l6 d9 y0 ]6 F: Y
Uint32 sample;
[8 [5 j! H" P! n( U2 Q! j7 J1 f( o
7 T3 }) }4 b( o: d% V
sample = input_sample(); // read L + R samples from ADC
+ n6 L1 w5 U, F' d
output_sample(sample); // write L + R samples to DAC
$ u! ]7 F7 o% g) n+ C0 N, k/ s1 k
return;
x; Y0 S* w& y! D. u7 Y
}
" y& c% E \ `! L- B- A! {
! C3 k3 Y+ U- H8 [( V
int main( void )
. S* ]0 y! Q' x% D' G# [8 f+ r
{
9 q/ @, `( C) @( D& E% N
% ?, I6 a& Q0 X
/* Initialize BSL */
5 B- Z# p8 d5 S5 g6 T
EVMC6747_init( );
* a$ C) V! w3 l. ]! i% X, K
/* Call evmc6747_intr function */
* i& U6 a0 _2 f
aic3106_init( );
0 q' V7 l; ]( O
while(1);
A; r4 z- j5 z+ W* f8 r
}
& e- E v. R3 K8 n$ R
" _9 [0 m8 n! ?% V
1 `7 J. Q+ x" R3 y# [, H4 E
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; L7 @; K$ i4 x. F
/* Initialize MCASP1 */
0 Y3 m$ T& k- b- b
mcasp = &MCASP_MODULE_1;
; ^' G! q4 o/ @" {' B
mcasp->regs->GBLCTL = 0; // Reset
+ W; @7 B6 M- k: J- } w
mcasp->regs->RGBLCTL = 0; // Reset RX
9 E6 M! \2 k& p9 D4 ]$ p
mcasp->regs->XGBLCTL = 0; // Reset TX
% x. \9 ` z5 u; w
mcasp->regs->PWRDEMU = 1; // Free-running
8 ]9 r) v: L" Y5 @ S" z
// configure McASP0 receive registers
% {% y: Z0 }! A/ t- Q
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
1 V+ u: k0 N* \$ A c
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
N0 J! ]) S: B+ |+ o4 ^( Q
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 m9 I) R Y- a/ x/ {
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 x( q/ V+ T& I: _1 h _' [
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 G8 B$ j: T5 Y- y
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
0 B' K. u6 ~. S3 \5 J1 V
mcasp->regs->RINTCTL = 0x00000000; // Not used
8 |8 `% f1 ~: R. z
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 t2 c0 ]. g, c9 x* P: H
$ `. g9 n: ] x' ]
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
3 C# ^0 |& I; s! c
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 \5 [8 Q. C9 q- W. o& e# Q
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
+ Y( j6 @2 Z# X; j0 [) Q/ a
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
2 y4 t7 S2 p, H$ I
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
; l" }5 A" c1 }+ d
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
, g/ ` ]# K% _1 @0 f& w9 F
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
c5 z! l. ?7 b4 Z0 K
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 T9 M! i0 {6 N- r! l* a t
! H7 {9 z, g ^5 J
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& Q5 d% ^5 p* q3 x k
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
2 K& Z; B3 b5 s% E
mcasp->regs->PFUNC = 0; // All MCASPs
3 l0 y- e7 m8 `( a1 w
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ z7 ~- E, b; H# T, b+ \
6 b3 p5 V }/ Y2 j7 f2 M* T
mcasp->regs->DITCTL = 0x00000000; // Not used
; _( v% T& p7 c; n% J9 \
mcasp->regs->DLBCTL = 0x00000000; // Not used
7 K( {8 _" M# F9 K4 K" G
mcasp->regs->AMUTE = 0x00000000; // Not used
1 J; D, z1 D+ z/ k: }% T9 ]
2 t# G: S) t1 ~1 u
/* Starting sections of the McASP*/
6 V) P' `$ I% R5 _8 t' T
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. {- w' { R! U3 B' I+ s @* P9 n' z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 v$ |5 e5 `; m+ o. _7 a! \& o- ]4 |5 q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ l7 `, x- P4 x% |! p1 m/ u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# k5 B0 x3 S. Q5 d
4 w; U* w; {2 n- o( s
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' y7 F. j/ U) @6 F6 W, K' m3 M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 l$ D4 R2 L7 c
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 K! T5 e- W: f+ @% G3 m$ S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) a" q. j9 j0 {. T
( k( w. b0 c9 T2 b0 `, _
mcasp->regs->XSTAT = 0x0000ffff;
2 }' M7 \9 _. R, I, z5 c' V
mcasp->regs->RSTAT = 0x0000ffff;
* P7 y$ U- K8 ?+ h* i0 Z
7 Z) a b' K& t; u1 t7 E
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 S9 z( [$ A) V4 Q7 }( i& b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( `9 {; n, |* D8 h' ?9 H" I7 P
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* ]5 y, {) P- N1 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 `$ o3 I; t( u$ Z
* J; h: ]. e" ^ ^5 J! P
/* Write a 0, so that no underrun occurs after releasing the state machine */
[" v/ ?, I0 x& g3 g
mcasp->regs->XBUF5 = 0;
$ | k4 i& q7 m* x
mcasp->regs->RBUF0 = 0;
- z1 A& z! |1 m: l6 E1 d
% u K2 J* v/ W% {+ ]
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" t B! n) D; m% n ^6 \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ s' f% _) B2 w! J( Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 f2 t6 M7 u1 R& `2 [* N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' s" C- m" {: @$ O0 I. }, S
0 ^4 C5 P4 W+ }. R9 y$ i5 K2 T
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
6 g, o' ~% l# f2 n) G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
r; a) ^8 G6 |! R6 l Y
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* Q) d8 Y+ J' Y0 `6 o. x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 g4 M% ~( g7 u3 R5 l0 `
7 d) U0 ^- x* _5 Y" m# a: `
CSR = 0x0000;
& _+ U1 Y* ]3 H# K/ D4 ?: |# T
INTC_INTMUX1 = 0x3d;
# n+ P! l' v( E6 ]; B, ]. Y
ISTP = (unsigned int)vectors;
. e' k; w) q& x+ |
ICR = 0xFFF0;
/ k- j2 F0 ^$ p" u) i1 ~: p8 v' M
IER |= 0x12;
8 e, j* v5 k- A4 S; X+ E
CSR |= 0x01;
2 K( a$ ^# a0 s+ B5 E
' \1 f/ W8 v' ^2 G* n/ x0 m
7 I2 f L) f- z( G3 `2 N
) k5 I! M5 y8 T( Q+ j u. l, ~
还有就是两个输入输出函数:
7 p5 d7 z, m$ g2 M
void output_sample(Int32 out_data)
9 ]2 R" K; q& S
{
2 W& X4 T' G( _8 m: x
AIC31_data.uint = out_data;
7 }1 k; F. x$ |" u/ {. P- `
MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 G( t* l0 s- I3 |3 B
}
1 W3 N6 r7 _" }9 H1 P. G
" R f6 \2 H& ?
Int32 input_sample(void)
1 G& c, n: [) ?) E# c
{
) U5 A% c E9 H* J. d" r* }
AIC31_data.uint = MCASP1_RBUF0_32BIT;
~& e* V. L+ B0 c$ m# l
return (AIC31_data.uint);
c: V+ q) s d7 P1 Y1 b/ `3 K
}
) d# v& v1 q3 H7 i; h; x
) p& `8 S6 a T5 m+ n
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4