嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( _6 s. f! `, b+ R& I' P
main文件:
9 S# [1 i5 s* B6 H" v0 |, |
interrupt void interrupt4(void)
* ], ?( h8 N) L4 P' W: E9 c; i
{
, r( Y0 m h5 e' F: V3 s0 R
Uint32 sample;
* H& n- X* @+ l6 Z$ n
7 l. w# H# `* K6 t
sample = input_sample(); // read L + R samples from ADC
4 c; u7 I! Z$ W# F6 b8 T. T8 m O! r
output_sample(sample); // write L + R samples to DAC
9 w1 A |) Q( T! t1 V; t0 J' T' F, w
return;
/ H( C! ~$ d8 Z) K) T
}
. m' s( g8 a0 { J- }1 O/ f
7 z/ v8 ~' o' Z) \2 I$ S) r
int main( void )
- d* [9 G5 c* z) n6 ~, q
{
8 N0 `; ` Z$ T0 B- H
/ }5 w O7 K7 G) A- {& V
/* Initialize BSL */
$ ?1 Y; ?# q* K# w" a" p" H/ X1 h
EVMC6747_init( );
) B1 u& {4 S! {7 V" g
/* Call evmc6747_intr function */
7 `% V% s+ j! b4 `; h$ S" A3 J
aic3106_init( );
% n8 i3 A, U. w# P4 M4 x
while(1);
" Z$ r1 H, Y) [" u2 Y, E
}
1 z8 ~% n& L9 s8 D" h8 l& I& s
! R- i3 _/ ^2 }) Y+ U
$ ^* C Y: Y* q ~
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& |1 }/ l4 ^9 i3 [0 l
/* Initialize MCASP1 */
" c9 B& H, S4 `
mcasp = &MCASP_MODULE_1;
9 k$ N+ E0 }5 @+ _, M! s9 o
mcasp->regs->GBLCTL = 0; // Reset
5 H" @& ?# {7 j
mcasp->regs->RGBLCTL = 0; // Reset RX
! B/ l& h$ ]5 C1 g z3 g1 z+ D
mcasp->regs->XGBLCTL = 0; // Reset TX
+ t3 }! |6 s# c* i5 S' I! w1 S( D
mcasp->regs->PWRDEMU = 1; // Free-running
. p( _2 S$ O% a, l+ j
// configure McASP0 receive registers
+ r2 T$ h N) I
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 @; i2 g/ g, s6 k0 |5 L9 _* h+ \5 C& P% a
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
g0 o* [( b8 Z
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* A- ~$ Y$ K& T! I9 B- e7 l
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
% R1 v# A1 H$ p/ r
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; u" F7 I; G! y7 e% M& M
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
2 X0 O6 K( Q6 c5 @( H
mcasp->regs->RINTCTL = 0x00000000; // Not used
8 s8 r6 P1 V2 Y1 |% M: U
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 _/ @3 A \; k
& v$ O5 M4 W, z6 h' e! T" k
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# u8 C; @2 h4 e& ]
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
9 {* g4 \; i; J- N. D, v2 D' E
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( I7 l4 R8 ~! [' O; ?1 | C h
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
8 S( P0 b5 ?: F/ A) ?# t) B
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
& g8 u1 ?* l3 o, h# J& ], e
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ |2 _/ U7 ?- x6 z0 C
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
$ Z: O, Z R% I9 U2 j( u% D
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* b& z& M* k/ f8 e) n$ j9 T
% }: T( H# k% d/ O% E
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 k5 g" a* Z5 P8 a$ @6 U& H
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' T5 x" t7 _- `, W! }1 E. g
mcasp->regs->PFUNC = 0; // All MCASPs
O: j+ g F, i
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
% e2 g2 }7 S% l5 d4 s q
" W0 P5 D9 F& W+ a
mcasp->regs->DITCTL = 0x00000000; // Not used
w" u0 n+ E2 O
mcasp->regs->DLBCTL = 0x00000000; // Not used
# w k. w0 W! Q5 n; L$ m6 I, t2 W
mcasp->regs->AMUTE = 0x00000000; // Not used
$ e' D) s' b! S3 [
+ J5 p6 C- F1 C$ a% i$ r# {
/* Starting sections of the McASP*/
: y( w4 X' K$ c# }. j0 s: n
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( E. W4 L4 b( J0 v( K# \8 s% u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
4 @) R; E7 J+ c. T$ H
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ S* c- y# u+ {3 k0 a+ }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 ]% A; ]7 K9 L1 s2 P) O
% A; g+ n$ p' h- |
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
: [$ w! e) g. x& R* Y9 }2 L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 ]0 [6 Z, G# C- D
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( F4 [) n% k3 ~7 \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 N. {# A# i) m) ^1 F, a$ L
F8 F$ }- [( }3 _+ H
mcasp->regs->XSTAT = 0x0000ffff;
: C% t+ S3 w6 c# @6 K
mcasp->regs->RSTAT = 0x0000ffff;
( F- f% F9 j0 Y' ^7 g2 O+ @
- v a" x h0 A0 S( D0 b* u
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 f1 f( B7 O& ^+ X9 u) L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 Z9 U+ G" ?2 b$ [4 n" M! @
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ q2 D3 U$ ~& w5 e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 j( s6 ]7 d% M3 t
, E1 }6 O% F! x- w" K
/* Write a 0, so that no underrun occurs after releasing the state machine */
' {- v. q8 G- o5 Y
mcasp->regs->XBUF5 = 0;
8 @7 {1 D8 x k/ G. d y' F
mcasp->regs->RBUF0 = 0;
. q+ M Y8 e, G7 W- ]/ S- r
& ^. y' }2 S& I9 _1 J7 ^ O( D, k2 T
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 z3 T* \8 @: E! d6 F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 l; _6 J4 |0 j# z/ y7 t4 M
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
& R. t% {2 W D, Z& n8 ~3 D) O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ a3 C; Z' [ M* O
! _/ I$ ^+ j1 }6 i W6 Q) v
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; T7 O" m) C/ I8 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 s) F C1 O% g a
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 `- `8 K7 A9 V+ N6 B0 E3 C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! [( Q' g0 I) q
: N+ B$ I; C: Q1 N- d
CSR = 0x0000;
# R L( b5 s. m3 @4 e
INTC_INTMUX1 = 0x3d;
5 s6 X/ w6 Z8 l7 V
ISTP = (unsigned int)vectors;
& z8 F0 |6 Z& Y% l
ICR = 0xFFF0;
& @0 ~5 \8 x5 [# J9 B7 k
IER |= 0x12;
- y5 Z1 r f; a6 C
CSR |= 0x01;
. M5 C6 X- G; `9 }" Q1 J I& a, O
K; _8 m4 x+ S; v7 r
6 U4 ], w( y: I# P& ]- e0 @: p& k, G2 E
' z6 p2 b* A& s1 U5 L
还有就是两个输入输出函数:
8 p. t2 Q* g2 B8 }2 l( s/ F
void output_sample(Int32 out_data)
# q3 A4 e' T' ~8 q; b
{
" z, O; D1 d+ F$ w2 c5 W0 f
AIC31_data.uint = out_data;
, v; U; r# {: q2 B+ b
MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 i3 v2 `; i: |: g/ E n4 c1 W
}
# P/ H4 l$ M3 r1 s% O
. X! Z2 ^6 R# ^, z: b
Int32 input_sample(void)
% q5 E% \; c/ D/ ^% X2 P
{
+ j4 ~5 h' E6 l8 l- y5 _
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; T5 |, R$ @" B0 L( W! c2 W3 Z
return (AIC31_data.uint);
/ @. t' v5 B' X: m( t. u5 j; [
}
$ X" x* W( C( M9 \) `7 S
: r- c9 j0 M: G5 @6 |
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4