嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 x3 L" Z; {# V6 p/ e* `
main文件:
6 e1 k# U a5 o8 D; n. [- F' E
interrupt void interrupt4(void)
1 B1 p: v8 `& V M
{
( `: X- Q( [5 q1 C+ w0 T& m; `
Uint32 sample;
& ]) ]! M' }! K/ n# m2 i
. m5 o1 c& G0 A% C! @
sample = input_sample(); // read L + R samples from ADC
, R) j# p4 b* |: [3 w7 P" G- ~
output_sample(sample); // write L + R samples to DAC
% w0 T- D& q; ]: R6 M( f$ X
return;
4 f' l: O1 o% t7 z
}
" K% O+ W, b1 w# K4 O, u
3 ?) f3 L. g/ O a
int main( void )
3 D$ n$ p5 S. x- b5 E
{
, ^8 g d* {; e4 W3 W
c8 U; V$ a/ B2 i5 o6 Y/ G
/* Initialize BSL */
( {! M y/ d/ W% O( w5 L
EVMC6747_init( );
" f9 H3 t% x4 i% D$ Y4 P, ?( P
/* Call evmc6747_intr function */
- K9 h4 S- m1 C( Q: c7 Z3 k8 {1 s: m
aic3106_init( );
/ C3 l7 y6 q- ~/ x7 |: Z
while(1);
% s9 [9 _6 y4 J
}
+ E- g* Y6 _* L* q r# n
2 {6 s( @( r; J, \( d2 r
& u- R/ R3 ]2 r' ]/ g1 t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ U/ ]+ g% Z/ F" z) Q( Z
/* Initialize MCASP1 */
5 w3 u) n# M2 `
mcasp = &MCASP_MODULE_1;
3 d- t, e" ^! i! n$ B
mcasp->regs->GBLCTL = 0; // Reset
, v4 s/ Q" L8 `* X# L8 \
mcasp->regs->RGBLCTL = 0; // Reset RX
3 q0 `, G8 p1 D! h3 U" {" [2 r
mcasp->regs->XGBLCTL = 0; // Reset TX
1 x7 m. Y2 F2 Q( a% |
mcasp->regs->PWRDEMU = 1; // Free-running
7 C/ E E+ V7 |& K" P
// configure McASP0 receive registers
5 ` ]( X3 @, j7 }
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
) Z) f6 |9 W6 U" |6 d
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 Y4 S. c' |0 C6 d) A8 K( ^: ?
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
. ~; S% M/ v, P; n' ?
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ V. N! b, o. t; l d* T
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
% ?2 O0 Z$ h8 K
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 b3 y5 \/ o% j9 |, t- X& J! p7 N
mcasp->regs->RINTCTL = 0x00000000; // Not used
( m" G1 k5 L b: B/ g7 N
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 w: E) e! n! Z1 {" j1 m2 T
+ N. `4 C# J6 w5 c
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" k5 q z; ?6 s
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 t- p3 }3 s8 f" x9 }
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 ]# C1 j# C O, I# J: P( q! K
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' W0 k; t0 O a9 Y2 I7 m) S
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
0 t( w4 F% \+ Q
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
' g; E0 h9 u* k/ A# x C
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
, z: `' o- F/ C/ ]
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: A" w9 C. F/ z, B1 w+ o
4 D: p3 d$ u) A; t
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
( ?- C! g2 M+ ~+ U6 r
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% T9 L2 n2 R& A
mcasp->regs->PFUNC = 0; // All MCASPs
/ M2 `* d/ n- }3 R, q7 _5 ]
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 ]# l: y/ o) b+ B. J/ o! K7 @
8 u7 [8 x$ S! P4 S9 P, B0 R* C
mcasp->regs->DITCTL = 0x00000000; // Not used
) R& L- e* p9 f; z
mcasp->regs->DLBCTL = 0x00000000; // Not used
) g4 m2 D7 ~9 g) \
mcasp->regs->AMUTE = 0x00000000; // Not used
3 f. A" b5 p8 m, u" y" x6 p$ @
/ m6 K+ v1 G7 M- q! w6 V
/* Starting sections of the McASP*/
+ g& c1 ~0 ?8 [) u/ N" K# J
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. G3 d, _) r- m) V( }4 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
. n8 _; @1 ?, r/ L+ j
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# b! I% |! R( |7 \ u6 @6 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
3 t! p: U5 L1 h9 l; L
4 f x! l: `8 }' K
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ _- i9 N" e5 k$ Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; [, p$ E. {; v, r% V. W$ N [
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 w4 U) z7 q/ g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 ^8 c. u9 |! T9 E+ M# l2 X2 [! m2 A
- @" k: U/ p/ J1 w$ A& _
mcasp->regs->XSTAT = 0x0000ffff;
: ~" q- c/ ~3 @
mcasp->regs->RSTAT = 0x0000ffff;
. ]! P$ j5 D3 x& B, _) k9 ?
" J. S H5 b' U
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
. g1 r& C( l1 ]* n9 o0 |. {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 d0 [* W+ I) u# J5 X! n
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
/ ?. |2 R' X8 z6 L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 o/ M+ v/ {0 n- h! I
1 f4 V( F$ w/ I" j. h6 G" O
/* Write a 0, so that no underrun occurs after releasing the state machine */
' Y, u* |' L) @$ r$ P
mcasp->regs->XBUF5 = 0;
# }/ f. E& W: m# y# o* r2 i$ O
mcasp->regs->RBUF0 = 0;
, T% V5 S, y5 E" C5 L5 l8 q
/ w. N' m0 {& \0 Q: U. C- x
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
% K4 M. ^$ j; q, q) n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# }1 t2 n. F- E
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' V2 o7 F0 n( f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- _, C* d/ |9 o% E
) A7 o A$ Q/ M1 G; f! u
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ L# E, h1 `& {9 |6 l- y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' d9 M, ~3 ? h2 J( o
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) s/ N' T9 G9 H7 g9 Z+ n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' N! |) s) _6 _# I3 E
- x+ j' s$ q/ v7 }9 N
CSR = 0x0000;
0 O$ y5 d8 j- k! h# @: Y
INTC_INTMUX1 = 0x3d;
, m/ y0 i* ~8 l
ISTP = (unsigned int)vectors;
" \" t4 A8 B1 Y$ N! N. H, T- Y' _
ICR = 0xFFF0;
! _- B5 t' `# p/ t
IER |= 0x12;
1 K9 C% a/ e6 @2 i9 X) M* ]
CSR |= 0x01;
) P) T! B5 e- a# v3 r% A u) c$ z: z
( Y: _) T$ R! O4 A( a# _
- z. {2 q/ w( K
1 X3 c1 u6 B& \& L3 k
还有就是两个输入输出函数:
, z: [5 s# P7 p5 p- `
void output_sample(Int32 out_data)
& h2 \# I- m. j3 y: r/ |
{
! \ S7 P' r1 i) w
AIC31_data.uint = out_data;
' P' ?% @7 b4 ?, D, o! R
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 T/ k* t; p, c4 c
}
5 @5 I, |4 X" M8 I) J
% A0 O- m( K- L2 j7 s; z7 j
Int32 input_sample(void)
1 t1 L* g. N% u, ?7 U
{
8 C# r3 p' `, Y4 q) q2 x
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ X$ R% n$ y; }7 J9 G+ @+ K9 O t
return (AIC31_data.uint);
/ z4 S0 N$ F; L% d5 |. y
}
( O. @" d- G' h8 R2 Y
# O4 {! X- w7 G' c# T
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4