嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- H: L( D8 p1 H0 o
main文件:
& ^) h, G3 }/ m* _7 v! [
interrupt void interrupt4(void)
- \* w. D" @; q6 ^; z
{
6 J& G- b2 I8 ?7 Y0 o
Uint32 sample;
* g9 o& n1 A( C8 |/ V5 g) G; j
" E& E, [: N1 H1 {& J
sample = input_sample(); // read L + R samples from ADC
6 M8 S% C7 X0 e' R! ~
output_sample(sample); // write L + R samples to DAC
- o8 V% t* ~3 V1 }$ m
return;
7 `% N* g1 i9 q* S( R
}
7 \: k2 q m) ?7 [6 ?
$ e& t. R/ f# ~1 f6 L! I" v% [% L. B
int main( void )
( ]" y C5 D3 ` |' L
{
4 ]# c% B$ V6 e) M8 c& _: I
6 c$ \( }( D; q
/* Initialize BSL */
2 k0 A' [3 I+ J6 P5 F% r
EVMC6747_init( );
, B+ v6 y; f& x6 d+ j
/* Call evmc6747_intr function */
$ k. F. z4 y( n- e" ? S
aic3106_init( );
4 n; o8 f! l/ ^: V/ d, [* ] m; m9 u
while(1);
1 u, D) W2 \! C! z v3 a! x w
}
; \4 o j9 ?2 {/ p
$ X1 @; @8 s) M4 v0 ^# e
- H5 R; y3 M0 [7 @0 d% q) Y
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. S3 C2 L. e8 `, C- [
/* Initialize MCASP1 */
! h3 R6 s. E, B Y/ u
mcasp = &MCASP_MODULE_1;
# }9 z+ c1 X- ~( u& X8 u
mcasp->regs->GBLCTL = 0; // Reset
% q& e% t, e, y7 u( Y& t
mcasp->regs->RGBLCTL = 0; // Reset RX
. B5 H+ ^1 a1 C: D+ Q- Q
mcasp->regs->XGBLCTL = 0; // Reset TX
7 K: m) L% ]+ r9 @% }
mcasp->regs->PWRDEMU = 1; // Free-running
5 }* }; w' y6 j/ G& [9 c' j
// configure McASP0 receive registers
n2 V- B% H& E9 U
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% s4 J8 {9 N7 P6 Z* d+ q6 {0 ^
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ X q5 {: Q& Z, x7 |4 L8 _
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
. Z. l( U, z V& f& W0 u
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
" t2 {) K7 s+ T# i
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
`5 t3 i7 v$ h5 R# z4 Y
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
/ r2 y( k% X4 X |. `1 z+ ^; n+ I
mcasp->regs->RINTCTL = 0x00000000; // Not used
) n$ G3 `, p6 f7 i5 O/ R
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ U7 S# v! J, ?6 z0 X$ h1 E& |
# e: H1 \( Y6 i `9 u2 U2 ?
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
, ~6 R% z& d4 g# |8 k
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 I4 \ a0 ^% B' v: O$ Y
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 c' j* \( ~6 h1 J! Y, ^
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
6 f4 h$ H1 y, W
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
. H. o. N1 u* ~& [+ O
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 U* ]+ r3 j. _7 M3 `, Y% X5 G
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
; X5 @0 N" ]/ [, E: u+ [% R' V' O
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" m, K* e& w4 J
& `) d# J* P: u8 E3 R% m; i$ y% ], ]
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
" W/ D. V; F% v8 b! A4 |* P1 A
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
9 N# n% I- H/ h" z5 J
mcasp->regs->PFUNC = 0; // All MCASPs
3 F" l' ~5 n; s- p8 d7 y
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
) J7 E6 Y; F1 h0 @# V) H0 |& G1 h, m$ V
, ^% `( V& T# b% d; `: z9 Z, A
mcasp->regs->DITCTL = 0x00000000; // Not used
( i+ E; c$ ?' \: V4 ^6 I
mcasp->regs->DLBCTL = 0x00000000; // Not used
' g2 z- S% Y" l
mcasp->regs->AMUTE = 0x00000000; // Not used
8 C3 |) F4 d7 F$ R1 ?2 _; D& l8 G1 E
7 p) y5 ~: K* n5 a
/* Starting sections of the McASP*/
" Z& E! f2 T$ O
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
( T# ^0 V- X' v e6 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 g ^+ s4 N+ M" d
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
& G3 Q. V5 D9 E$ T3 t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
1 E+ g5 c% p& d: q6 K7 d' d
3 j* T+ F+ a% x& ?( H. [6 ^
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 l+ N: V5 [; j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
$ U I% Z0 j( |; v# o; `; N0 C
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 d r/ \; S. r9 P3 U2 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
% d. D: u* X. l- u* y
( O& ?) U- h8 D& R1 K* d {! W
mcasp->regs->XSTAT = 0x0000ffff;
* |& T; L: o) `6 q" {
mcasp->regs->RSTAT = 0x0000ffff;
& \4 ~4 ^0 T* ~: F
) G( E& e0 M8 a x
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' b8 x- x2 {: x% ^$ u+ E( U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
t6 H, E' i% |
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. C% l5 J. k. b( D% i' c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 I* n" k0 T+ j# ~3 U, a2 i) ]
6 e) e z* W; M- k! y1 D; F, g
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 z# y7 Z( P) P* K& ~
mcasp->regs->XBUF5 = 0;
I# T( z* A- v0 E( E
mcasp->regs->RBUF0 = 0;
6 p3 ^0 {! t8 h
( f: `; v% T# z! A2 q/ [* m
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 q5 p3 M H; Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 V5 `* W( |- _& \" ]# s+ T
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' s- F T5 A' h+ }) V9 i3 _0 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 ^7 u% r6 Q. _2 _+ |
' n+ k$ W" G: A6 f
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, r) r# H7 P9 d$ {' M( T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ M0 ?( }, n3 _
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
( ^/ h- S4 O1 m& I- K6 C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 R2 a" D/ p2 R$ Z* z3 [! P- d
) s" f! f. L4 S w! @/ K
CSR = 0x0000;
5 s9 m7 V5 N; F5 P$ E
INTC_INTMUX1 = 0x3d;
' R; L4 r! t- f& L3 Y4 l6 H% L5 d0 U1 ?
ISTP = (unsigned int)vectors;
' k: q: h* r7 [: D
ICR = 0xFFF0;
% z! q5 o) {3 @7 a& H
IER |= 0x12;
# ]- j, _4 Q2 j/ @
CSR |= 0x01;
1 n' [8 u) a. t2 J
# `$ ~6 l, c% ?& |% y
0 S1 ?, r* p' z* s
) f) B9 ?: g, q/ Y+ b
还有就是两个输入输出函数:
- i& y1 z# _: G2 ]$ N
void output_sample(Int32 out_data)
& y. P. t2 G1 ~# D( \! L. E
{
Z& F( Y Q! }( K
AIC31_data.uint = out_data;
% E) ]2 `8 t/ L# B9 o8 C9 B
MCASP1_XBUF5_32BIT = AIC31_data.uint;
- ^4 j# A! ]* `# x
}
1 j* k4 q) c o6 K
3 H. c+ w8 K9 i' j6 g8 ]
Int32 input_sample(void)
/ O6 z, O2 M q ]( U- b
{
( }' @0 t9 K: `0 G
AIC31_data.uint = MCASP1_RBUF0_32BIT;
# V+ e3 u+ Q; x9 x
return (AIC31_data.uint);
3 ?, _% ~3 o& @, P$ f2 b2 N7 p
}
! u d; w( x/ W9 F) j8 r% O% B* R
; K' w% A" ` U+ g v0 d
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4