嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 z9 Q0 {9 L$ U- J3 n1 m9 Q
main文件:
* |0 o8 [; l, T# W8 ^
interrupt void interrupt4(void)
! D! m9 ], g+ b. T
{
. C0 ?: e2 N: {0 M# t8 o4 q
Uint32 sample;
9 M* d v: _6 S' d
1 U$ ~5 P: H/ ~& L8 ]' s
sample = input_sample(); // read L + R samples from ADC
l% o, G( j, L# i3 A$ U
output_sample(sample); // write L + R samples to DAC
3 H# ~ q- R! J3 C# M
return;
/ s; G# L" v& e$ j- v; O( j
}
$ r' E* E% i0 q. ~
8 F% H0 W" ~5 a) h
int main( void )
3 h: v& @& J9 S( Z& \* i! e# o
{
/ W% n, }% L+ y$ d; O: Z6 p
2 T) n; i3 ^. j
/* Initialize BSL */
2 i% l; b/ n% K o) S8 v
EVMC6747_init( );
' u Z' C7 m! P5 k K
/* Call evmc6747_intr function */
* y3 D0 u. ~. I/ O b3 C( S
aic3106_init( );
0 S9 R/ O* f8 u) O/ {3 F3 q3 V; c
while(1);
$ v" i+ V* ?! |; E' H9 H9 _
}
0 k6 c* h7 _+ h6 E
# i- o& b% x$ t3 s5 O
* Z2 R: ~/ O, y6 b/ p. T2 A
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# B1 C" s3 Z* m& E# d
/* Initialize MCASP1 */
# D/ x* K d7 g
mcasp = &MCASP_MODULE_1;
, ?, r3 k5 y, @2 M3 ?
mcasp->regs->GBLCTL = 0; // Reset
7 v2 [& _ D& t4 S; w* b' ]/ Y
mcasp->regs->RGBLCTL = 0; // Reset RX
. @: {% n* |: @; \
mcasp->regs->XGBLCTL = 0; // Reset TX
- }4 O' O, n+ s$ ^& o. `5 }
mcasp->regs->PWRDEMU = 1; // Free-running
( S; m/ C' l8 D" w; Z
// configure McASP0 receive registers
' r7 b% Z8 Y8 r7 H& ]; z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% Y7 @2 K" h. M
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 c, L! F0 c$ ^- R8 n
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
3 L7 d( v$ \. F) K( Z/ V2 r$ d2 I1 c" s
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. c$ j4 Q. X' J+ K
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
# a7 v' z) |( g
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
& f! P% D) j- D; Q9 Z9 M# s3 p
mcasp->regs->RINTCTL = 0x00000000; // Not used
9 L; W0 i* `( N, ?
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 P9 a" K6 U8 Y& f5 y
+ y6 |) A n6 B% ?5 l6 _
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 \9 t& M4 `# Q
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 K( U% h! Q$ Y4 A$ I7 |% h4 t3 g
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 d# U' v1 R# g' B! I
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
1 N6 J5 s9 v; @* Z# f: t
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 ?. l3 M W1 [
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 P4 V: J2 n- f, k9 Y
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
! f/ l* b( n. d- u
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
c" i. v7 h8 y# |5 {/ R1 X e
, ~% R a; o8 D/ E& g# J
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
3 y% Y1 U# o4 ]! L3 k2 A( q
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% N1 f; A' H3 k3 U- L
mcasp->regs->PFUNC = 0; // All MCASPs
9 G) L8 b3 z# ?8 u3 y0 i
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 b; p2 L `+ @7 ], k, H( y T' M: r" R
+ r6 v9 j) E8 S. ?& i+ m
mcasp->regs->DITCTL = 0x00000000; // Not used
3 I* f# [- J E/ q j
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ `8 C# e% i, V/ i, H
mcasp->regs->AMUTE = 0x00000000; // Not used
) X5 M6 \4 z E
! W7 y6 b$ l* O- u3 x; C. D
/* Starting sections of the McASP*/
- @8 ?4 h- C& Y0 `) T
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
/ |1 e! ?0 a2 H, @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
; b( R$ o( G3 L5 e! u/ n v
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% k1 s6 [2 f# a' u2 _# P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- f. Z; P" c8 M- T6 n$ ]
8 e7 A# d: X% m& b+ L, T8 E* q
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& Y. h" c" ~9 g( _9 y- Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 w4 t7 b) l5 l- m7 q* z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; k+ }/ ?3 W# O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
2 a- f/ o; @6 ~' ~0 F( O
1 b) ]$ a( y. \- D% W5 Z' _
mcasp->regs->XSTAT = 0x0000ffff;
2 a/ i5 _7 O, x% T" T* V3 s5 ~" G
mcasp->regs->RSTAT = 0x0000ffff;
W+ q+ x4 i! V% Q( k% U9 N
0 l! f1 [# ]! [& x1 n
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* @! D* d; h; x$ q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ Z7 ?7 K7 M5 m+ p" y+ b
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 q5 D1 W5 p( J. M `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
% Z7 Q+ h6 Y* b, T, h
8 v3 A R% W6 a, l
/* Write a 0, so that no underrun occurs after releasing the state machine */
9 X8 a* c; B, K, K6 T
mcasp->regs->XBUF5 = 0;
6 E6 V2 n% o* F$ P: ~
mcasp->regs->RBUF0 = 0;
. |2 A! z8 C* j& r
2 u4 @9 ~& j8 ^ ?. ?
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
% @: f7 G3 g R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 j+ d7 `$ u, ^/ X- _
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
1 |9 S2 x% W; L ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
. N0 V7 [; Q$ P. n& A0 T$ Z
1 f I" Z$ F7 X5 p" q6 y3 U8 J
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- a! n% ^8 s1 x$ P# \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) Q5 Y' L! X" q. h6 `& k( h
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
, y/ {/ s- o2 V* }5 d5 b' p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: O0 z/ |7 z r7 q7 B5 F2 s" S6 G
: K+ z5 E+ h5 b8 ^ R
CSR = 0x0000;
& _+ \$ d' L7 _3 v V. h
INTC_INTMUX1 = 0x3d;
}; |2 b3 [- e
ISTP = (unsigned int)vectors;
8 ^1 m5 C& g, q, j: n2 F# i) ~4 M
ICR = 0xFFF0;
" U7 X, F+ U, R9 z- x- u, r- q
IER |= 0x12;
, N7 D. s8 j/ q7 R" \4 `: g9 J; c
CSR |= 0x01;
/ N5 O, q+ y7 g, r. b) ^ `2 }4 Q4 e
, f" Q7 E% q7 j2 Q
8 ~9 Z5 J8 Q' I# z" \0 Z
8 l" C0 @" y% l7 R9 e
还有就是两个输入输出函数:
1 a( x- S0 x0 q7 T7 O
void output_sample(Int32 out_data)
. ]" B: H1 t) d C t
{
: O" E9 O0 I: N; \$ n2 \
AIC31_data.uint = out_data;
1 t( }" k+ W: c
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) d& j6 ~& n d, r! i) ?; H
}
8 b' t: i. D7 T# Z4 G
. x7 I* G u/ \2 i3 K8 n
Int32 input_sample(void)
4 K( F: x6 W- i) S5 k
{
- L, F. C+ j! P) S. z7 T8 ?9 Y! ]
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ S2 c0 W9 t A
return (AIC31_data.uint);
5 f8 U0 p) d, q6 I4 B3 T
}
- H# G( P: L7 r) L2 w/ H
4 ~- x7 K& L) V$ D7 w* f' }, F' P
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4