嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ J; ^# a! H9 j* s0 u9 p8 |1 q
main文件:
+ |7 k2 y' E4 K$ Q. ~; X9 Q
interrupt void interrupt4(void)
. t- s% p* }8 u
{
) m5 \, I! b$ x. G
Uint32 sample;
) ^$ {7 l2 t% S" `+ t% c
; ^# L2 e! z8 h/ R. w" k+ u7 b4 o
sample = input_sample(); // read L + R samples from ADC
+ k+ w. y3 k h% n+ S+ G5 x9 y( x) b+ Y, N
output_sample(sample); // write L + R samples to DAC
: `8 N0 X; |- U
return;
! h+ T# B4 I* T' ?+ {5 s
}
7 X: L5 } X# y- A
' H: E5 g+ R1 P6 D
int main( void )
3 i- a5 t( S9 }
{
" F2 \# ]( L8 C" u4 B8 e! I
9 R, C8 s [. f0 @+ K# ^# V
/* Initialize BSL */
8 e1 N. K7 U0 M/ o3 B, L
EVMC6747_init( );
# S" t4 U9 r0 }- h( w3 H5 i3 B) t
/* Call evmc6747_intr function */
7 g; m" A8 |- @5 d
aic3106_init( );
) b$ P$ f P ]
while(1);
* J5 p Q, ~' [! B0 E8 D8 h
}
! I. C9 ]! T# e6 Z- m
; u+ W/ d6 h1 k. N5 F. y* i
4 P/ Q, W1 ?7 `. v+ Z) u$ w2 Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ x8 i7 x: t3 l8 |" h
/* Initialize MCASP1 */
' S5 ^, k. @% D1 q
mcasp = &MCASP_MODULE_1;
, A' R2 M+ i1 M; U1 P
mcasp->regs->GBLCTL = 0; // Reset
\$ L3 k* }8 @( B8 C5 [3 p
mcasp->regs->RGBLCTL = 0; // Reset RX
: D- E6 R- v: ^& P, C9 J- }
mcasp->regs->XGBLCTL = 0; // Reset TX
5 V- a2 r _, O O& v: P
mcasp->regs->PWRDEMU = 1; // Free-running
9 p. h8 e8 o, ~/ E
// configure McASP0 receive registers
1 W4 l9 c6 f: Y# w' C
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
7 j: f6 b. Q+ T6 J) n
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 u5 A6 m5 \4 g, v
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
; j5 u+ Z0 w2 _- R
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( O e0 x. G$ y; {1 Y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( W: {+ J0 K) {7 m6 \% k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) k9 E- z7 ^" \
mcasp->regs->RINTCTL = 0x00000000; // Not used
* F3 A. i% S9 F' {- M
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 f8 o, X2 E4 L1 v
6 | ]( X V7 C6 e2 r
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# `) k6 `0 P. h( Z. v* b4 T* u/ U. A5 N
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 Y5 A7 b. z1 r# G# d" F+ C' W
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) O# j, D* z$ v6 @
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
. ~/ f5 c: {! V. F* T$ p
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 E+ F3 s& L1 a h. D/ k" C
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
& B0 J1 e( f2 r+ D8 W) R: ]8 }
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
5 x7 B( e9 ^2 I, `7 y$ y
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& e c) X K' U$ \
/ \8 S$ N6 V: ]3 A
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: r' O1 M0 N- y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
0 v/ c, b7 b: w, X" A
mcasp->regs->PFUNC = 0; // All MCASPs
# D8 y4 F" P) _( Y/ {; [6 D
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
7 ?' E% y0 Q. w" |7 j& D8 z
1 H1 g3 g6 H. ^) b. y
mcasp->regs->DITCTL = 0x00000000; // Not used
6 M7 y5 \7 f' v2 W7 j6 D
mcasp->regs->DLBCTL = 0x00000000; // Not used
2 T8 V: [3 _6 J p! G
mcasp->regs->AMUTE = 0x00000000; // Not used
8 D) h/ E4 o. T, q' a) c. s! A# E
1 R6 Z" w1 |& n/ |3 q, t
/* Starting sections of the McASP*/
z8 J1 U) e* X3 [* E5 e) s" `
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ Y1 y5 A2 L& Z# C7 g* o6 A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
) s/ ~. i$ Y, e2 k
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) u. @+ G% o) M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# K4 r% ` _6 x0 x
4 X% O3 u/ T! B# \6 f" p
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
: @8 b" L* b. F6 l0 ]' o2 V: g$ o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% d' F! b% G7 U; B
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 m6 r& a+ Z7 O' J. F- r. ?8 }1 z u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
+ | k. L: m7 i! b& Q
( F+ p$ [1 T% v/ k; u
mcasp->regs->XSTAT = 0x0000ffff;
) q& _2 g% ]9 S& ^: I
mcasp->regs->RSTAT = 0x0000ffff;
6 x5 Q/ S$ {% N) U* L8 ?
( X5 o& }0 A4 B' f3 y4 q
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
O. M4 ]2 B& z2 i9 u! T- Q* G9 @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 u6 L# ^8 i! F! R6 l
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" i$ \8 s9 m7 L) X5 Z* a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) V, Q* O( P" Q; x' m' U: m
8 T0 c1 a& n. }0 S' n
/* Write a 0, so that no underrun occurs after releasing the state machine */
8 Y) r( K0 N) t+ T
mcasp->regs->XBUF5 = 0;
+ }4 x1 t" o4 O) |
mcasp->regs->RBUF0 = 0;
8 P# s4 Q; E2 G6 ~2 {7 m- j
8 u2 R4 z! R5 Q0 m1 q+ o
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
X$ q7 M/ p( e! S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
4 _# ^8 W# ^; l6 ^; m4 `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 @6 \" P4 M$ S( c2 O: t+ c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! D# ~) Q& l+ L4 p% Z; e
! Q) a# j8 W, K- N$ E
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# F1 o! D5 X4 B- z8 d- ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) b7 c5 m I5 ^: s$ H0 c
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 D# Y& u. \* g2 k% T; C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" X( n& t9 D$ l& C
9 B3 c4 |- J* ~$ S* _9 p
CSR = 0x0000;
+ C# H" o: ?! a2 [) ~
INTC_INTMUX1 = 0x3d;
0 d4 p4 k4 q: J' y8 @& n3 \- N
ISTP = (unsigned int)vectors;
& X* v, q) Y5 D# r
ICR = 0xFFF0;
# ~ e& ~' R2 Q$ w1 D, r
IER |= 0x12;
6 }, d, ^7 t1 x" q9 g' |7 T2 A
CSR |= 0x01;
) d% g1 A& s8 z( I. T5 b1 B
1 E* b2 ?0 s- m' U+ @
5 c% T9 |6 @+ O0 B7 e7 T
9 n! R, S( c. F. j: N. B! K
还有就是两个输入输出函数:
- D* R) l- N' r6 T- u8 o
void output_sample(Int32 out_data)
* c* e( Y9 B: X% R+ ^# R
{
, ]# r5 P6 O: i5 R# Q' I* Q. D
AIC31_data.uint = out_data;
1 B1 n0 |0 V- w9 A. r
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) X0 W3 ^+ h& i' }3 O4 u: [: _
}
v: t1 ~ w' s0 l
& E3 O0 Z0 Y s
Int32 input_sample(void)
1 J6 b# R- I$ ^9 M9 L
{
* S8 G- R+ C K1 F
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* J0 a5 I: H& `2 x# E) b) v/ n
return (AIC31_data.uint);
v% e( y' x5 O& U5 K1 B6 w
}
% J# X5 e6 U7 q2 ]! ~. A
; V7 J2 U* T5 K2 h; v# Q- C- y
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4