嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( R4 Z- E& @& f5 B1 W. V
main文件:
2 T$ x# R) X* F# }& d
interrupt void interrupt4(void)
5 Z1 [6 [. ^9 l8 I- V& v
{
* w7 K* S8 q) z9 C: h1 ?% m
Uint32 sample;
$ T5 ]+ |& ~& |
% O8 S, d9 K& E0 ~' h& L
sample = input_sample(); // read L + R samples from ADC
+ P E% \4 f( `; ~" H1 |
output_sample(sample); // write L + R samples to DAC
! j- L# \& S# ^; Y |
return;
' @ q% C/ K8 ]' t
}
4 v- V( Z' \- G) }. E( L' `2 @8 ^
" H3 X0 W) D% c$ u- y
int main( void )
# C: V6 b$ |: V- x8 U' ?. C
{
7 ]% ~8 ~9 q& Q5 {3 r8 V
# C+ H9 }4 q$ M) b
/* Initialize BSL */
$ F' r3 F1 V4 k7 ^ \$ d
EVMC6747_init( );
9 e+ [ ]3 X! e. g# L$ z2 C3 c" w) P
/* Call evmc6747_intr function */
$ O4 q1 c/ G* H$ t8 Y- ~: g
aic3106_init( );
$ ?6 { w% B* q+ a4 d
while(1);
) B9 T$ ~/ k% l. P
}
9 u2 s% J$ O7 `; o
3 e3 o3 N. d2 A# _7 K: w' p
+ J) ^" T$ | x, O
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
4 T2 w& }3 @( Z1 B3 L
/* Initialize MCASP1 */
; w7 Z. H3 ?8 [9 A5 J8 z
mcasp = &MCASP_MODULE_1;
7 I7 @% R+ F8 H' {7 h; |7 s. H
mcasp->regs->GBLCTL = 0; // Reset
6 g L/ _: c% D& C* K3 T
mcasp->regs->RGBLCTL = 0; // Reset RX
( }: j8 z$ m% a4 H
mcasp->regs->XGBLCTL = 0; // Reset TX
! k1 D0 T7 m T& f
mcasp->regs->PWRDEMU = 1; // Free-running
, \, r7 k: T5 R3 `
// configure McASP0 receive registers
! O7 ~2 w3 s2 V% L, H+ w
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
' S8 a. u, F# j; C* m
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. [% J! t; Y2 j4 j; U/ l, R6 G
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 U8 S! h; ^9 ^, i3 A
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* P% [5 c6 }( ?* f( {
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
: n. }8 ]/ Q9 @3 q: U f3 M1 q
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' {3 {/ J, y! Q
mcasp->regs->RINTCTL = 0x00000000; // Not used
& x- ^8 F! r3 Q3 p3 B! {( q* j
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ ?( s& W# P7 I' E `' G) G4 b; d
- F8 R" K; i, E) _" F9 l
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 {0 s; D; N" ]- b
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ r5 ?' G( j2 |/ C8 b7 t
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
$ q4 \' u# E9 T% v; s7 A! p$ c
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ G0 n$ m' c/ Z5 \ z1 @ `
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- }* t- z2 }* k' P3 u. q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
" b* S) c( N) {8 T0 z, c4 d
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
- C3 Y& S+ j' u
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 n4 x% n4 `& h/ P$ H* R1 p& C
4 h' o$ J0 U0 P$ I: ^
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* V. |' W& h6 ~: n- t6 l/ t" G
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
! K- S9 t; @% }
mcasp->regs->PFUNC = 0; // All MCASPs
9 R1 A7 i6 y9 G- E+ b p
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 e# C: q. W4 D: Y/ G7 N/ T; l
) ?# _. ~6 ]! @ Z5 V) k% T
mcasp->regs->DITCTL = 0x00000000; // Not used
/ x7 q6 X9 r9 `& }' q9 \
mcasp->regs->DLBCTL = 0x00000000; // Not used
) z* I' Q% q+ f+ j) k
mcasp->regs->AMUTE = 0x00000000; // Not used
$ L4 P- s: |/ m- ~0 M
) \% Y+ Y7 D, N
/* Starting sections of the McASP*/
& D7 U! t% k3 b
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 {) d( W5 j* u4 ^; B% D4 j! `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
5 N4 D6 W# ^% b& M
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ R0 r* s4 v2 C/ Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- z9 n+ i8 G" ~
9 E- ~1 J# u7 v. R$ A
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. H$ Y! Z3 t8 K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 W1 A0 J$ ]( g; O3 E+ @
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, q ?* ~4 ?4 U6 S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- i; h+ r, C+ k# {) v
1 c4 U+ f, e0 t1 m5 J1 k
mcasp->regs->XSTAT = 0x0000ffff;
5 Y% o: N+ d; K# R0 K2 H, d
mcasp->regs->RSTAT = 0x0000ffff;
& Y" i+ W2 q- c2 k1 C
) ^4 R0 B( U) B& T6 D
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! H. ?- C8 q0 z& \! M% W7 Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 L0 V( E3 r) O8 L! z$ t. ^/ C! L
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 _; o6 ^* D: s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: |, t% b( d: G7 c: f3 f7 h V
3 z% c3 [$ S2 P2 M- K# o
/* Write a 0, so that no underrun occurs after releasing the state machine */
- E' L8 G- K$ _: O3 k8 r" ?
mcasp->regs->XBUF5 = 0;
1 ?: k7 y( H; I/ Y: a5 `
mcasp->regs->RBUF0 = 0;
# E+ n7 p4 {* ], p
6 P$ o: q, C/ `! c3 Y
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 z" j: {) Y4 [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ k+ t( N: [; Y( u
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ L R J( p& f7 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# a( Q% M t* v
! d5 k4 I4 P3 F/ X" x* ?% Q6 [$ ]' W
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 [7 p0 G2 q1 `# K, p2 ?+ O0 L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' l& @4 Q, t' u3 _
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
/ n7 ^& B. a, ~( |5 V5 G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, _! Y& N- Q1 f/ i
. s- L' ` {* N; `& b
CSR = 0x0000;
! P+ j6 |7 Y ?8 Y$ J$ O
INTC_INTMUX1 = 0x3d;
3 H3 ^; x# V3 \( q5 g, @8 P" k
ISTP = (unsigned int)vectors;
, X2 _9 m2 Z$ v! ~! [+ b3 [
ICR = 0xFFF0;
! `& `2 v+ d9 I1 ]
IER |= 0x12;
# B" Z) m. N. A: _
CSR |= 0x01;
% `' A7 y1 x8 j% q' h* z! T; u
3 ~! l2 l) y+ I5 E
1 w) U+ c/ t* X) F" l E3 ]# p
p( `+ e5 l) P3 `' s
还有就是两个输入输出函数:
3 n! g7 X O' S! }2 L
void output_sample(Int32 out_data)
* [) p# [4 q# A% Y; X9 t; V" x
{
" N7 C' W& E0 u& [
AIC31_data.uint = out_data;
# N! I$ {' ]7 W+ } D& [
MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 z# c' D5 a" Z0 b- j1 c0 o
}
) f& T& c8 s4 N5 s% Q/ C
5 c$ ~( R; W$ K+ g
Int32 input_sample(void)
/ M- _ T3 m7 M5 l4 F! L
{
m, G- l7 ^$ E, u+ t
AIC31_data.uint = MCASP1_RBUF0_32BIT;
: a) S( h% M* ~0 {) _
return (AIC31_data.uint);
" p4 [% p$ g" P
}
: Q9 n7 g4 Y- V6 y7 U
1 m N% X; h, c
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4