嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 `6 X5 B6 h s2 R' n- ^
main文件:
/ M4 A6 s& F) m5 Z5 ~% b( c+ c( G
interrupt void interrupt4(void)
: S9 R8 l9 X' l; R- |5 S1 z
{
5 Z* _% ]' Q* D# F9 i
Uint32 sample;
3 I# z( n2 K; j% k: t. y: H
1 {2 \# {) S# l6 ]! b; y
sample = input_sample(); // read L + R samples from ADC
9 O6 n& R5 N% ~: ~
output_sample(sample); // write L + R samples to DAC
+ \4 ^2 t! z) Z, W
return;
. ?1 O* U) G1 |- t2 ]# O4 X
}
: K: Q( u1 l E' G- ]
- c& ]7 ~1 _8 a( w3 U5 `$ L+ V
int main( void )
( R+ {$ k& s8 q% e
{
( H9 O- d: }3 x' m
/ a4 k0 k& v* Z5 _* k. E6 M9 Z+ ^1 N
/* Initialize BSL */
8 z/ X4 v2 T0 w' h1 r1 |
EVMC6747_init( );
, a& n5 m T7 `" H1 F& l
/* Call evmc6747_intr function */
6 ?& E# W' {; _2 m2 |
aic3106_init( );
; E/ E: e( }$ q. n( O/ Y$ @
while(1);
+ t: l5 ~% y9 c2 U$ a
}
$ w. j$ s: @0 U3 m% t
; e9 N& t8 M; ^& n
, N5 w: H) v: @
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
" h1 d' @( U& R
/* Initialize MCASP1 */
! O$ ^" c b- G2 }, u4 K2 [
mcasp = &MCASP_MODULE_1;
, V9 w5 S7 G7 |
mcasp->regs->GBLCTL = 0; // Reset
/ L4 X1 ~4 K v! H& u! y
mcasp->regs->RGBLCTL = 0; // Reset RX
6 @# }% P8 o$ R% Q2 `, Z0 ]6 u
mcasp->regs->XGBLCTL = 0; // Reset TX
( d' ? ^% n* U7 A, I" @6 t
mcasp->regs->PWRDEMU = 1; // Free-running
+ A0 B# w2 d& a; {
// configure McASP0 receive registers
1 B- L9 M7 w. V! f1 P0 q; z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ D* ?# S% `6 I8 z+ y+ X0 {
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* g8 `$ a: H( j$ \
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: |3 B9 ^% V4 E; g, Q) s, Q& j0 C- i
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
1 d" E' K* m/ {$ [+ s
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( n% z' k$ p E9 ^1 E( d" X8 m
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 p/ ^! H' U7 D
mcasp->regs->RINTCTL = 0x00000000; // Not used
6 _3 Z+ n- R8 k$ G$ Q
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 R) q$ R* J( l. R1 ?
# C4 }2 l% W9 C, C7 I' v# t2 b
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" G9 h& [4 r4 s7 q& E; h
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: j6 P: |0 z9 ^1 a! ^/ |! }( l/ y8 b# x
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& ~ h; a1 S, m5 y
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
8 {# k# Y1 U- O% J* u j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, a% q8 n% h8 Z* U
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
/ {, _) |/ }* V& u" R: t3 m8 c) Z
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 P% `! ~/ V7 k) C5 U; Q6 [# E
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ t, S" T7 c0 Q% h/ e) p% n
, t: [6 t8 Q+ E: s
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
2 `: D1 L( { S& g$ V5 C8 F. r+ F
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
+ ~2 e* d' I3 r; K
mcasp->regs->PFUNC = 0; // All MCASPs
6 x" w' T( Y: F9 W1 p3 `" k. ?
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
q0 ^+ D# M, |
c1 k' o; R' u, P
mcasp->regs->DITCTL = 0x00000000; // Not used
( f$ K2 `7 J0 f$ P9 o
mcasp->regs->DLBCTL = 0x00000000; // Not used
! H; I& G3 k. [% w4 e, L5 G
mcasp->regs->AMUTE = 0x00000000; // Not used
: m5 [1 G7 t5 j/ L' M
) n( i3 R2 b; r
/* Starting sections of the McASP*/
( y6 Y. W" M+ C! C5 s, G2 l( ?/ @3 F
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 W h" I% I+ S7 B0 z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# w; h5 q; n3 J5 z, R
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 D8 f" k4 z: [5 c+ M* @6 T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 N+ s% P0 H5 o4 L
- \% ]8 `% i. { k, B; ]
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% z- c' y f1 m. f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
" ]$ A2 i( _% k0 x: H/ X. {
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
5 Y; Y" ?% ~0 o1 @3 D/ L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# N2 w! c2 X: b- K' z- R# y
. x% a+ w# Y" k2 p
mcasp->regs->XSTAT = 0x0000ffff;
- O3 I6 n( t( W9 M; ^" n2 M
mcasp->regs->RSTAT = 0x0000ffff;
$ X! t1 j- T+ M8 ]! ~
6 d; X9 h: ^1 G
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 k' D/ k/ V) y0 F! S5 a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
! o6 Y* O* i" |$ F; z( n1 v7 d
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 G6 f- E# Q c4 k, j6 t! a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
/ G* w0 n) a; g* ?
0 L9 P* d R3 w" X' ^5 }
/* Write a 0, so that no underrun occurs after releasing the state machine */
9 F X4 ~/ O' S5 L6 P; [. i
mcasp->regs->XBUF5 = 0;
[ b! x" k/ m, E
mcasp->regs->RBUF0 = 0;
0 I8 {! U g: G! ?% }( n$ ?
& d6 n+ t* ?" i( }7 a: [
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
( d/ p+ i* L7 A) [% d5 ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" j( k' g, A' v# Q1 \0 t# g) F: o' N
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, v9 Q( }1 G: g6 n3 G; O. B# B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ n# ^0 W: K$ z% o
, q$ H% r5 _9 m$ K V
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 l. [ G* g& q( G- C* w1 y' M$ e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
a. y5 i" F* z! w
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; u( x' d2 ]7 A% g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- s+ |; p9 w! n
. x- ]$ d6 e0 z# _1 T% F
CSR = 0x0000;
a, }# ?9 k; G, H5 A( x/ x# i/ h
INTC_INTMUX1 = 0x3d;
8 Y7 T+ a1 J5 G: G {8 P" k
ISTP = (unsigned int)vectors;
6 j& ^% T. f5 e* T8 R0 z
ICR = 0xFFF0;
( R, `7 B0 ?" P: I. ?
IER |= 0x12;
9 c" c7 e9 E# s# p3 t/ s7 _
CSR |= 0x01;
4 V8 i. z/ O# p$ e5 i6 Y4 \
- Q) P( r/ y! W/ O2 w
; K7 v3 @: B4 s( X B
& n$ M" Y- {& `( [' h
还有就是两个输入输出函数:
% \ A& E9 a& j
void output_sample(Int32 out_data)
4 J: _3 {5 u0 ~, Y( |
{
. j. c$ b! R$ i3 Q5 Z
AIC31_data.uint = out_data;
' u) `4 H) N, T- G+ r
MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 V/ L6 _, q2 t* s5 w. H8 M
}
/ f7 q0 c1 j5 ?
4 j. k: f3 z6 ?. b& b( i# e
Int32 input_sample(void)
! K) p2 {" m- J" ^9 @' P3 X
{
j5 r% {0 u: E. u
AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ x3 `( T; Z; m0 K. w
return (AIC31_data.uint);
( m: D3 s6 K) o/ k0 g: D
}
& T, r! G' k+ a, n
) c: w1 v4 E0 F* u
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4