嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 W P K6 L+ d+ Z
main文件:
5 v" B0 A; _- E' g2 n: u
interrupt void interrupt4(void)
) b/ K# c& @* ]3 q1 T
{
; Z% E3 c$ s( F' o
Uint32 sample;
& P- @3 J+ w# i' E
! F( M& E! }2 T& R
sample = input_sample(); // read L + R samples from ADC
0 N, I$ s# X. w6 E, k& R0 g
output_sample(sample); // write L + R samples to DAC
% b( a2 J, W9 t
return;
7 R+ _. n a8 k5 a
}
q, P$ O/ \. b5 q1 M0 R: _
4 z d6 o* o) ]
int main( void )
& t( G! a! K6 P! l5 S; b* C3 z
{
9 m. l& k; y; K# a* H
) Y. c/ H5 h' I. s$ D% S
/* Initialize BSL */
8 U9 B8 V- H* Y
EVMC6747_init( );
# l3 u5 o) p* s) i- [# A5 Y
/* Call evmc6747_intr function */
+ i3 y8 z; ~* O- z
aic3106_init( );
: F7 z8 Q' Q3 J. h- V* o
while(1);
8 K( \! u0 s* f+ i2 T
}
6 J# Z" f$ \& r6 X4 e
" P; g2 b& }" P t" N
) i! S v. k4 J
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) i. u$ _( X# d. e+ j1 u: U; k
/* Initialize MCASP1 */
+ m4 L. j, K/ _6 L# k
mcasp = &MCASP_MODULE_1;
! ]' R6 j0 S9 F6 q% q
mcasp->regs->GBLCTL = 0; // Reset
u$ Q5 s: w8 a5 f1 j& Q0 V
mcasp->regs->RGBLCTL = 0; // Reset RX
9 @) R' }2 L+ k( K
mcasp->regs->XGBLCTL = 0; // Reset TX
/ A9 d# U* q ~0 C9 l
mcasp->regs->PWRDEMU = 1; // Free-running
- h8 T' N1 j6 |' r9 ~
// configure McASP0 receive registers
4 l* U: O/ `& \7 l
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
* y8 F$ X+ }( \9 `, c
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 T4 X4 B3 X+ B& o
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: n( V7 w$ u. Q! H" S
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ R9 p8 ]/ w4 O8 w+ [+ b- C* _
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
& J! E5 u9 D, O$ t) O: N
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' X9 b! k% T2 M0 f$ b" `+ ?
mcasp->regs->RINTCTL = 0x00000000; // Not used
" x" e8 c. P7 M& t1 B! r
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
J" r+ O8 B0 Y- D0 z( y
" D2 A. h' A. \" q& ^
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( \% J8 N3 u7 Z4 @" Y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* e1 v& X0 _/ h, ~2 \, X
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 F8 }9 V$ w3 A& k0 q0 H
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
( ~; Q2 j% v! q9 T8 Y/ t; E6 u
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
. |9 ~% |# x; m
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ Z2 r9 e. A7 J5 D' r" x' l8 C( Y
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
1 a$ n5 |! S7 @3 i' O# y' g
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# W& M3 {) p* m
( G. r% G4 S3 v- ~! U, D6 ~! q
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
% N+ T: k. m3 S) k
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
( q9 H0 M6 H# a7 ?$ K2 h
mcasp->regs->PFUNC = 0; // All MCASPs
4 V% U/ Y: D' s0 ~
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 h4 @4 z5 y. t% J; P" c! k M
4 K4 d$ M$ g- M1 a6 s3 j) x% L
mcasp->regs->DITCTL = 0x00000000; // Not used
, u# n0 _5 w( M5 J; x/ y+ u
mcasp->regs->DLBCTL = 0x00000000; // Not used
; u' b+ s9 S5 b3 r5 O
mcasp->regs->AMUTE = 0x00000000; // Not used
$ S! t4 U2 Y8 b6 g+ Q
" L9 m4 q- Q1 `( \4 |
/* Starting sections of the McASP*/
( P5 p- g- }2 `& A$ p" T( q
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 l% z) s4 n. [) b! v; R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 |1 ~$ n6 ^7 U' V4 Z+ D
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
- C$ r$ n1 d6 h; V3 E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( n" y: p' l0 r
" R9 F4 ]3 P' ?, u/ }, C
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
5 j2 h; k$ B3 g4 t1 T1 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! W0 \6 ]) P+ p& e7 M4 B
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 w9 U5 m6 l! L/ f( I8 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& D" L. K. G. ~; s( H- x
! ]0 H: V( K" t3 k; U
mcasp->regs->XSTAT = 0x0000ffff;
5 }! O j; n- N o( d; k: G+ ?
mcasp->regs->RSTAT = 0x0000ffff;
/ M, U5 \2 m! n
! U: Z8 |! n/ A) {( M0 n/ a" w
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 U# v. [4 _2 _% V- X. |* T1 `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 e& e& c N: X4 k3 `
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 G2 y7 [% s( e/ `8 n; i5 z! u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
2 }1 C& V( S" f8 @9 p G
% @, ~& u" o% q5 A; C1 A5 k
/* Write a 0, so that no underrun occurs after releasing the state machine */
9 c6 B2 e) I* D& ~) x* H' U& o. A
mcasp->regs->XBUF5 = 0;
" Y0 `( ^2 F0 a1 _& M7 k- h% u' a
mcasp->regs->RBUF0 = 0;
5 l7 S6 L( v0 s
6 u: p# B, t9 }! b; K
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
. p$ ^ k( \5 [( R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! o6 t/ X* l9 d
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' R A1 |; y9 ~& ~$ X S. I4 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' t, T2 g, m0 v% e. c
- P2 Q) o# a- I9 K# ]# T% p7 ?
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ d5 H$ R$ p9 L+ `8 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& q1 x5 S* G/ i0 B
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
3 i1 f# k- V3 V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" b1 w6 M; M) Y5 z2 i
9 P1 S# {7 x' f
CSR = 0x0000;
, d3 b( [5 C" o2 S1 N# d' |4 u/ ^( v) ^
INTC_INTMUX1 = 0x3d;
& E3 b5 _1 I- t
ISTP = (unsigned int)vectors;
+ G9 i, _* O; y' j5 g: ^$ H1 ~# z# d
ICR = 0xFFF0;
3 G1 R6 o3 T1 D6 R- g. x/ O1 d
IER |= 0x12;
! a* @, i7 \( C# L W
CSR |= 0x01;
4 d5 G- L% M- W3 F6 w. f8 M
1 q5 E; Y5 {% `
' t- @ y& o/ g
) l+ s0 V# H! Y7 M" w
还有就是两个输入输出函数:
) f0 v5 k, }' Q6 s( @+ d9 r R, n
void output_sample(Int32 out_data)
" V2 R T* z" J6 L7 z
{
P& U/ Q* Q$ b/ O( r$ S; S
AIC31_data.uint = out_data;
8 _+ R/ \1 H, h
MCASP1_XBUF5_32BIT = AIC31_data.uint;
% t3 [/ S$ q- s
}
+ m& z& o1 I. N2 L3 q
: H7 B) ]. u# ]. O0 c) \" h8 l
Int32 input_sample(void)
% p6 k7 Y- v2 H5 }6 r D
{
* ? f) Z2 V$ g! A: ]! l
AIC31_data.uint = MCASP1_RBUF0_32BIT;
( G. i' x3 ~' S ~
return (AIC31_data.uint);
& L* u0 P: K' l2 N; h8 i! R& |
}
/ R" v: j2 M: ~7 h M& W4 {
5 X1 H" b0 H( G6 D8 U$ |
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4