嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 P4 ~# f$ a$ y' E4 S0 w
main文件:
# p. n2 Z: e, z3 f
interrupt void interrupt4(void)
! a E4 v0 `" J2 N1 e1 b+ [( G5 y
{
' W2 _! z2 o& W8 }
Uint32 sample;
& Q! l# \+ E( Z3 d' w9 F( j& S
& d: Z) ~& O5 w6 S" G6 a
sample = input_sample(); // read L + R samples from ADC
" t" n5 H: A5 @) J/ K R: z
output_sample(sample); // write L + R samples to DAC
8 r0 e s# \+ R" X( g) c
return;
: W1 k- l) ]7 H0 _$ D: S; v6 P4 \% l
}
. d( g/ Y: z$ k' ?
$ c% C6 s9 f3 k- S
int main( void )
( i6 {/ z a0 p% b4 y
{
9 @' O/ U" f' s1 e( {3 E, @; ~/ H
2 w8 O. x3 c( V, }) C; K9 k1 v
/* Initialize BSL */
7 o& K$ u3 X2 D4 t$ e# J
EVMC6747_init( );
% ?3 x5 x+ t1 }4 ~
/* Call evmc6747_intr function */
$ D! v o: i5 J
aic3106_init( );
8 w4 q; l% [6 T9 O, n) n8 Z
while(1);
. s+ V3 W$ B" F7 P9 F
}
1 m0 w ~3 z) X z: t0 {
' z% o* E" l9 K/ ~: U5 i5 P: V
# }8 j! F- |) F9 O+ O+ I% g! H% H
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' z4 t4 M, G& r6 S, Q
/* Initialize MCASP1 */
/ q( q5 u8 A9 F$ x' R, C
mcasp = &MCASP_MODULE_1;
- N3 V- u( D) r% X
mcasp->regs->GBLCTL = 0; // Reset
) j0 K" `% g* h) g3 J M; c# i3 O
mcasp->regs->RGBLCTL = 0; // Reset RX
9 t% Y h0 S& g. _; i9 m( F z
mcasp->regs->XGBLCTL = 0; // Reset TX
- r! q! X% k+ }+ q- y
mcasp->regs->PWRDEMU = 1; // Free-running
1 v' h }; n; f0 }
// configure McASP0 receive registers
+ {. u- v1 Z. x3 e l
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
; ?4 `9 e! E8 m r
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 y1 o [1 N. q N1 `& p9 W
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# L: P! ~6 z# S. U
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
2 X* j( T8 @; a; [$ c3 U! i
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 r' ` a8 ?% c- N( S
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 A7 l" [3 N4 v6 J! h0 ~) v9 e+ v9 ~' y* Y
mcasp->regs->RINTCTL = 0x00000000; // Not used
( v; G+ ~& O- E1 c% A# e
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, z9 ~# W7 T% K9 ~( u
$ M- d/ M2 u* e* X- w
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
; S2 D t7 K3 T+ ]1 P& e# z
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% Z* @0 |9 [, h0 i
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# F- f. J% r& G2 I. S% d
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
) ~, X$ p. V+ w+ e7 ~
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
7 N; R, O2 L* r$ i8 [4 S
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
9 {- D% G6 y+ ?
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
5 E3 u4 U- p0 x* \( k8 u. Q7 O
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: c' v3 L5 k8 y0 |+ U7 K
7 }0 P* A' N# F- g+ ^
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 S2 Q0 S8 u. U. j. z, V
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
: W, I* ?( {% b. J+ Q: ]
mcasp->regs->PFUNC = 0; // All MCASPs
1 j# o$ P. B7 t w8 y
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( C6 j1 ]9 T7 u% ?% ^" Z5 e
4 O$ Q& j! q6 M3 U. I5 b
mcasp->regs->DITCTL = 0x00000000; // Not used
4 P9 E, R/ Q( {/ f, T7 \
mcasp->regs->DLBCTL = 0x00000000; // Not used
* X/ |& z: Y. o, P( b- T
mcasp->regs->AMUTE = 0x00000000; // Not used
0 V, H& q5 K" l( p) U5 X4 ^
@' w7 G2 k, l* l
/* Starting sections of the McASP*/
* [' C" N3 }' _: J! j" _) V
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
, V Y# W E f# F! t0 H6 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 {( w, O; I! H4 Y# ~/ F2 Z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
' s8 S( \$ U1 e6 f4 z0 f! X1 K/ f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 ?7 u5 T4 N. @- L6 M
& d: o5 s( ^8 k6 h
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* f! s& k" N* Y% Y. n; f/ o$ S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 \4 k- L3 _ } y. C) n7 ]8 L
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# @9 B0 I9 B: U. _( V' x4 ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- q8 E9 R* E5 E/ P" O% Q1 g" @5 Q
: [8 T* j, j/ f8 {
mcasp->regs->XSTAT = 0x0000ffff;
6 G* l& w4 e' S# T, Q* n! t
mcasp->regs->RSTAT = 0x0000ffff;
$ g7 H" Y2 ^) |# }
) p; P1 h. S& o& o2 F8 \) \
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ Q8 o; M; c, {' E' q1 C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 z7 v$ B1 k+ s1 F* h
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
5 U& r3 v' z* h6 F/ s; ?$ u, m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
5 _: E5 x4 \7 _$ D; i
6 s3 f! j, ]$ f( Z
/* Write a 0, so that no underrun occurs after releasing the state machine */
* K+ M! }) w" N
mcasp->regs->XBUF5 = 0;
2 _* v1 E, |8 X1 P' D/ {. I
mcasp->regs->RBUF0 = 0;
+ @, L5 W! Z- |9 m4 b
& u6 c- C# F5 y
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 u# ~ }, \0 ^, v, y# S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
( Q6 B9 [6 e7 D% s! M
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ f- b* b: S0 J# t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
" y9 S2 e; Y" ^$ {- \) c$ z
. x* C6 V1 [, } U j, k2 R
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
. k; y9 [# ]8 u# n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% t8 ~4 q2 {% p( T
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* C$ ^6 z, [* r+ F' }. D- t; f+ u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ H) h; x# M% ~
; N5 K: t7 h; r2 A) i5 A* y) I$ z* e+ O
CSR = 0x0000;
5 p; q0 h% ]" G8 ?7 R
INTC_INTMUX1 = 0x3d;
8 o6 w/ n% O* T2 H8 F
ISTP = (unsigned int)vectors;
0 z. f' _, Q B# [" X: l0 {" L+ U
ICR = 0xFFF0;
+ ?; x/ z6 O* ^& U1 M
IER |= 0x12;
$ l8 h9 `4 C8 x; z
CSR |= 0x01;
" \ P. i1 }9 Q+ t, p
& G8 o. h& [! b$ M ^- `
% O* ^- K+ k- {. N! ?
& Q" s8 f& W3 m3 O% p
还有就是两个输入输出函数:
% h# z! q" E" J1 W
void output_sample(Int32 out_data)
$ Q% V: I1 Y8 C* M0 g% r: ?$ e7 z, Y
{
9 j S" I. ~' D1 W T' ~( ?5 c a
AIC31_data.uint = out_data;
% C( |+ ~( n+ E
MCASP1_XBUF5_32BIT = AIC31_data.uint;
: O- ^) _: D# ^" t9 ? T
}
" Y- ]8 y* f2 Z% d9 c6 ?$ x. K# Z, K
' Y( O& F7 z5 ?7 c7 A' l7 H+ l
Int32 input_sample(void)
0 S# [! P# ]* ]$ _
{
% b% E4 g: R' G$ x" t0 F
AIC31_data.uint = MCASP1_RBUF0_32BIT;
. p: z, I% h0 G, W
return (AIC31_data.uint);
% w. S/ \$ u8 f' V \2 Q& h' T
}
" ~4 g- ] Y+ a5 X
/ L% | Q. @7 G0 }/ D. g, p4 n
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4