嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 C: q' l' T2 C
main文件:
8 ~: x6 s) Q5 X. R
interrupt void interrupt4(void)
0 W) b2 r, J# Z+ r% H) Q& c" u
{
2 F- E9 F# u3 y8 R: H
Uint32 sample;
0 ]4 G0 s% e# K/ l: ?. k) _
# r7 V: r* \1 A' Z( q& b# E- B+ B
sample = input_sample(); // read L + R samples from ADC
5 k. {4 x- J/ V9 @3 }- J2 r
output_sample(sample); // write L + R samples to DAC
% a( D) D$ g3 K
return;
2 z7 t% v( P) d2 T% \
}
3 V. p; `( @7 f
" U2 V( k) j' R% n1 y" Y8 h X) m. ?
int main( void )
1 @ ]* f& A4 p) T5 k q2 c: I" J
{
# F8 i0 r' Q7 N0 t
& @6 h4 H5 P3 n g7 J* s
/* Initialize BSL */
, s& F' L, l* w, c6 i# `
EVMC6747_init( );
0 n \/ {! Y# V, i0 s1 R$ n- V) v
/* Call evmc6747_intr function */
]1 V* l; ^, W& s- c5 n1 s4 e8 D
aic3106_init( );
" X2 [4 j; a' e; a) G
while(1);
j/ W, Z0 A! H& {) B
}
3 r' o: A p" ^. I
9 h9 m* M$ v; I# L w* }
# {) k6 P6 }/ I& d( w3 _
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
( a0 P! s! }1 |+ u
/* Initialize MCASP1 */
4 J& m$ d* P# `. ^5 W% u- q1 p1 K
mcasp = &MCASP_MODULE_1;
/ o4 W/ X& ^4 [5 q9 ]$ b; d5 O& i
mcasp->regs->GBLCTL = 0; // Reset
& P2 k2 U# Y, N+ s7 ^1 U$ V3 U( L9 C
mcasp->regs->RGBLCTL = 0; // Reset RX
`( _7 w3 T; i6 E+ G8 K
mcasp->regs->XGBLCTL = 0; // Reset TX
& m/ W& ^5 n1 v- ~
mcasp->regs->PWRDEMU = 1; // Free-running
( ~" z4 J9 l* ~' X* U! Q
// configure McASP0 receive registers
* H6 `# J3 h$ L4 W6 x
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
5 ?; ]% o) R: _9 m
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) e# c5 ~4 M+ E
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" k! c; s4 `. A4 O( c+ I9 {
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ {6 k5 K; r5 Y3 H; C, v# B3 J. a
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' e+ L- s4 Z1 c8 F
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
# ` U" f$ d+ U Q# Q) K8 ?0 Q
mcasp->regs->RINTCTL = 0x00000000; // Not used
R1 q) p' n' O/ F3 N/ S' d
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
W# r/ Y8 W0 s! D' X7 ?
" \* D& e6 } S) g. P/ {& ?5 V
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" l% m! R0 f0 \2 H2 b5 @+ L
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 J8 q. m3 t6 N
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 H0 b, G4 `1 O ~1 u
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* Q2 _$ Z% J* }1 ~* Q( m# N0 Q
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
6 ]* j( t) o Z- J; O2 a. v
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
5 ^; _, [2 B3 L
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 |+ m7 a4 t: t* b7 o
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 x2 o/ W) S! Q: s5 L6 \
( ^! A$ d* y7 u. l
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 L3 D3 O8 e8 W
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
2 x9 P* N; p. x @# ?/ D
mcasp->regs->PFUNC = 0; // All MCASPs
* e* ?* h B6 d4 q
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- H9 @5 M% Q( u8 a. g# q' B+ m
. o' y0 h7 {, M4 `6 E; ]3 _ \3 B
mcasp->regs->DITCTL = 0x00000000; // Not used
, q$ p, Z. w3 o
mcasp->regs->DLBCTL = 0x00000000; // Not used
- ], j1 E. I) n
mcasp->regs->AMUTE = 0x00000000; // Not used
0 C% L6 y3 ^3 J. l5 K' H" Z
3 F% g7 g! h# Y; @
/* Starting sections of the McASP*/
5 R- N5 y; Q) T0 {' Q
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 F2 k1 n! R1 }5 n7 A5 |9 B; F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
* I* K ]) [* K( L' }. q! n
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 e" U- K2 C3 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 }. U. ~& T# a0 r* u
' G; B5 C4 J, Y+ p6 F, @1 L: u, `
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* L+ b& Z, n& J) t2 D2 m0 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 l0 G3 X1 |* I0 `9 l+ k
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" ~) g X P9 L$ O$ ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
, D4 N$ S# f2 x$ K; i$ |1 Z
; X/ L& V) n* p9 B
mcasp->regs->XSTAT = 0x0000ffff;
0 _' c4 b8 r0 k% U' k/ @' M8 Z
mcasp->regs->RSTAT = 0x0000ffff;
! f; O$ S" S' B8 W& K8 D
1 w" O& S2 d" h" p
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ f/ c: {+ ]" L, x6 M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 u3 |4 Q& g: D0 a: T _' g) ~
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ g5 n1 d. R* ?" C* W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 z% l" p9 ~2 b, |% B
0 u1 J, J8 }4 u' x0 j0 }7 f
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ {* `5 U1 H8 ^$ F
mcasp->regs->XBUF5 = 0;
5 [6 q* e7 {7 B, g, D, o
mcasp->regs->RBUF0 = 0;
2 r2 q$ m" X1 m( Q! \
- l3 v9 i# d, X: ]- W5 |
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# E7 T8 v4 [( V% M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- V/ n+ o* b# H; N/ U+ J' [
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ e$ [# r$ [* c6 m. L1 r: [) s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ C3 O: N4 o& j' D
`9 R5 t& T: r& J/ C8 {
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 ]- T, B4 W+ U! Y- ?* H; S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 g, u! E* Y9 j3 ?
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# f$ K) \/ n8 P) _7 s" j; g/ `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ J* M# i; d i- Y. n7 c/ _. W
0 j$ U$ s! c% Q
CSR = 0x0000;
2 O$ c Y7 \! p8 u& @3 ^' b8 d
INTC_INTMUX1 = 0x3d;
- c! h9 T: G6 S
ISTP = (unsigned int)vectors;
! V' e# U5 w. ^: [
ICR = 0xFFF0;
9 {/ p1 B6 O- `, `# s0 r0 p/ q
IER |= 0x12;
' B0 P6 ^) E2 x2 P; C: L* b
CSR |= 0x01;
) W5 q& l H9 {1 {) T u' v3 F) R
7 n) y3 v( g' p- c
% A9 U% `0 m" b8 J( ?* w$ L
; e* c5 ?8 t( W" u
还有就是两个输入输出函数:
% ~8 I V0 o, o: F
void output_sample(Int32 out_data)
, F8 M/ p& a/ P7 G# j# e
{
, e6 S% w9 B- Q3 R1 Z
AIC31_data.uint = out_data;
6 Z; b8 j+ x; N& _7 `' D
MCASP1_XBUF5_32BIT = AIC31_data.uint;
( F2 w/ \0 T+ V( o5 I" B
}
3 ` \" K2 x3 v+ m: {% r' k, V
" Q' l) N0 U7 U5 T' L& g: p
Int32 input_sample(void)
7 T W/ C& T3 J
{
! f m( ?* M( W5 e
AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 q) n* G r/ O
return (AIC31_data.uint);
$ g3 h$ `4 H7 C8 C' r( r, X
}
& z7 A+ q2 B; O# V
3 o5 M% x3 z. h4 G0 Q, E
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4