嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& R7 w2 L( K- _. d- ]- L6 M5 }0 v7 `/ Q
main文件:
$ k& E- g8 E* r) _: U" x
interrupt void interrupt4(void)
. j, H6 P& r- R
{
+ s/ @6 `% D* V6 ~3 g& H0 b) O
Uint32 sample;
t# }' W1 h2 |' }1 r* g! a! N6 L
# N0 _4 D+ o0 x- E) E* ~
sample = input_sample(); // read L + R samples from ADC
0 q2 X+ w/ ^" s
output_sample(sample); // write L + R samples to DAC
d. m* l ]$ b \
return;
' t6 k0 k8 P' e1 H6 D/ i& x
}
$ j: Y- L2 ~6 g) i) l
8 P7 u, {4 R; G. B4 |! R% f
int main( void )
$ O. F K0 i2 d0 f) { \3 @
{
; `, n# _6 J5 M
, q$ r7 Y+ G. G
/* Initialize BSL */
8 b! ~) n/ }) m6 d; [, w; q* B3 k
EVMC6747_init( );
( h& ~, h$ X& K& T) m8 U
/* Call evmc6747_intr function */
5 A! z' ~. B. z, _
aic3106_init( );
7 H7 p3 y% j3 A
while(1);
' y4 M( J+ i8 t8 Q3 k
}
0 d6 ]# f8 d* @1 p* o- }3 ?
1 r& y4 A8 n# V7 O
6 h2 E% {. X' }& ?3 I) ?9 `1 n% C# Z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ Z) L# p, P6 `- d; v; Y! _( O
/* Initialize MCASP1 */
6 W& l0 V9 X3 E& y9 \3 u! |
mcasp = &MCASP_MODULE_1;
a8 \* T( b/ ^4 ]" s- P: U
mcasp->regs->GBLCTL = 0; // Reset
( t- m& b7 i4 z3 |" ~$ W7 }; z
mcasp->regs->RGBLCTL = 0; // Reset RX
9 i5 ~7 ~2 ^( [. Y, s" b3 ?
mcasp->regs->XGBLCTL = 0; // Reset TX
4 Q& N) Z3 ]1 a# f+ g
mcasp->regs->PWRDEMU = 1; // Free-running
J9 ?7 _8 L3 l0 W* m& D8 |
// configure McASP0 receive registers
# n' L5 x6 {" ]2 ?8 N! M
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, E* [2 _) P b
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. }( i+ q4 K$ Z" S# \! K6 ]" J
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, e, v, C8 ?- b/ b! e7 H
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
2 x+ p# G# ^0 F: g/ S5 l3 W2 }7 H
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
0 i8 V2 @3 S0 u- p
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
$ a6 u# U- z$ O, {
mcasp->regs->RINTCTL = 0x00000000; // Not used
* z# ]$ {9 ]' S% |/ {+ c2 U
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 j; P! ~* o7 P% O0 |
# [- B, W8 P/ r
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
+ L2 M+ Z' E& t
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- ^8 i2 W$ k: m5 d9 v) z: p
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
8 T9 g/ q* P! J) ?3 K
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: D. z$ ^0 Y! |0 B
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
2 J% w. \% Z" i. I* l' U( C1 c- A
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
4 ~+ X4 Z; M2 N
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' k# |# x0 F3 u
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. C; C5 M7 N6 B& h
0 \& J5 w& l- F3 Y' P8 r
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
" o( X" L" d9 n
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
3 u5 g9 g( C) |0 C) _) Z
mcasp->regs->PFUNC = 0; // All MCASPs
) e+ j" j: K+ o' M. [
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: e R- Y2 g5 Q4 I) J
2 I3 ?# c0 P. M( \5 ^
mcasp->regs->DITCTL = 0x00000000; // Not used
+ h2 E. x( s @) K
mcasp->regs->DLBCTL = 0x00000000; // Not used
# m, s# n }! H1 t
mcasp->regs->AMUTE = 0x00000000; // Not used
1 o# F$ a" M+ {5 v& G& O6 I2 d/ l
# V* [$ A3 _9 a5 l, r. N- O
/* Starting sections of the McASP*/
, w1 Y) s9 X& X9 i' T0 w
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
; m, \) j+ b f) E; d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
5 h6 [% Z2 U7 @
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* [( Y" m$ I! S1 W! b( Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 W/ A3 \2 u9 K* m+ k" k; w
1 h! d* w5 s J/ P- u9 @( p
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) o: k! J# J; {0 y, Z# v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
' Y+ d, w, Y, Y* ?
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: M9 Z6 c5 p6 J' b z R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; j# K( d! r6 O3 l
5 n) D* J5 _# D- M, Y3 b
mcasp->regs->XSTAT = 0x0000ffff;
2 X' G3 |1 B! w, T- N
mcasp->regs->RSTAT = 0x0000ffff;
. @: S3 w! |& w+ E: [
- |, M: ]0 O8 V, T/ c+ i" D0 ]
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 Z- ]$ P2 }! k+ @* g- W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 _* x9 u" e/ V# B9 ~6 ^" R) }, i5 X
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( G r$ X+ z! U9 c* }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 M: r5 B, d# W1 M' { B
3 [2 _8 p7 c- j( Z" K: E( B0 S
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 A G4 y2 A- K9 \+ p
mcasp->regs->XBUF5 = 0;
. M$ V g+ O _9 b" q
mcasp->regs->RBUF0 = 0;
1 m. }/ k3 ^* S: e! m) ~' A
% B `3 J. }1 x h0 u5 _1 h( N
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 b' J; Z: u4 p& o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% V8 X; k! u2 Y# I* W) G
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; W$ }* X' A/ \ b, D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 N# M' s" k9 n! O
) ~% i/ S4 Y. j' B
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" R0 k8 }$ u9 D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
5 Z+ z, `! i* B N$ U/ j% C6 \- x
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ q, E8 C- W0 z2 l/ ~2 C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! b2 G& q4 H3 N: U
+ n" Y$ V$ m& } K# R P% f
CSR = 0x0000;
" ~2 O% }, \" f( ^
INTC_INTMUX1 = 0x3d;
" X" K# V3 b4 W, g9 T( w% [; K2 Y
ISTP = (unsigned int)vectors;
0 j- R: z ^$ W1 O5 _5 n! U) B
ICR = 0xFFF0;
/ l6 L2 B5 C+ E( @( A) P1 M
IER |= 0x12;
4 ~5 \; S" p# H" z& g9 Y I: t
CSR |= 0x01;
5 T9 G$ |* N1 i4 P* e1 a9 l9 P6 {
# d( y/ y$ F0 M5 d' w3 E
/ h! b0 u, S; Q( v6 B
( i7 I" @0 W* y% B; b! T
还有就是两个输入输出函数:
+ L1 j6 Z. ^$ b0 X! [
void output_sample(Int32 out_data)
$ Q3 D G {. |( U. \" H% S7 V+ [
{
- h; F0 \+ M4 D% \. e
AIC31_data.uint = out_data;
+ R0 n" h9 d! p7 z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
$ ?# w$ I5 y. o( g2 @7 u, o
}
8 ?: e' F' N3 t" D2 g
& M7 m6 u" f4 L+ w
Int32 input_sample(void)
- b. n( t( B& f( c
{
$ X% r, L7 b" T5 s4 O' ~+ W
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ V& k6 I2 {9 t; K. `! z7 Q
return (AIC31_data.uint);
/ f3 ?2 k& ^3 {- b7 P: X
}
# B) K2 W$ [4 E3 y+ L
5 n- K' I" u9 T2 X1 D# O' a3 E
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4