嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. L0 n8 |4 }+ u; q5 h4 c0 w
main文件:
7 I; q: J9 q8 A6 A1 J
interrupt void interrupt4(void)
! @6 E/ ?5 b) E4 E( u
{
4 w, q w+ ]" E5 ?- R% R4 q
Uint32 sample;
3 |! {4 R8 E* y, m: D
% s, f* r& {5 r; L- G# _+ G. z
sample = input_sample(); // read L + R samples from ADC
7 r+ K' C7 v2 K. K7 w9 f
output_sample(sample); // write L + R samples to DAC
% q& m( G2 x0 V! W
return;
. m6 o D& d+ j, }2 R
}
+ t& _& Q7 K* c" r( }0 |. L
, f8 c# R) }- G8 l6 N" u
int main( void )
% k; O. x% u5 @0 Q8 |% _/ A
{
0 N- _3 C: Q; u" Z0 ?! c
; S- w& L: H# ]5 r+ g) |
/* Initialize BSL */
* d7 b; c o& R3 e! }
EVMC6747_init( );
' n5 v- A- T6 Y3 p4 w2 ^
/* Call evmc6747_intr function */
Z: s0 s0 @ E1 Y+ X5 W4 C
aic3106_init( );
1 r: \! u' c& n
while(1);
3 x5 s; w# w7 f; K5 u
}
4 V ^- ]; w; {$ ^9 [- x, {+ ^) u
6 X& t/ @) G/ P5 w- b4 U! }
6 |- C3 f2 }3 X" J4 P, G8 u
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
, X! E! b- y( C& j/ f: Y8 B8 |) ?
/* Initialize MCASP1 */
9 F/ k* n& ~) S* y$ y+ v
mcasp = &MCASP_MODULE_1;
" U2 @+ S* @9 I) v5 @
mcasp->regs->GBLCTL = 0; // Reset
! F% m9 `- Q& `% G& z
mcasp->regs->RGBLCTL = 0; // Reset RX
+ n9 Q$ c* F1 A: F1 H; b
mcasp->regs->XGBLCTL = 0; // Reset TX
7 e; L$ O/ H( v/ h9 s& {9 q
mcasp->regs->PWRDEMU = 1; // Free-running
% n1 f' d/ S) T6 e5 ~
// configure McASP0 receive registers
A! x0 M4 F! F
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
8 ^6 S U3 q* Z1 j- n
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ K, e4 k: o3 {0 M, F
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# f4 y/ W7 J, ?$ m' n, J
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 g$ q: N$ ~6 r# T
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
2 m8 h7 K1 e1 ^ U; k1 @; w
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, w+ \! L$ k1 w% P
mcasp->regs->RINTCTL = 0x00000000; // Not used
+ v4 W$ I+ n* n- T Y2 l$ w
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 R y1 ~( M" k* p4 e
/ E9 c. P: u( a | Z9 L
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 n$ j8 }- }' H
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 a; x& ~) X' j5 s( B, g
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 O' D! X$ |" L& B" `+ J8 |
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
/ P, `% {8 c2 H1 ]" _
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
J7 C% K" Q' s3 \, Y9 `" T/ m: x3 M
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
5 C# d9 D' Z9 S& e) i$ {$ c1 q4 g: p) ~
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
6 J! [ J) k; H
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 `4 l1 ~& `+ }# k) D! A
+ `9 |5 q( K. N3 X
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* k9 x$ t8 g o8 A6 y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
3 c$ ]/ M# W+ V y* ~( u4 g. ~
mcasp->regs->PFUNC = 0; // All MCASPs
' u9 r" r- y s% n% P: u6 s
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
P& O7 ~- ]& l- S% I' H) f7 M7 u
p) z! ]2 _1 T5 `1 J
mcasp->regs->DITCTL = 0x00000000; // Not used
J- v" a5 s+ U! @
mcasp->regs->DLBCTL = 0x00000000; // Not used
# B/ W7 p( v: ^
mcasp->regs->AMUTE = 0x00000000; // Not used
. ^5 }! u& [. r* E9 Z6 j) y) W7 |9 a! u
0 n( o9 P4 ] {* c7 D! T: T; l
/* Starting sections of the McASP*/
- }' W% _& Q6 m$ h$ @4 i) ?; V7 i1 H
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
; T$ I7 U7 R, d8 h& R$ K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
) g1 m, c2 ~/ ~; N* P
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* A, w! ]/ c- R: H1 k$ l3 [- o1 u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! O2 H/ p: Q7 O8 `2 [
6 c; M- G- r$ }2 G" p8 I
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 y. W# U1 n7 P: J7 F! i" J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. }3 b" ^. ^& O& i" @
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
. f1 f9 F3 E6 m0 c1 ?
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
. g% X& U4 O) R7 c. F$ N! N( h! ?; ^
0 C2 ?- f3 m: x0 s
mcasp->regs->XSTAT = 0x0000ffff;
3 d+ l3 Z% m: `. J% s; [5 b9 D
mcasp->regs->RSTAT = 0x0000ffff;
5 y1 j- N9 ^' s. Z- q8 ^/ b4 C
3 R) A- Z G3 \& |
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
. c0 r% d" l7 D0 M6 \' q8 `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 B( i' Z v1 ~3 H w$ Q
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
! l! i. Y$ L7 i7 l" W I. C9 E6 B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( M. T# R) ]8 B4 x& r
& l6 `* _" v; h. n. d& c* v
/* Write a 0, so that no underrun occurs after releasing the state machine */
1 N7 ^* o+ p3 y; L
mcasp->regs->XBUF5 = 0;
$ u/ C7 |5 w8 D$ Y
mcasp->regs->RBUF0 = 0;
" P2 J( q: Q* Z' Y' c* c
0 i+ n8 Q5 R+ z4 {1 l- q
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
8 a. B% A: K7 ]% N& X9 e" ~0 {+ D7 Q& K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
1 X' h9 q! Q1 h9 \; i
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ |5 |+ ^ J( n1 M$ C1 F) G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
- T6 z! ~7 C0 |8 s" p& \3 @ s
5 H# A F! ^5 W; X4 F, }
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 a R6 j/ x4 y1 I; s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
, V7 w* n% b9 R$ z/ G) ^2 z' k
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# |5 x% s6 n- O! L4 o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
/ T1 w$ d& h; F3 K
6 f5 e4 J! u! x& u8 ~4 h" C
CSR = 0x0000;
. k- R" l7 h, ?0 C1 I
INTC_INTMUX1 = 0x3d;
8 y2 Q7 w/ t% |: B3 m% \% ^
ISTP = (unsigned int)vectors;
+ ?5 {0 `' N5 X0 m
ICR = 0xFFF0;
7 A, @$ z6 B3 _4 b) U" ~; v
IER |= 0x12;
" |1 q' p8 Q2 T1 |" f7 S/ J3 ^9 i
CSR |= 0x01;
7 F/ r7 g' d0 f5 V# ]" M6 }
, N1 M/ b! M, [) u) c
% G0 l( F, C: G4 [( e' _
5 S; I' X3 b) Z! ?3 |# y
还有就是两个输入输出函数:
7 Y l, k2 F% x: J5 m
void output_sample(Int32 out_data)
- k: Q/ T9 w! e6 I: V; _
{
4 S2 L% v# a5 X9 H+ V
AIC31_data.uint = out_data;
/ i* V$ ]5 I' D, s) J8 x
MCASP1_XBUF5_32BIT = AIC31_data.uint;
E1 M4 G0 l* k& h1 P& w# b
}
! G( w$ A3 I+ F3 t! W$ f2 O2 Z
+ X! l: ?% f) h1 G2 }9 l
Int32 input_sample(void)
. Y' U, Y" x5 p2 I3 h% t$ X
{
6 D; v9 \5 G' I
AIC31_data.uint = MCASP1_RBUF0_32BIT;
: W4 {3 L: |7 R& M3 A8 p9 e: v9 U2 `# T
return (AIC31_data.uint);
/ K( K* b% \) h4 n- U- L7 G/ Q+ Y
}
& X/ S& O) Q. j5 g% w1 s7 E
1 Z( z+ t8 F6 }* @
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4