嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 ~. g+ U' L- ?6 B! [7 y$ K
main文件:
# B0 h! G0 V9 r5 p9 p* v
interrupt void interrupt4(void)
: U& S! g" v' N9 {
{
4 V* e+ m) x! Q
Uint32 sample;
3 U O, D n) z( h
( t P; o$ x6 p" i, W# g
sample = input_sample(); // read L + R samples from ADC
$ a- U: V' m0 v2 ]' h7 z
output_sample(sample); // write L + R samples to DAC
' V7 W6 M! n0 Q3 i0 {4 c* Y
return;
9 L9 O: J4 V0 M- B, V
}
6 K9 W% i) ~6 s9 K" A/ ?5 h
r" c+ t$ }6 Y: R
int main( void )
+ k; K9 W4 k. m8 ^4 c. d Z2 D
{
: C% {9 T5 @: g; ?4 f
. L- N( z- J: g; f5 `2 @9 g
/* Initialize BSL */
5 P* x; `8 b0 w7 _
EVMC6747_init( );
2 Q4 R" Z2 h& Y( O% G9 X. q& d0 r2 A
/* Call evmc6747_intr function */
9 v& X+ P& q$ T+ J
aic3106_init( );
- { s `! M7 x6 _
while(1);
- D+ Q9 b# k+ y+ |
}
" O7 @; l$ c5 M: F
( `$ r' f5 z( h( B3 D- H1 b% w. t0 k
: d2 {& p7 H4 P2 v
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ j. Z% | I, S7 e" m5 Y
/* Initialize MCASP1 */
" \7 A f- {5 g8 V- P
mcasp = &MCASP_MODULE_1;
( W( G* } O; Z) r' |
mcasp->regs->GBLCTL = 0; // Reset
" U0 A0 ?1 D. s& X$ K( s0 t0 E# T
mcasp->regs->RGBLCTL = 0; // Reset RX
) b* `. @6 ` X- S( E
mcasp->regs->XGBLCTL = 0; // Reset TX
" g" W* j* \. A6 W5 B, r
mcasp->regs->PWRDEMU = 1; // Free-running
4 Z$ }! v& n9 k4 b' @
// configure McASP0 receive registers
$ w3 }3 a& Q' l: K. o5 _) i: o5 V
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
3 h- G7 O, b3 @# `1 I
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 U6 o) u+ `. c
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 a7 z7 ^1 ^+ t; q; _( w2 c0 J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. b/ G& {0 z1 b. v/ w3 n
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( X9 P# W; I% l/ S5 m) x4 o
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, ^5 v. `, L! O4 ^7 r1 B* [& ^
mcasp->regs->RINTCTL = 0x00000000; // Not used
9 W, K2 {2 ?6 a; _6 u( Y
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 Z$ N# \4 D# p) V$ ]
3 f& ?, @& }4 y* s6 N* {( }5 @
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 ?% x& R8 ]' J5 @
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 |) F) f# h/ ?' \/ A* u5 u
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 o0 s3 }# |8 s) h$ B0 |4 V/ c
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
- t a. c" G9 p
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
8 x. q7 i. E# E$ N3 O$ c W
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
2 [9 M6 R0 \- T5 k, r, d& K% R
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- u0 q. k$ U1 }5 s3 H* o1 O
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 o: @1 X5 w S# x# e- f {1 a7 Y
3 ~% @% X, H% ?! ]- `; S
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
& y7 x" `$ E) l( q
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
. U/ z _. n; ^0 `1 i# y! I- r
mcasp->regs->PFUNC = 0; // All MCASPs
# s/ G0 C+ C8 u9 R
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 b# M$ Z$ O% y1 ?. ]# i E8 ]
7 ~5 D4 a4 s% R- Q6 r
mcasp->regs->DITCTL = 0x00000000; // Not used
9 Z' X) P2 N& X) I9 n
mcasp->regs->DLBCTL = 0x00000000; // Not used
9 z$ U: x2 B( |+ M5 ]
mcasp->regs->AMUTE = 0x00000000; // Not used
% n$ m0 |- |$ a& q" M/ z
& H3 P6 V6 G4 e4 G
/* Starting sections of the McASP*/
- G/ A3 v$ h) M( n/ I6 i" k1 x
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 y2 k* c; y/ l' d; [$ K/ h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- s- a" Y! `- Q4 M
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ Y/ A/ |, Y" i* R8 a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 i* O9 C+ M3 c
7 v6 H: M9 q: [! d2 Q
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ B5 m+ J6 d8 t' k: J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
3 x5 a3 h* n' e3 M4 U
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) v3 h: D8 C7 U z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 z: `! [+ Z# H' M, W) d
1 P: g8 t! G- X1 d+ E; @$ ?
mcasp->regs->XSTAT = 0x0000ffff;
; {$ v- ]$ b4 j( \
mcasp->regs->RSTAT = 0x0000ffff;
' H: w, f2 b2 P* ?7 e
~7 s7 }1 O% L* m
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; m% t# c6 N3 r7 N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 I4 I# C E1 f! u7 _
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
8 y% L* I4 ~2 G* f* G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 {3 M E7 {9 [% e
E; {7 w+ @$ \/ B7 i! F
/* Write a 0, so that no underrun occurs after releasing the state machine */
* Y9 }- d$ c2 s( r Q2 S( o: |
mcasp->regs->XBUF5 = 0;
3 c' w: R' p Y, T& a$ E) s/ z ?
mcasp->regs->RBUF0 = 0;
3 o z8 \5 ~- P, h
0 ~$ T- Y) W Z! Z5 ^
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
/ x* _# ?7 [% W- V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% @/ ^/ J1 g6 Q4 n, ^7 |; P
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ A8 K8 r. |4 F0 R: y) m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 F. J& ^2 E0 ~
, ~. J5 p, n- `+ X' d; J3 U1 D8 {" C
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 F% z" |# G) B) z$ ]$ y/ h% M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" V+ f3 _/ A2 E" G- }, p/ d
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
. ^$ A7 z5 P- I, |$ [4 u: P5 O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 I+ [: `9 o' f% V6 p) x+ a
: c$ C. X1 W' f; j& d# K* b, j* t
CSR = 0x0000;
' } Q- b5 v" ?1 t$ J
INTC_INTMUX1 = 0x3d;
; Q k; \) G# m& x& i% W
ISTP = (unsigned int)vectors;
* F* w- A+ [: O! _( m& ~+ b; ~
ICR = 0xFFF0;
6 `! A7 I; C, g
IER |= 0x12;
; H1 V2 q* s& B
CSR |= 0x01;
! v4 J- l u1 n9 d0 P5 z
3 l4 f' E8 h* r2 W1 }4 d
# A: B" Q5 J, B, V1 X5 r
$ _( S$ c3 |3 W0 i% Y* U
还有就是两个输入输出函数:
, n! S% S2 T( o
void output_sample(Int32 out_data)
# C- i& V7 O: w" ]& ]* h+ X
{
" x& ]. K% A ?. y2 o8 o2 f/ O
AIC31_data.uint = out_data;
( C: t# U3 F3 ?5 f% w
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 _; O5 \ p: F) L( q+ G' D. A
}
% L4 H; z9 b2 V( ~8 @9 D u
! G7 Y( Y$ k3 K) M* a. H
Int32 input_sample(void)
3 p- {) E4 n* T2 V4 q. S
{
; I6 `1 }3 f5 H; w3 g+ ~5 @% i
AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 v' r4 _8 w( D. Z/ i
return (AIC31_data.uint);
; \# ]( r( m' U( k4 R
}
- P4 f1 b. m, [7 l
0 E: Q0 g6 |; K7 F( l
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4