嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( S N8 U. k( @' P, ]: N @6 r
main文件:
/ H2 o; U4 j; Y% @9 D
interrupt void interrupt4(void)
% P4 T) | h; b- e6 c
{
+ k1 Y$ X/ r0 e% n
Uint32 sample;
$ C8 e1 c! c. Y. j2 z
" I+ ~& U# h) a; i' I* f
sample = input_sample(); // read L + R samples from ADC
3 t4 \- `, c( L6 ^; S* }6 u
output_sample(sample); // write L + R samples to DAC
/ l" l2 u$ n: ]' m+ G, S9 W
return;
# V6 k- D' p& T
}
" |2 }: q. X, }; m7 O
$ U( z& Q& t1 h1 _- u- |7 T; u" p
int main( void )
4 w1 b( h4 {* T8 }
{
7 @, @9 v" J: U) [& E& \. m
, P+ G0 ~8 w/ p* z2 S0 Q0 R& `: L
/* Initialize BSL */
: J! B: S, n. e- Z5 ~- H
EVMC6747_init( );
/ B, K( q. _ N% p6 F
/* Call evmc6747_intr function */
0 t6 J5 ^5 ?6 K
aic3106_init( );
* Z% b8 U/ B7 r* T( l8 [
while(1);
9 d0 {9 |" F0 b
}
3 z2 X) `; V# B! ~
5 g% B7 m4 m8 e
8 H2 _- u! q8 K2 n" I
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* c- _" _5 Y$ V
/* Initialize MCASP1 */
7 G7 K8 L' b5 V# I; u8 ?: r. u" N2 [
mcasp = &MCASP_MODULE_1;
5 ]$ w, q7 I X9 @; u/ P3 Q
mcasp->regs->GBLCTL = 0; // Reset
5 N: ~ s; F U9 D
mcasp->regs->RGBLCTL = 0; // Reset RX
7 V" p# @$ U+ d# D+ y7 `
mcasp->regs->XGBLCTL = 0; // Reset TX
0 ?, n5 Y( l2 }- y2 ]' ] Z) {
mcasp->regs->PWRDEMU = 1; // Free-running
. z7 L# g& O* M4 C) I7 p9 x6 ?
// configure McASP0 receive registers
, f- ~' x/ Z5 ^+ K" H' d; {" C
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 w8 D( g8 M7 L+ n/ D
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; [1 h, \8 x( ]
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, L3 t) D+ O( J1 [* ]+ J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; y8 x8 b9 R& o }0 q# k
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
# g" T% z. L" ^
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
5 @3 |0 i! R- y. {- M& ^
mcasp->regs->RINTCTL = 0x00000000; // Not used
0 |% W- j! d5 K) M5 _2 h
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# u3 ~1 h' I0 E9 a2 f9 |. k, @9 v
, |+ N4 U2 Q& K8 U* F" Z% h7 _; k
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 q5 E& W) A* ^1 I! r( U' ~
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 E+ C2 A% x9 I% p& a) h0 w
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
* }: I& g @$ r! k5 n( g; v4 d
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' M2 l1 P4 r1 e. O' _! j+ s1 b
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
9 ? R9 z. i. j" o- N' [! ^& g+ q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. y0 u. z* }6 ?
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* j# l5 @- R& _! s5 v( Q4 h e2 Y0 x
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. b4 ^' M, |- Q) N+ f% Y% \
+ e, q5 z* C! y, i8 v8 U a! f; `
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
2 s/ K2 v, J A, x0 u
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' N/ ^0 `$ r% L
mcasp->regs->PFUNC = 0; // All MCASPs
* c; e7 w- N1 u2 {0 j
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ @& s" V( d; V5 l, l9 e
7 s9 ~+ R, P$ S' e
mcasp->regs->DITCTL = 0x00000000; // Not used
/ F5 ? s; z' ?! ` X5 t
mcasp->regs->DLBCTL = 0x00000000; // Not used
7 E7 m& G* d7 R
mcasp->regs->AMUTE = 0x00000000; // Not used
* l1 i+ h$ u k+ t! e
7 P0 a! x" h/ K( q" X8 W& i3 `
/* Starting sections of the McASP*/
! ?/ x$ L' A5 j+ E. g n4 W& h5 A% I: p
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" A& Q1 i1 F2 \- [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
* Y2 `& H" @1 T2 a9 x; {# Q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
7 ]2 i$ g% v* r( i* |7 e4 a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" S- i$ c6 g/ I: {) ~9 }' t$ L
$ d5 q# Y4 B! ` O: w* x& ^1 G% @) n
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) p# E/ m+ T! x# L/ ?8 X+ ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; B: v: d `5 K/ q. n
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( e3 z8 {, h/ S4 c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" V% c/ ?/ t) c4 ^+ \0 D* s# F" |
$ R$ I1 c. ^. u
mcasp->regs->XSTAT = 0x0000ffff;
/ u& i% I- N6 W, F F9 }
mcasp->regs->RSTAT = 0x0000ffff;
3 h( m* t; o8 |' a
0 U! N2 u& q" ^+ {. T& ~. `1 {
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 W9 q, t3 X4 O% Y; @: Q+ b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ }1 W+ K8 m. B7 o8 Z3 g/ ?. M
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 ^1 M8 F5 o, G9 L) g" w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 f% u) Y+ n9 V! n5 c2 r
! ]! K6 U; B. A# p6 r* y
/* Write a 0, so that no underrun occurs after releasing the state machine */
2 ` G1 y2 w D( W8 M
mcasp->regs->XBUF5 = 0;
1 }* g" @$ C* h2 s) p( G) q% Y0 C
mcasp->regs->RBUF0 = 0;
& V4 D; E1 ]1 P3 Q( u9 Y' }( ^
3 q1 e) Y( R T1 [' ~3 y O
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
4 v. W- K/ b& }$ O a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
3 x( s+ R9 Y1 b0 f3 D
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, ], ?+ `8 \2 t$ S. p7 |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 U0 ?; g8 {* X, N: P, H9 _! [
; v f# A8 I. R C m0 T; v" K
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
0 A8 Z/ ]5 z6 E- }8 t: A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 Q# ?0 d% A% _- b+ ~, `2 ^
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 a: C. H$ J$ t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
1 ^2 N) ^; F7 Y# k5 t; i
9 Q) |6 _9 A" o
CSR = 0x0000;
0 I* X/ E* F4 C$ J' M& f! O
INTC_INTMUX1 = 0x3d;
5 X' |$ W( g/ I, l& T. z5 R4 [2 r
ISTP = (unsigned int)vectors;
- z8 P4 w3 ?; ~4 f3 q1 L
ICR = 0xFFF0;
" C c& ?% s' y. R$ ?4 O
IER |= 0x12;
5 |# N9 l3 O! O
CSR |= 0x01;
6 h T! O& F K" l2 g
+ @. K$ |2 T/ f6 D& M, U
4 X3 o) h. _# ^6 p6 I
. E0 ]) n+ b' G7 X$ U: z; r! r+ z& m
还有就是两个输入输出函数:
* l1 @3 C9 Y7 U) A+ a; \6 S* [
void output_sample(Int32 out_data)
: V2 k4 O5 `( U! u$ s" c5 z
{
8 t9 |, ^, X7 Z: O/ R: X3 N
AIC31_data.uint = out_data;
& J6 E0 D7 `( F
MCASP1_XBUF5_32BIT = AIC31_data.uint;
) S" K: Q& |( R0 h1 j
}
8 O! D& S2 \9 E9 j/ G
5 h3 d1 _- d6 a7 ]
Int32 input_sample(void)
$ j g, X! v/ s' d9 P. `
{
0 h4 [0 ~$ T% Z% ^% l
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 c% M9 V; p3 K0 \7 ?4 d$ s
return (AIC31_data.uint);
* C( r) B( m4 E6 X9 r* K7 e
}
4 |/ p5 |* t7 v
* _0 p$ A V3 b6 U; \% N2 I
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4