嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
' D. F2 Y- k8 \% z, P! o3 v
main文件:
. S+ ~5 d, s: m4 B9 K9 k
interrupt void interrupt4(void)
$ s& u0 Z. ]+ X) [$ W4 h' R% p M
{
2 a8 W8 n G" ]. o# w+ z5 Y
Uint32 sample;
+ v* `) U$ I ?- d8 b) j. X
* {0 n( T: T' A+ O- B0 `; B+ i
sample = input_sample(); // read L + R samples from ADC
1 z X7 G1 n; m+ p6 v
output_sample(sample); // write L + R samples to DAC
! `% R f9 c& c* o) \
return;
2 z( F7 b/ H8 Z' ~& b# u8 x6 z, G
}
* a Z* z# X3 u: U& g! A
- J7 Q8 `0 p8 ] r! U& O
int main( void )
( i( [4 f! q* Q5 M3 s0 i
{
4 O2 X. d* [. X
* L& H$ |7 ^ |/ j; J" _2 x1 l* ]
/* Initialize BSL */
3 Y' S/ ^# _3 z
EVMC6747_init( );
, a) M/ K' s6 o8 r' s6 r
/* Call evmc6747_intr function */
2 F5 L- j: g& O! L: q# {, Q# y1 P
aic3106_init( );
& b4 k0 o9 P( i" k' h" h
while(1);
& N& b/ G7 ]& h' m% P. T1 w s# }
}
' o% }2 p! [; h ~2 s; o) O
1 o; F8 i) G/ ~
' {7 Y4 P, @* {" U, J
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* i$ v }% a2 u; j# u* I
/* Initialize MCASP1 */
9 z. _& F( t) r9 w p8 L* U
mcasp = &MCASP_MODULE_1;
8 k7 P! f |5 S7 m! o/ y
mcasp->regs->GBLCTL = 0; // Reset
* Q* ^9 D1 n) d: J# |" q! E& U
mcasp->regs->RGBLCTL = 0; // Reset RX
4 A* J3 _ _4 m/ J" M" T
mcasp->regs->XGBLCTL = 0; // Reset TX
( H% n, y, k: G7 a9 o6 Q+ Z8 D
mcasp->regs->PWRDEMU = 1; // Free-running
0 @$ R8 e. Z" k4 P& I4 }! A
// configure McASP0 receive registers
3 w8 \' ~+ A+ s* m0 P+ p& R d* A0 S2 O3 q
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
# ?# Y3 i2 E2 I- Y5 R
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 |& c% Z% b. @2 i: p5 ]
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% _9 J) O( q5 z- w. o2 w
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 m) U& ]" G+ e* i$ z# f
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
2 e% f7 h) T" O8 A
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
; G2 [! [5 Z. v) ~1 w4 \
mcasp->regs->RINTCTL = 0x00000000; // Not used
9 o, }* P# ^7 h' j9 n% z
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# T( ?# M- Q6 q3 a, I- ?! L
/ |0 }" B4 M3 [5 t+ \
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
8 e. I2 f/ ]& `* |5 y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& }. r" H+ W- f( |- Q
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ r( W& x7 p2 m5 T1 @- V' f
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 Z% w: R; y% e
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
8 @( c! j6 I/ i0 I; r
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
5 @' ^- E9 W2 [9 S
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, W* Z6 A# ~% v* x E* [
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' W2 _ u8 I4 h" v
* | a$ a9 o9 l7 ], s0 i0 y' y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
. C, T3 P1 f" L" ~/ ?
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 G. _' E/ u3 k' ?
mcasp->regs->PFUNC = 0; // All MCASPs
! L! D" s$ O' ~2 L8 j
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* Y- @" B- l6 f4 c. j/ M! f# l
) ^ L" k5 e7 {% e4 q: a
mcasp->regs->DITCTL = 0x00000000; // Not used
+ ?, K: m/ A. I2 E8 }4 d# s
mcasp->regs->DLBCTL = 0x00000000; // Not used
' g' i1 m" [1 u
mcasp->regs->AMUTE = 0x00000000; // Not used
- a# h- ~1 Y* L/ r: B
- A! j1 R% K) ? h- @! a V
/* Starting sections of the McASP*/
: i3 x) ~( L) s4 \
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* `, \* j* d( s/ v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
1 [7 M7 @: O. S# K. @" c! r
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- w- I9 t! g* I# O+ k- |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ J9 n. c4 M/ W c
; }* U0 \9 }; x: x% K
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& H0 E* I: q r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
# |6 J$ Q* b! q( |
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: Z+ k' {' j; B* l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 g3 q7 T. r0 E/ z6 O6 }1 F# S
: V; p. {" T0 N% e5 {8 [* b
mcasp->regs->XSTAT = 0x0000ffff;
9 F3 d8 Y; q" D. P( Y! O
mcasp->regs->RSTAT = 0x0000ffff;
) k- t* K! f' G+ Q
% R! p7 x5 h5 f3 \) Y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& B/ Q3 L* x- V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
- ^# i+ S; r- j1 {) A
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) K: V- Z+ m% {: h0 L: p( x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 _# [' V: P: N6 Z, s1 u" h7 B" j5 j
% O# @! S/ _" o( Z% D% y
/* Write a 0, so that no underrun occurs after releasing the state machine */
0 d ~% m% v- u( w- e
mcasp->regs->XBUF5 = 0;
% o0 \4 @ m# _7 y ?) u6 E. ^+ J
mcasp->regs->RBUF0 = 0;
0 w) a! [; d* a0 J* Z9 k
5 a% y1 \% k- F8 K9 ?5 C
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 e: S1 s& A, ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 K, O' [1 F4 d% i4 e* W
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, h4 s! V6 C3 r5 _: P( e' k3 x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
3 _( _" p$ Q- q1 f; h, X
3 K% }; t' @6 d- R, o, j0 S
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, y- B1 I, [. `( o3 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( ^4 ?- y+ x S& f
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 e. x: B7 r3 I( y$ u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 A2 l9 T* u. x7 i
2 R9 C8 D' Y( N+ }
CSR = 0x0000;
8 m. _+ G. I Z/ N# l
INTC_INTMUX1 = 0x3d;
, p* V9 k/ M$ K( G3 q% e
ISTP = (unsigned int)vectors;
5 s/ C2 ?7 ]: V) G, w% P
ICR = 0xFFF0;
7 b3 ~$ R$ Z& y
IER |= 0x12;
# X, ?) C$ P1 i* z$ \% G! S
CSR |= 0x01;
( J7 O: T2 V- a, L2 K: T
) e; p! K# Y5 m" C6 c5 C
$ f! p8 a+ f. g2 \+ K" B7 N" u% L& L
0 Q6 e* d( J* u* L& S4 P
还有就是两个输入输出函数:
) J; P* q% H' m
void output_sample(Int32 out_data)
4 H3 O' R- q6 `$ o8 X0 t
{
6 l: F* r+ o8 c3 @0 n9 y
AIC31_data.uint = out_data;
; H, r& I' _% W* R! t$ E4 }7 c
MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ O3 ?8 P- [: y0 e, R
}
B. i* ?7 [# k. O
$ z# l9 Q9 A' N7 ?0 A
Int32 input_sample(void)
T4 i2 @% v" N- M% K! ?3 a& F3 \
{
" e/ q6 m1 @. I2 ~" m0 x N
AIC31_data.uint = MCASP1_RBUF0_32BIT;
3 U ]) [" _+ L& G. l& Y7 J, {; k& j" G
return (AIC31_data.uint);
A- c$ k" p1 r5 ^5 d4 L/ r
}
; \7 \ E' e, Q
; D( H8 I% l( \& W6 ~4 t8 V( b' D! ?
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4