嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ l- q. p3 @4 N* T j, }6 h# T
main文件:
: O0 {% d* c( h R) y
interrupt void interrupt4(void)
# M" p7 b. Z6 v* G8 L
{
( C( S1 C' r9 e& t+ d0 j0 P' ?
Uint32 sample;
% ^" x2 f2 d/ G" s7 h
1 y# G9 T4 e3 [- ~; D+ X, ?
sample = input_sample(); // read L + R samples from ADC
- A* Q/ O$ _6 ~; A7 K
output_sample(sample); // write L + R samples to DAC
# d( \( B8 x+ ?9 l: h. S, x
return;
) g; t' [1 i; k1 V. i0 H' `
}
R+ Y: E! \" Q4 F& d1 v8 y( x
, o5 N, ^0 c0 E& I1 z1 B
int main( void )
; N0 ^. }% n, |7 C; M; u& }
{
) p( ~& \1 Y' C. X# y' ~. b) B
) E9 p) G! i- g) q( Y0 C$ p
/* Initialize BSL */
. R& e# I: x" A) W0 f' d# H( o$ G
EVMC6747_init( );
. y# K m& b1 w; X( v
/* Call evmc6747_intr function */
6 |+ C3 l2 D C$ G P
aic3106_init( );
+ m: I" X0 d0 s' S$ M$ U# D0 ]3 Z" J
while(1);
4 h2 M3 X' l1 V% u, T$ x+ \
}
' I* x3 Y5 r3 [) B' _# C
C9 E* {2 Z0 J0 U2 b$ f
$ v) @ P, x z4 s, u! m
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 `$ F$ b s u1 P
/* Initialize MCASP1 */
3 G6 f7 Y0 \3 h5 B2 |! b9 R7 N& J& B
mcasp = &MCASP_MODULE_1;
3 ^# r* E8 S- I& a
mcasp->regs->GBLCTL = 0; // Reset
]* e7 l8 o" W1 c% T, i6 k; ^' ?
mcasp->regs->RGBLCTL = 0; // Reset RX
8 j' B6 P" s4 e# d1 b
mcasp->regs->XGBLCTL = 0; // Reset TX
' L7 f- h. m- [' o& J5 B
mcasp->regs->PWRDEMU = 1; // Free-running
4 Q/ N4 u; z5 f6 f3 v; F
// configure McASP0 receive registers
0 _: D+ ^* p9 A2 E% k& y
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
5 w5 d; l! B/ O+ ]
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 N: f3 ^- S$ K) P7 t8 L2 E
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 X5 K E! \( N) |
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 ~' t) q K! t9 Q
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
, N. B& Q7 n2 Y7 B
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 }& ? y5 G2 ^9 r
mcasp->regs->RINTCTL = 0x00000000; // Not used
" }! q+ K* ~2 u( \* K
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 r3 U# r" b% j
* J$ D: P' }4 y* E2 T" l; o
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( `" u! c$ d# ~& j
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 v. f' e. |) h' E# E7 {
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
" l" _ a2 @0 G- t
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 W2 J" e, q, d1 t' B5 [: t: `
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
+ V2 n- U- N* x, o0 L2 l
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
6 R; l/ `! v- s n
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
9 j2 x6 A$ Z9 u
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) W) G8 O: S) Q+ g0 S& t8 K; n. \
9 [4 `. q$ `: a2 ?7 ~% N
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: R7 F; v& i9 C% S c; K% z$ @
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
$ G% g2 R" L" q I, M% |7 O2 C
mcasp->regs->PFUNC = 0; // All MCASPs
0 f& _* h, c( e7 N
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* A, \7 ~/ c% w! W
# m& b4 {8 z% w% U8 s/ W
mcasp->regs->DITCTL = 0x00000000; // Not used
3 d; x% @# Q! Q1 |7 O! R1 z
mcasp->regs->DLBCTL = 0x00000000; // Not used
1 p I5 H2 _. R
mcasp->regs->AMUTE = 0x00000000; // Not used
* ~ b. A# [& v, T5 ?9 K5 U! Q
% a" X3 L' Q& o/ W5 {
/* Starting sections of the McASP*/
4 R' l a$ {6 P0 Z) e `
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% l' B D' ?( w3 p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% H% Z+ K7 M) G& v
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ f) C4 W6 A5 e4 m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( @# x0 l/ _+ {& w1 O$ y
: f7 C" D# S, v* L
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
4 x9 D% v. O4 j; `! p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% z/ E+ a& k$ I8 W
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 Q7 b0 B4 r/ M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! ], J# k4 }4 w0 q+ q. J; z
' P) {6 a0 _: ^+ S g
mcasp->regs->XSTAT = 0x0000ffff;
' X* B5 k' H/ z
mcasp->regs->RSTAT = 0x0000ffff;
/ V* c8 ^5 _/ H- [# C& k
, l' [' L, R1 a
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 y+ y3 x1 ^% c3 z+ l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 {# V) Y$ r+ |
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ x1 z; h [ E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 s( j: c9 d' Q% s& A
+ ]* I& N2 y0 o/ l' P( I
/* Write a 0, so that no underrun occurs after releasing the state machine */
, `3 ]7 u6 A0 c* G
mcasp->regs->XBUF5 = 0;
: s$ w/ u, a! F, W7 V+ P
mcasp->regs->RBUF0 = 0;
. _! r: T U& Q" g
9 i% `! h! ]" ]& u: t" p
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" Z8 Q" N0 j5 {3 X8 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' a% h* Z3 L) P+ X$ d
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; O3 G! R5 C" D2 i( E& K* K$ B1 N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* ~1 Q) R+ R( O
) z/ F; B$ O) h: ?% q0 H
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 n; B5 c0 m# ?. Z" ^/ l: X9 B; g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 a7 d) C3 O" N
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( q' `" }9 C# c5 r/ A% B5 A5 V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 J- D8 n: Z9 n- \4 f
. ^7 }% Q& l0 W% r6 g
CSR = 0x0000;
9 F0 X6 N1 T: {. `
INTC_INTMUX1 = 0x3d;
: f+ s; I3 R3 Z8 Y4 G
ISTP = (unsigned int)vectors;
~; B% D' i3 u, I4 F6 w
ICR = 0xFFF0;
( m8 l2 m: r5 J; C
IER |= 0x12;
+ `- O" V* o& d! g: l
CSR |= 0x01;
h. b2 L. `" R' \- d
/ C* ~/ g P- K' `0 t9 |
/ H+ {" r$ o$ _' K
4 R# }( `* ? I- `9 l7 a5 ^
还有就是两个输入输出函数:
" y) [- @3 k. K. s# S7 C/ t/ K
void output_sample(Int32 out_data)
' P9 y& H2 d$ H; o
{
, Z" b. K; D, N/ K
AIC31_data.uint = out_data;
- \4 X0 D9 m6 E
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 v0 I4 `. K! L/ ~
}
: m" D" L1 o8 S- {
* o7 a1 c Q1 ^3 F1 k8 ^& `' i' Y' b
Int32 input_sample(void)
7 y: Z8 X4 G3 x. h
{
3 N; @. r+ p7 t
AIC31_data.uint = MCASP1_RBUF0_32BIT;
0 `- x& H$ [- O' J) h
return (AIC31_data.uint);
; |1 l \; X: u" g* ?% `
}
, Q, {. X0 A3 O8 R' S+ @& i" H1 v
" u; |9 C6 Q& }# U. H, L
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4