嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
; W7 I. h5 h5 O
main文件:
g/ ~" f7 F5 e0 c) p* f
interrupt void interrupt4(void)
! |/ A }7 y' _5 G
{
% {, |2 @3 O1 y4 i! y; P% f' m& v
Uint32 sample;
! i" T6 ?6 f8 }. l: q8 Q h
3 G. `/ `" O) h6 E% b
sample = input_sample(); // read L + R samples from ADC
$ T9 K" p' }9 d9 U+ y* [
output_sample(sample); // write L + R samples to DAC
; m6 @* S9 u- t, X% X% ^
return;
7 d( Y6 | _+ P7 I) ~8 j3 b, D
}
8 Y4 f3 T# V* x' ]/ P2 m. ^
: E3 m7 _ M1 \- }( M
int main( void )
1 b9 Y' z7 b* G" L7 Y7 H
{
& i% P6 J* I3 w& _" C
: Q6 T& b% `8 `4 M S$ Y, _
/* Initialize BSL */
. ]3 x6 Y8 U! M2 A* B
EVMC6747_init( );
$ B2 s+ ^( i* \9 S( M/ T" O$ I A
/* Call evmc6747_intr function */
) G: p8 L* D5 t( l5 c
aic3106_init( );
# K: B) C; {3 x( i) B, G
while(1);
, ]8 N' F: J7 E7 l/ w: O: @$ N( u
}
; Z; k* Y, ]9 c( E) T4 t [
$ h7 }/ i, W0 w+ v, }3 w# G
0 B6 A& G2 f$ ?0 M5 x) H! v5 P
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
; a6 k8 F$ u/ k8 Z& W
/* Initialize MCASP1 */
. j9 i9 G$ C5 O2 \: P+ q
mcasp = &MCASP_MODULE_1;
: I& k/ u6 z/ h
mcasp->regs->GBLCTL = 0; // Reset
# y$ `* P5 K4 m- [; q
mcasp->regs->RGBLCTL = 0; // Reset RX
; }7 a+ b5 R3 Q, I. X5 z) m/ J
mcasp->regs->XGBLCTL = 0; // Reset TX
( `9 ^0 R% N( j: g- N! k
mcasp->regs->PWRDEMU = 1; // Free-running
7 c9 {+ X! }" Q1 [0 O7 p6 U" y
// configure McASP0 receive registers
_2 A; G" y; P, P7 N$ s
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
0 n1 n/ }" A; i2 m2 u
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 F2 {) P+ H0 m, `% x/ X% B O0 R
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ U) I+ }- d! @, g
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! ~+ S% K& x3 |9 }4 g2 ?
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
+ X7 }% p) ~. ~9 p
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
3 F. p* T/ I1 C+ E% R% l
mcasp->regs->RINTCTL = 0x00000000; // Not used
2 n8 E! F9 k6 B+ \/ V7 @. y
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ f3 h% i( d: |% b1 z! m7 B- Y
; D1 y' ]7 i% X# k2 s3 k
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
/ i! f) p( d* z2 I
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) r# P) R; C8 B$ _" s, w
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) F! r* N( b1 d4 l2 b/ G
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 Y) r& t {8 [3 ]# e
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
' H; P- d0 f) [8 o$ f0 j
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ K+ M, N N4 |% E3 J& K& k
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
5 N3 z; A9 O1 _9 t; b
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 R" p- r4 w: p* |( q; S! Z
2 W* P) \' V/ Y7 |( w# T. K
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
. I- J" G( Z" t- |% F- Q: L
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
; H/ J$ S& X' ?0 d( x# U
mcasp->regs->PFUNC = 0; // All MCASPs
% x# @! x1 C/ l3 l: X
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
9 l+ g" h3 U F# R# B. j: a
* e) Q$ Y' f4 w7 T( e7 i
mcasp->regs->DITCTL = 0x00000000; // Not used
9 W: k. y' g. C+ ?5 P
mcasp->regs->DLBCTL = 0x00000000; // Not used
$ P# i, n, @3 N% c _
mcasp->regs->AMUTE = 0x00000000; // Not used
$ E# C9 J1 |4 i' s9 a/ g
3 g5 R- q. Q# n; A) V+ j& d
/* Starting sections of the McASP*/
1 U( L& T# j- A2 E# Z+ W
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) ]1 y/ o/ A& r! b/ R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
, Z+ m8 k+ ]2 e! B( Z3 @/ D9 X
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 U8 ~4 Z" \& V3 c# h( b' M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ a( z. c+ |8 s4 p
$ c/ K- h, `8 K9 R8 R7 e
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) d. M4 ~+ k, a; M+ F+ L5 d( D( J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 R) D% q( H# W, f9 ?6 o
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% s; n- _; z' W4 \* `9 O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
: ?+ j3 I+ x0 ^
% i- U. H' Q2 z
mcasp->regs->XSTAT = 0x0000ffff;
' @4 z) J& I6 G6 W1 n
mcasp->regs->RSTAT = 0x0000ffff;
5 j$ Y$ ]7 i7 |- _1 x G4 C
$ Y8 ~* J3 c8 `0 [: h8 u' V) e
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 c0 c4 m4 l) u" z2 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 M3 p! v5 \2 v0 A1 Y$ B! _
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. V' }8 O: H O/ W5 z6 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
, j$ @- u3 I' o5 n5 U& I6 t
6 z7 z; H9 `+ m- V" M& p
/* Write a 0, so that no underrun occurs after releasing the state machine */
5 u0 q8 Y2 H$ Z- f# U; G9 A! f K
mcasp->regs->XBUF5 = 0;
) \" B+ {# R; u7 g8 K
mcasp->regs->RBUF0 = 0;
/ y" J" l! X4 k
* N1 E' T- b, \8 [- a8 b3 F9 s
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) P- o) A! A* s" ^1 O) i6 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' U* s3 ~# P7 _7 ?. j+ Q
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 e+ q1 C/ Q" `0 Q8 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ G# \ m2 |/ V' d* N
4 ?- n/ N& x9 u* E. T
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ ]5 Q! d/ `5 _% x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ I* n/ c F' e K) L; u5 y4 A
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# @( i6 u9 E8 V! V6 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! S( M/ n* T$ d/ h
) }; _% m1 J: J
CSR = 0x0000;
7 h t. j* t7 N# {
INTC_INTMUX1 = 0x3d;
# X5 Q$ b1 a9 a4 B) k6 p$ q
ISTP = (unsigned int)vectors;
/ z; w6 B. \, n& h5 L% e
ICR = 0xFFF0;
, B; r3 t! [$ ^! j# m
IER |= 0x12;
9 W# e; G: x |/ S' _2 a
CSR |= 0x01;
Q2 r/ v4 o+ q3 k0 [! P
- K$ w [; W9 ^: I1 P7 s- J
( E% ` d, [* I/ m/ c
, C% d2 x, y2 Z+ U$ m
还有就是两个输入输出函数:
) }, f8 B) u( s2 {0 y5 `" ?
void output_sample(Int32 out_data)
4 D: g. j: {2 E2 u/ P1 G
{
( K- G& Q) ?* Z/ J- |
AIC31_data.uint = out_data;
. a+ |5 L$ F) d9 w8 ^0 m7 Z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
' r8 @; p) L3 N* \
}
) Z5 i) m1 T: ~5 x t# \
& c* _. p; q) ]9 y7 j0 b
Int32 input_sample(void)
D+ N/ k+ Z- o+ W0 [( M
{
& l: y2 ? `: D. n: E- Z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* R) B9 Q2 e4 B+ Q8 ~8 N
return (AIC31_data.uint);
: G. b% d+ n# u0 [6 F
}
0 \7 L5 c0 i, F
0 i# ?6 W) c! k6 T6 @- E" L; n; F6 E
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4