嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! l5 U4 V Q- O# B# @! v
main文件:
, B4 \/ ]7 T$ O5 |. v- c
interrupt void interrupt4(void)
8 E; m5 R3 [) S" `; t
{
8 i- h l% k6 Z+ @& ^, l! y
Uint32 sample;
0 O# Y6 P8 @6 ~9 d1 u% i! V4 o1 Z
# A. q2 v6 R% J) U
sample = input_sample(); // read L + R samples from ADC
% L$ C4 t+ I9 j2 d
output_sample(sample); // write L + R samples to DAC
8 |' `4 U/ z& m- z. |9 B
return;
) \7 G; @1 A# U9 b
}
) ?0 u2 @ E/ R/ G' y- q6 Q
2 j% E) l2 D" G y. I" f! ~! f
int main( void )
: r7 i; r6 r# Y
{
8 X1 K# g" V# g7 c/ t, S
/ |2 k4 ]% @, v. A9 L% P
/* Initialize BSL */
1 a8 I" M9 q3 Y# x7 L# A$ n
EVMC6747_init( );
1 a6 l; e+ m1 [& I4 w' s/ V
/* Call evmc6747_intr function */
' a K7 q* P+ y( j! q6 n5 y; v7 R
aic3106_init( );
# E6 H3 f2 i/ S. g4 ^
while(1);
: j& }( k/ W) O9 e" _4 I
}
) o* X/ r3 m: N6 L4 A
1 |/ V4 ?; d, B
4 T0 v; x/ W- ~! `, H0 z+ H
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 T% N! j7 A0 q- E; P" O
/* Initialize MCASP1 */
9 H! i3 `2 K: d) z% R
mcasp = &MCASP_MODULE_1;
3 ~% j }! v8 G& g9 F4 v
mcasp->regs->GBLCTL = 0; // Reset
. K8 W$ K6 ^0 F( ~/ V' a4 s/ W
mcasp->regs->RGBLCTL = 0; // Reset RX
+ ?7 g b2 @. C, X: j* ~4 M. u" Q
mcasp->regs->XGBLCTL = 0; // Reset TX
! G; W, }( H0 a: V6 R
mcasp->regs->PWRDEMU = 1; // Free-running
5 e4 R. t6 C2 M0 q. H1 m. \
// configure McASP0 receive registers
2 d, k# R. y+ K$ c$ f
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! r2 J3 K/ R! n/ ~& ^0 ~6 k8 g
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* B% u. l7 j9 h* c
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ u: Q# v8 a g' g
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* y" b! ]& D7 T4 k
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
# H/ e2 |( j. F" j! h( ?
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, A* S" w, J2 y {% l' o6 H
mcasp->regs->RINTCTL = 0x00000000; // Not used
6 X4 ~7 h2 F# U* B" t
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" v( u2 B% y, M: |. F. a2 L$ N8 P& M
' _9 B, E4 ~8 O5 G S: _
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
* F( t! [, k' f% c/ f) J/ h
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' o: R+ l8 w0 V5 n5 y! ?: i
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% M$ L+ L! e! |+ |/ C3 d4 w
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ @2 y: Q2 C% e2 M9 u
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
1 t2 Q: {' M f" {3 i" R% H: w% d
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
& B. \8 S; b1 o
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
9 e1 X. R% F; D7 `$ a. W8 T9 _
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 S. T5 J4 ^3 f M& Z* C
6 V6 `$ r5 U1 |5 y- Z
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
8 t6 d& k |+ m3 T$ s& q! j0 O
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
3 K1 r/ m7 p" n* w- m& q. q
mcasp->regs->PFUNC = 0; // All MCASPs
8 A. p S: k% F6 K
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* A" ]0 p j# R3 ~# K O4 t8 a
0 b! F+ Y3 Z. v5 Y3 @; N
mcasp->regs->DITCTL = 0x00000000; // Not used
. Q; U% O4 G# D( J, f1 t
mcasp->regs->DLBCTL = 0x00000000; // Not used
5 M0 Z; T! a! M, d9 |) d* c' s T
mcasp->regs->AMUTE = 0x00000000; // Not used
" _4 v4 s" |- | I; [( I% U
( p- Y" b! k0 A/ l0 |- V; A
/* Starting sections of the McASP*/
) n r; R6 b8 h" y C
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 H( `: e6 O, a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- ]+ n$ s6 y/ W+ @/ |. b2 |
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
7 W8 n# M8 v' l; D5 K
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
, L3 g4 g6 J; v
0 u" J0 R9 E" C' V, \/ I5 O% b1 \" r
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 v. q* u" z2 r$ } |
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
/ b) _) t0 d1 E" S. ~
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, ]0 h! c3 ]# P& s0 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
9 U# I+ P( @. ~( \) `& r
% f0 v2 ` L# D/ l$ P! I
mcasp->regs->XSTAT = 0x0000ffff;
) Y" @2 ]- J$ A( Z; l& C4 \' b
mcasp->regs->RSTAT = 0x0000ffff;
+ _( I u! Z; B$ @
4 O" u0 Z2 [; V9 T
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
: x7 U; M3 x* e# {9 x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% N. [0 m) h! F. y# G7 a: `5 j. e2 b
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 e, r _$ g+ B/ _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 M2 g6 P; S1 a! I/ J% |& V
, t! b8 S$ j/ [/ y8 b3 A
/* Write a 0, so that no underrun occurs after releasing the state machine */
3 ~9 l7 ~6 N+ j2 g k
mcasp->regs->XBUF5 = 0;
7 n$ Z% L5 \3 l5 p3 j3 a
mcasp->regs->RBUF0 = 0;
4 l5 k# o8 s! \, |- }" y: \5 u {
8 p# R; @6 Y: ^2 X& G9 [
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, C4 u( R7 P5 E$ f1 l, x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, [9 |5 p& A: I/ k
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# B# ~ Y2 H3 G) J' X' V
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
) t% R5 x" z+ @3 h6 p6 q2 P
3 K3 S+ o. z) b9 F( o
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
Z5 N: _5 u% y, D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
- v( A8 y3 }8 B5 f
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
8 W0 _ Y9 X5 b5 w/ p( Q+ C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# i* ]" V3 k# G- @
# ^1 k- H( L3 w9 \6 c
CSR = 0x0000;
6 G. r! J5 ?! Z0 x4 \+ [& d6 m
INTC_INTMUX1 = 0x3d;
9 t! I; ~; K: I- f* ~* l! u$ c' [
ISTP = (unsigned int)vectors;
/ ?& K9 e) ^" s8 K/ C8 Y0 }# |* @' z
ICR = 0xFFF0;
. }% l$ N& i: y* E
IER |= 0x12;
3 d1 V9 a9 m( ~( \$ r# L$ L
CSR |= 0x01;
- s* I% |7 H& }# G# c1 ]
- @' }) Y' }+ C9 \3 O1 J# i) w
2 Q L; O+ A# w6 c* k' p/ I+ g
# L2 l$ A' o4 S# Q- T8 D
还有就是两个输入输出函数:
# R' D# R' G/ X3 p3 y/ e
void output_sample(Int32 out_data)
; b/ m' z7 W: G8 d. Z" M& c
{
1 [& p0 S8 N, d3 v, V
AIC31_data.uint = out_data;
/ n5 ~+ J$ b, Y! {: S0 ]0 [
MCASP1_XBUF5_32BIT = AIC31_data.uint;
' q8 l' W9 p4 C4 M! C9 ?. f7 n9 [: o
}
5 [" x0 r+ Y/ R; {! u8 e
1 l5 |1 l* H- D2 H7 q( P0 i" _$ Z
Int32 input_sample(void)
! i9 h- M$ b' _
{
' N* u8 P+ k$ W$ J) K( S, P% _1 ^
AIC31_data.uint = MCASP1_RBUF0_32BIT;
0 S2 U0 Q% l* E$ u! s8 X
return (AIC31_data.uint);
& _$ x" h8 F. s. g
}
: `' ]7 ~8 u! O/ b3 M( M9 Z
0 B) a+ G5 }& D) J* O0 B g
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4