嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 | ^6 P! A0 d7 Q+ @3 F
main文件:
4 `- M7 s* P2 t
interrupt void interrupt4(void)
+ w* f: \) C: I8 }; k9 T* P
{
' c4 ]$ U! ^* S9 t1 R
Uint32 sample;
( L0 h! Y7 A. c2 |8 T1 L
8 ~0 B. P: X2 |5 |0 U* Q
sample = input_sample(); // read L + R samples from ADC
8 y/ g# b7 R( r, i3 B) d' S
output_sample(sample); // write L + R samples to DAC
0 a( D/ [. W' U1 Q
return;
/ o' N8 C0 @; V$ B$ u0 ^9 ~7 j
}
- Z5 C' t! H8 q
. z% @1 l3 F6 J ~! E. c
int main( void )
# W: r& G4 K z
{
C" @3 R9 @2 D0 k( q
7 @4 T+ w7 y6 k+ y- \" c* ^
/* Initialize BSL */
: x- A" l9 j) C( C
EVMC6747_init( );
5 d C) t4 t; Z& o/ I
/* Call evmc6747_intr function */
0 E! {3 |, B( F; ?4 R( d* D# w4 I6 c
aic3106_init( );
+ h& ?: K, F$ u* j8 R8 J( L
while(1);
7 b% q) S3 F7 a# ^5 S5 B6 W8 P
}
v# k3 u4 U$ f! H
( Y: g" U, w% w" A% x8 U1 L
* v6 V/ p3 d1 O# j. Z" F* {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
: G' s$ a) P4 G) O0 V" s
/* Initialize MCASP1 */
# C* A- {+ U# X+ k5 h
mcasp = &MCASP_MODULE_1;
; z4 @2 H& X! O5 m0 a3 Z. i% `
mcasp->regs->GBLCTL = 0; // Reset
2 g$ T6 ~1 v `3 M( ]3 o' S
mcasp->regs->RGBLCTL = 0; // Reset RX
# @* d' i, C4 F) `$ Z
mcasp->regs->XGBLCTL = 0; // Reset TX
- p; e; L& F4 R& i/ w
mcasp->regs->PWRDEMU = 1; // Free-running
, E* X. ]! v# u& ~8 C+ B% d0 ~& H
// configure McASP0 receive registers
" f, X$ z2 L7 h
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( k- Y! T0 [9 z0 l$ {5 z: S& t; R
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; t8 i/ x, }3 M6 ?9 [$ ~& s
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ E6 }( ^% l! j8 I" R" L' j
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 Z2 A9 R2 l% H3 `, ]# D
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ g2 ~/ f' d/ E: W1 A
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 R* m7 F1 g. `! G: s
mcasp->regs->RINTCTL = 0x00000000; // Not used
7 u* x- i* E4 K0 R9 m! y$ z7 C/ }- |
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 O# b* o& j. R O8 x
2 `' s3 Q" o' Q: J
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
! b7 V, P. M8 x- d, O: j' W
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 I/ Y3 W* u' T9 t
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 b) y5 _" }" f, C0 D
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* v* r( A n4 W$ m# z) q. D& G
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 E# {) H$ N9 V; U" B% F
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
9 f2 S; R$ U( C( ]
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
3 f6 v z3 ^ e$ T: ?, j1 _- F
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ p0 I5 R. R5 m- b1 v' o+ C
# o3 e7 j2 r# n& D
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
! T% w& z2 T8 C4 e3 O' e( Z* l" i
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" w& ~8 Z3 C8 A+ Z
mcasp->regs->PFUNC = 0; // All MCASPs
) Z# Q7 k2 u) |2 K- e6 A
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 I9 p5 h! W! O
+ z! h0 i. |2 g0 y
mcasp->regs->DITCTL = 0x00000000; // Not used
: i1 X; O# E n/ A5 |+ Y! h7 \
mcasp->regs->DLBCTL = 0x00000000; // Not used
+ h* A7 P, o; Z% D( ?) o
mcasp->regs->AMUTE = 0x00000000; // Not used
+ Q5 | L H6 T9 D: b; J7 b7 L9 H0 P) A
& r) U2 x; o; }( L* i4 F) Y2 T1 G
/* Starting sections of the McASP*/
/ {0 C1 _1 ?4 l- v
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
9 P3 k! K- [0 d2 Y h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
' o6 b7 h4 P4 J- ?8 s7 c
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
' k$ e: ^- w+ r6 C% N; ^% s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 q1 V0 z3 H* Q/ l4 V" Z; T
' _- c- ` \* D1 Y! U# Q4 ^
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 R. u* U; N0 Z0 S1 @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: M2 @) r9 m. A6 J( F B0 Q6 z" u
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, c& O! i2 m5 B) L1 o7 r
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ }, D: W$ }4 T6 F3 d; U
: r$ `, e5 v1 J5 i$ i
mcasp->regs->XSTAT = 0x0000ffff;
& V2 ^# b9 a9 [3 o" @- _
mcasp->regs->RSTAT = 0x0000ffff;
" x7 ?+ O" ]8 n; {
$ p9 c) C# W' L1 g8 U
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& P- r* B9 U4 k* ^1 d% U u2 L. [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
. b) X0 n9 a: L# [
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% k) D" B. C: j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
8 _: J& h3 O$ X; K+ W
' S1 g% v Q" ]' L. B
/* Write a 0, so that no underrun occurs after releasing the state machine */
: [+ g5 s4 l2 x
mcasp->regs->XBUF5 = 0;
/ Y" t Q- y7 Z8 F; d( z
mcasp->regs->RBUF0 = 0;
1 y7 K N. O% u& L5 y9 d. a
; E1 y1 T' a4 i+ [& t
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 c+ @5 t/ L0 j- j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
) i" h( `0 l9 `+ V/ ^
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; ], ?$ E4 [& y& s: }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
! ]7 F1 G3 `( m+ D4 @
" k. x- \% j$ [3 ~: R
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 |1 r c" T& D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* N X8 l; R" T
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# B2 u2 _. G6 r4 g1 S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ k* h3 W. ]# N, V8 L
4 n8 l# i% I3 }" q% v) ]( \$ W8 e1 {
CSR = 0x0000;
) W7 I2 E# e& z" C4 B. y% Q% s; O
INTC_INTMUX1 = 0x3d;
) b% H% i9 G# R1 @
ISTP = (unsigned int)vectors;
0 d9 L0 E! ~5 A, W
ICR = 0xFFF0;
" c& i1 A4 e, s) k8 j
IER |= 0x12;
: R% x! n# C8 `6 ?8 d. g- W
CSR |= 0x01;
* w: @! F) C2 Y
3 I) y' s9 }+ N1 e% p
" O* N f. h2 u* O4 l Z8 m& i% Q, t
7 r: q) q; |$ p
还有就是两个输入输出函数:
. z* E3 @2 Y& M( K
void output_sample(Int32 out_data)
7 p3 B8 d) V! [$ ^
{
* j! d8 v( [7 `0 q# n0 M# x
AIC31_data.uint = out_data;
% h$ g; G6 s6 @. g, W, g
MCASP1_XBUF5_32BIT = AIC31_data.uint;
, s( c; J5 {2 h
}
. r5 F, m% `, Z' c! @* ? R0 d5 }
8 r% t% A; J1 `% v6 K- p
Int32 input_sample(void)
2 }: V: b* w# U# ]
{
- n3 ~2 F0 T8 S5 S5 v& p
AIC31_data.uint = MCASP1_RBUF0_32BIT;
& L* Q. P$ Y$ f3 U
return (AIC31_data.uint);
& t: r0 H3 b2 N1 S
}
- @9 i& _0 z0 B" J
6 f- _- d+ Y6 j, t
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4