嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: g. h; ]% e3 f1 d0 F# [& S
main文件:
8 \$ |9 D- q/ T4 \# f
interrupt void interrupt4(void)
7 d( E# x3 B; }* x* S/ ?+ L1 c8 E
{
7 T$ l3 c8 |3 p& s' X
Uint32 sample;
! \% D( ~& @! N" O3 i
* @, f4 o0 h2 s4 x& f! w
sample = input_sample(); // read L + R samples from ADC
) o/ B: [% { @) i
output_sample(sample); // write L + R samples to DAC
5 z0 P& e# P( g# a+ ?6 Z
return;
. R0 D5 R+ K2 |% o; a+ _8 B2 k
}
& o t* i' Y. @5 Q) y: h& d8 `! t+ p4 J, C
* m; _) x, @2 L# L, O/ c$ F
int main( void )
; ~! k+ [2 s1 J$ ^2 l
{
3 d1 V) h. M9 Y
' i& _( t) i z, v2 v* y9 E% \
/* Initialize BSL */
9 V9 S! b) n4 @4 v, K
EVMC6747_init( );
+ r7 o+ N7 H; o3 H
/* Call evmc6747_intr function */
# n/ Q! g) s4 U
aic3106_init( );
% W- [, ]8 u- N* s, Q8 v7 `- k
while(1);
. \: y+ w2 ?. E$ A! s
}
" c) F; V& b: V
3 a- e/ r! I$ Y5 J6 K$ o1 S0 H' G) b
- B0 a9 Y( T5 ~9 O: {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
, y% x# c$ H: R
/* Initialize MCASP1 */
! A% s# ]* L1 c9 i
mcasp = &MCASP_MODULE_1;
- i0 _2 R- G i6 j |8 S; S% E
mcasp->regs->GBLCTL = 0; // Reset
; z. a: S8 A! v. H
mcasp->regs->RGBLCTL = 0; // Reset RX
b$ p3 x7 u: v2 v" d
mcasp->regs->XGBLCTL = 0; // Reset TX
" g+ p0 b: }* u2 E
mcasp->regs->PWRDEMU = 1; // Free-running
7 m8 E1 x% [" f
// configure McASP0 receive registers
0 f( g1 C$ J4 W5 m7 N1 Q& {
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
2 V- t* E- G T) p2 B) \
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% g. o/ P0 [- o. ` ~) ?, H
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% C" i! B, _# d3 {; Z
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; Q3 i/ ~; J, r! u" [
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
# Z2 l: }3 B2 O# y* v9 S i8 ~' K8 C2 E
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' Y1 U& {* t9 p: I
mcasp->regs->RINTCTL = 0x00000000; // Not used
8 ?! u( g# F# T1 P9 `/ i. `& _5 K
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ L( [7 `; a5 @# f( s2 |
; l' L! G7 j( r; u& b0 J2 t
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 v& ~+ H5 Q: l6 ?$ }* R
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% U* `$ B1 W1 F9 P1 p( K; ?% [/ ~
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 \2 x5 Z- a4 z X/ h4 \3 V/ K8 Z
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
3 ~! a& ?5 m% J( {( T3 B
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
. i5 v5 \/ [$ X0 ~2 o% h! t6 ^
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
' y" h) @7 _- V/ P8 u9 D" v
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 K# C" F4 M% Z z, s' ]* r6 s6 c
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, I6 | t% l* j5 n
' z/ j7 t. N% J# s7 z) p, [5 _) m# G
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
$ }4 ~; o! z, B$ l1 [' w% w
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
$ g. w6 g$ |- }, ^, J
mcasp->regs->PFUNC = 0; // All MCASPs
, @, N8 q& ~/ F& E$ r8 d
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 d2 y C7 U/ D2 q6 i
( U# O) C5 e7 ^( |
mcasp->regs->DITCTL = 0x00000000; // Not used
: _% f6 O( b$ Z3 h# ^! |' }
mcasp->regs->DLBCTL = 0x00000000; // Not used
( Q; m: j9 P& W% u( [
mcasp->regs->AMUTE = 0x00000000; // Not used
% ]; H1 E" K2 Q$ ~4 |
9 e# b+ ]- t3 e. l/ B
/* Starting sections of the McASP*/
2 L8 x- T) Z5 j6 w
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 ?1 i4 C) y; \7 \( R, J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
) p5 U1 H- F; u/ ]) j ~) M0 Q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, H0 A* w% R, [, [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ n' R' j3 s, f- A+ n t0 p
* e+ v& m b# w. y V# n1 r% t
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) b$ T7 S, a' j9 M& f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 @8 t5 k2 X! }& @
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, c) E& q3 ]# ?+ T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) x$ w( `" A& I: p/ n# b
n+ s3 O1 X+ K4 g6 R/ c
mcasp->regs->XSTAT = 0x0000ffff;
0 w" I4 w: x, R
mcasp->regs->RSTAT = 0x0000ffff;
1 \; W3 i# l& P6 D* b& T c: t
5 U* ~6 c5 P4 Y" N' o
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% Y4 u1 |& z: i) e; @ q5 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, \+ ^% g p) `7 t2 [* d
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& I0 h: I H+ H" [4 ?; X3 g! M S8 l! s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# I5 M# I) a# |4 C: h8 I
# l. P2 H- G" ?( M% [
/* Write a 0, so that no underrun occurs after releasing the state machine */
7 B* P) V) n' D; h9 e. Q( h! z
mcasp->regs->XBUF5 = 0;
8 V8 L6 M1 T7 H; ^6 z8 ?$ v+ M8 |
mcasp->regs->RBUF0 = 0;
; K* F" E, H6 m6 S9 w
5 q8 j4 C" s- f$ M. I. g
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 w' y2 O) s( {* x) V) V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 f' ^5 k1 i; q9 F4 I0 z$ r$ ]
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# e+ n* X! t$ r5 e. g- _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* E J& Q6 Y7 y( X: P
2 r+ {7 T+ ?% Z/ n
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# U f5 s' \/ B4 u6 y$ V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) x, s- F+ V( d6 q
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 b4 s% {) S/ f9 V; b# s" y% V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
& W. d# L, F1 d5 K( U( E( E! I* N9 N
' s# R# A& g, t+ ^
CSR = 0x0000;
! e6 I6 t8 G7 w0 o
INTC_INTMUX1 = 0x3d;
$ D. U/ x0 f4 @2 ]- O5 l+ v
ISTP = (unsigned int)vectors;
" t' x6 N& e* B K
ICR = 0xFFF0;
0 p- g/ ?0 ?! V8 {: c9 b2 _; M
IER |= 0x12;
" i6 Y- v$ U5 y4 J& c2 o9 X1 {
CSR |= 0x01;
& S0 G: Z( y [. k7 B K
- h% y' j0 H) L5 F
7 J' U" e7 @+ j9 I9 |
+ t3 U w& P) ~# p" Z. J4 {
还有就是两个输入输出函数:
3 k& l. I- J, D, H! U6 H% @
void output_sample(Int32 out_data)
3 c0 f, ~" W8 ]* b5 H
{
( s \! n$ ^0 u4 t) Y2 K8 L. {
AIC31_data.uint = out_data;
I. z% B% B+ V( A' o" I
MCASP1_XBUF5_32BIT = AIC31_data.uint;
; |! |' f4 o1 d- F6 J
}
3 `1 P/ \8 J4 k' T! E: y: t3 z
: H0 ^; { s, p# {
Int32 input_sample(void)
7 {9 B. C- H( R/ N% r
{
1 ]4 ^$ X& @: ~& C
AIC31_data.uint = MCASP1_RBUF0_32BIT;
5 \' k2 x, G N% R8 H
return (AIC31_data.uint);
. M; T C; p( E5 j3 H" @% J0 r
}
% ~8 i$ W, G: C" T; _. E- j, \+ @
' v' u. X6 R! u
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4