嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( U* a4 _1 y3 U& `; G' K( z
main文件:
& f* m5 b \9 C* X
interrupt void interrupt4(void)
& d: J0 ?5 C, d
{
( y t5 \) c8 W. B
Uint32 sample;
3 b1 y* H7 j5 o0 E7 p
# T& E$ u" p( C' a+ U
sample = input_sample(); // read L + R samples from ADC
9 l9 A3 i, ^) Q2 i @0 d9 z
output_sample(sample); // write L + R samples to DAC
0 k4 K( M" ?- H4 H. n8 Z
return;
" `- \+ k3 h9 w0 R9 @
}
, W* C ~! @ q* |( S6 r4 G
2 F- r* ~' O/ p' z* \) W
int main( void )
+ ?+ ~( F4 K0 w y; ?- t
{
' Y7 u, M: z6 \, y/ f
* U3 q- G2 h7 ]8 f7 q; q
/* Initialize BSL */
1 ]: K% R9 ~. H; b* n# I3 g
EVMC6747_init( );
5 W/ L! w/ _; m# c% T
/* Call evmc6747_intr function */
% m) k- j% O3 B3 Y ]1 y
aic3106_init( );
. l. g/ c0 ?. _* z
while(1);
% ~8 d9 ^% p$ j: O" L, V8 k1 \
}
9 W i* V2 ?, Y
; {# t2 c' r: w, [6 t
7 R2 v4 k$ d0 d( G9 J- k; m3 ]
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. S" K( \' z T5 I' T9 y V
/* Initialize MCASP1 */
5 h/ B* V( Z' h) w; O
mcasp = &MCASP_MODULE_1;
% s8 b3 M" j8 ~$ N
mcasp->regs->GBLCTL = 0; // Reset
5 p* x1 r- U) Z
mcasp->regs->RGBLCTL = 0; // Reset RX
x2 X* ]; {9 [' t2 X |
mcasp->regs->XGBLCTL = 0; // Reset TX
+ i3 T, u! x" v+ l- V9 _
mcasp->regs->PWRDEMU = 1; // Free-running
" G. \# F2 |" U4 w( ?+ s+ J
// configure McASP0 receive registers
) p6 B8 H& k( ]
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
2 G% |: \8 E T/ x& y% y) |
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ A/ Q6 o' A% F$ a5 e% o9 |. {
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ B! O! x2 S" z$ d+ K2 \8 V/ z9 _
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 N% p* B: r( D4 V
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; q- k' Q" F3 ]9 U
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
. Z9 K( X# C5 N" x. \ n- X
mcasp->regs->RINTCTL = 0x00000000; // Not used
4 F$ }- }9 j( i4 K3 o' ]% y& V2 C
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# @2 g' h$ \2 k
, ?* W/ n; z5 `% b8 @5 L# e
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 n& R! z, O( G5 }7 c3 B
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 q7 L$ }* d9 l+ \" r" y" m7 a
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 v3 T% S* s2 N! [: O6 @, V
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' ?# q8 Q- ]3 G4 d; g$ B8 E
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
9 u( [3 J2 P2 z9 j) P, X/ R* O
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
3 Q# Q. p# i. D9 V* G$ N
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ A- P- A* E) Y: [) [
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 O8 C5 Z5 K2 Z% y7 ?2 Z2 o
% l& a$ w0 t- m% U
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
\5 V0 _ N; N- l
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
6 L5 t8 a6 Y5 f
mcasp->regs->PFUNC = 0; // All MCASPs
# x" o: C# [9 ]2 d7 T; p1 P6 I0 }
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& F' W9 T" w" `! U8 P
: z' v8 j% E0 H
mcasp->regs->DITCTL = 0x00000000; // Not used
! b$ L8 C/ I( V0 N2 \6 B4 ?7 T$ S) v
mcasp->regs->DLBCTL = 0x00000000; // Not used
8 v5 W2 J0 k* K. `' b" B; B! N
mcasp->regs->AMUTE = 0x00000000; // Not used
& W% G/ ~* _: I! o$ R3 J4 l) _
4 }& t. w2 w7 d& @9 T/ H
/* Starting sections of the McASP*/
# b$ V2 j% M9 V- K
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
, N' ^9 r5 t; F' Q u7 O" T( m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 S; ] B% B2 f/ M2 ~: d2 h
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( X1 Q& {! I0 O/ ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
' o3 l. P8 K9 p! Q
3 I7 ~' t T# O- n
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; w7 @2 Q# E! _$ E) o; D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
I2 l) U. S8 [
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ ~7 _0 A: L; @' l' X4 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# }) G% b- b" q- B5 o- y# @5 e
/ L1 o* d8 M( m2 B. O* h" l
mcasp->regs->XSTAT = 0x0000ffff;
9 Z% v' |5 @& s" c
mcasp->regs->RSTAT = 0x0000ffff;
) F2 B0 s. t6 M1 H( u
6 v5 o w+ o/ z# T/ o" P/ n* E7 n
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
4 }# Q1 }! ~* p. J& @8 ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 c% h1 M& a' Z: m8 m+ |
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 B9 [ N6 p: d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; Q/ Z6 B. a# ?% s$ J* L6 _* L
/ z" C! F4 P) O1 A1 h5 ?0 v
/* Write a 0, so that no underrun occurs after releasing the state machine */
' O; H I9 @% O+ g1 }4 ]& h
mcasp->regs->XBUF5 = 0;
9 i$ @- J2 D$ C D j4 Y" G( d5 l" P
mcasp->regs->RBUF0 = 0;
1 v, I; N9 e6 @; U' g" { G' X* C: E
; Q1 }# q7 ^8 ?$ p3 K5 `
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
( ?$ A$ ^+ B+ }) v/ S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! X; c8 O0 V2 _, ?7 o
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: b) D! \3 Q+ {+ W5 X+ H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# L' e/ |2 A- A+ U. H
" S* R! @) C3 T5 c
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ _8 H; a, o" x2 w# z: Z6 W; `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ G: s* C- g; {. K
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( S) U+ `5 U8 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ y- i/ O8 I7 B2 C& b" B( K/ _9 L
l/ y+ A' ~; Y+ Q# q4 f
CSR = 0x0000;
( I: y D) j& C4 `+ i
INTC_INTMUX1 = 0x3d;
% G8 g" J7 a' d$ d/ v+ z6 F/ a& F
ISTP = (unsigned int)vectors;
/ y$ O/ i- p" ~5 ]- S
ICR = 0xFFF0;
0 h' N6 U ~2 [8 L6 @- B) I# M
IER |= 0x12;
0 v5 i R6 I/ o
CSR |= 0x01;
* @% v, q5 Z g) V% T3 ~/ r' j
2 A. y+ y0 P# J) m# _
* s. ^: }% T+ A- x* b. l
2 t5 L6 a* Y; r- T `6 @3 R! i( |
还有就是两个输入输出函数:
7 V6 w) W' Y$ x$ m/ a* _, n0 B
void output_sample(Int32 out_data)
2 o8 n0 p/ ?& b8 c5 G% k2 R
{
% G$ V3 c) _8 @7 W# h! k% e4 R
AIC31_data.uint = out_data;
, |/ V" d9 ]: p$ t# Z+ x u* e5 u
MCASP1_XBUF5_32BIT = AIC31_data.uint;
, I" X6 _( K6 B
}
( N, Y: q G4 ]. W3 t8 ]
! q; C' ?3 {2 Q* v
Int32 input_sample(void)
3 ^+ G* B+ q7 m
{
) l& g4 H0 b& O2 ~$ Z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
: ^6 E+ X) t2 H; z2 ^
return (AIC31_data.uint);
/ W P' e+ O- t7 ^0 C) ^
}
2 ^3 I* }' n9 B% I0 R5 \
+ f/ L# t: h. F' ^
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4