嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 a+ B1 _1 D, }4 Q8 n
main文件:
|- t7 j7 ~# i" H
interrupt void interrupt4(void)
# J+ @* x; r/ _" @3 @5 O+ _. V
{
" `- W4 u6 V+ P; F- U( n. B- k
Uint32 sample;
6 O" a! x J1 L3 h6 t: W* F
% A( c& Z# N8 H/ P! C1 M) e; t/ u
sample = input_sample(); // read L + R samples from ADC
, ^ G- L6 a1 v9 L
output_sample(sample); // write L + R samples to DAC
( i' _3 C& Q2 F4 @9 p
return;
0 N' S4 z" s7 t$ j
}
2 c3 P( o( `# I( p& ~* X; Q
4 V7 T# ?$ B. O. W, d
int main( void )
# `; h# R1 j- p1 r' A. `; [3 f
{
- M0 Y* h2 z7 Z1 c8 h, Z
8 q9 c' ]5 K4 S$ ]- R, ]
/* Initialize BSL */
9 I" D3 q. j. V
EVMC6747_init( );
* E2 ^8 {+ V, p) ~, N2 R1 W$ H o
/* Call evmc6747_intr function */
5 p- d& P' L$ O* v
aic3106_init( );
: [: i" u# H5 s3 b
while(1);
$ [! V" v% b3 b; v
}
7 A/ n% G5 S0 I( o/ u+ M
`! Q5 B' n: X0 l) W' U; y' M
( x; ~1 I6 _/ C$ P. o
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
$ T1 y1 J$ [/ T0 i- t
/* Initialize MCASP1 */
! ~: k* [! N# Q" }
mcasp = &MCASP_MODULE_1;
, N4 y2 h( _1 `9 K( V$ z) ]+ k
mcasp->regs->GBLCTL = 0; // Reset
0 ~% ~& K9 w/ t
mcasp->regs->RGBLCTL = 0; // Reset RX
% g; I \3 b0 h1 R6 ^( ^
mcasp->regs->XGBLCTL = 0; // Reset TX
9 R' @- @$ D# U
mcasp->regs->PWRDEMU = 1; // Free-running
) n' |* g1 X5 d$ u; z, Y' `
// configure McASP0 receive registers
5 s+ w% T- ~+ X1 n) s4 u) `
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
4 q1 Q$ y5 M! a" I5 T3 x; w4 Y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; y, I" I: L L' H3 b. Y8 x( t
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, W8 M4 S" A" n! N& s0 X
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# S" P& N! X# O/ P8 \: N9 F& Y3 T- W/ z* F. h
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
2 c8 \2 P' V( _
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
7 P1 O) e6 e& r4 `, X8 ] p
mcasp->regs->RINTCTL = 0x00000000; // Not used
0 {3 p; `( c8 ~+ D, X
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; J, M2 K# Z2 Q" ?
" {- \. J# l( R# B9 J. G
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
+ M* O5 n9 _0 Y2 u9 {/ b7 ~1 l3 V
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
w9 P, ]2 `* y( k! c: L/ u$ x X
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 b) {' [3 f: X
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 m0 k* f9 R& M" y: T6 g
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, U, e% M9 L6 X- U$ @; X( D
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
0 d f) a( [0 o0 t2 O2 @6 C
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
; B# |5 K. u1 ]: X0 f, s0 z3 [
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# k2 D. D& Z+ Y! Y }- Q+ ^: U/ V
! Z& g4 h+ K/ V& V, {" U! |
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
1 {# q7 l+ j5 `# C8 ~
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% ^+ |/ ?, @% A
mcasp->regs->PFUNC = 0; // All MCASPs
5 p; \3 l* K7 V' [
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
% T2 M, ~8 a& x; w
; _# [5 n7 G+ D8 o, i7 k+ ]
mcasp->regs->DITCTL = 0x00000000; // Not used
8 T g3 G7 s1 C& ~( l
mcasp->regs->DLBCTL = 0x00000000; // Not used
3 U) R* x! L. B- w
mcasp->regs->AMUTE = 0x00000000; // Not used
T8 ?0 V/ y1 j1 S; s# |
/ y% @' W* N) Q7 X7 v" b
/* Starting sections of the McASP*/
0 e' P) ^ @3 z. g- W% l z4 C
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
^$ e2 b7 @9 G- `
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: \ @. a3 L7 e% a/ ]2 |4 P5 O
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 s3 A! W) {+ C2 r0 O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! x# `& ?3 ~2 A
) j. w+ Y6 |: V& O1 Y% r- ^8 K
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* \$ M; y) C0 I! v! e" @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- I/ S8 j' M4 z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
0 V4 h9 f" q4 Q5 C! c4 p# e& o+ P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* X2 Q4 M# r+ I' B# Z, k3 x
- \2 U* J& j9 |3 [3 b1 Z
mcasp->regs->XSTAT = 0x0000ffff;
$ \5 i" g4 j0 u( h
mcasp->regs->RSTAT = 0x0000ffff;
& O. J& d% ^4 I9 L! X. P
) d/ U$ B( _ K
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
6 h4 A9 L9 I# D. I! I! h* t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& [ T( ~8 u& ?* X/ H
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, i: [5 C# ~$ ~; |) b0 \" b3 U' U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
/ v" E/ f9 B/ }5 w$ L& v7 R
) q. u& r* i2 [1 ~, Q" y
/* Write a 0, so that no underrun occurs after releasing the state machine */
9 P0 o5 u) ] j% E
mcasp->regs->XBUF5 = 0;
) ^& X( y7 l6 U& c
mcasp->regs->RBUF0 = 0;
" _# [* f8 ]0 @3 X, d9 \
9 Q, s# ?( |$ b0 t
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, D! `1 d% Q7 I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
8 O0 H2 d Y& ~+ R) m7 c* i
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
+ N6 A4 I$ f, D6 c2 i, y. q" x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 B4 a) k# ]1 ?# h* O+ N
/ C0 B4 Y c. V3 i- Z
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
/ z" J$ D" X" k+ D3 Y, a/ y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 s; r/ f1 e5 \' P% p
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 i0 K' B& N' y& t& L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 H, p( k) R& r8 @9 S x" o
; _5 W6 M9 X& |9 _
CSR = 0x0000;
7 V/ x& m& n# Y( Q% p: `
INTC_INTMUX1 = 0x3d;
* i- {6 [/ c; Y# A
ISTP = (unsigned int)vectors;
6 i1 P+ ?+ }- ^* d0 v! x* B
ICR = 0xFFF0;
; t. c- d6 k s0 x# o7 ^0 F
IER |= 0x12;
. M { ]4 M2 [; G0 ~
CSR |= 0x01;
1 f/ r7 S" ^. m2 V7 ^
! j4 V2 m8 E) S# b+ v: W1 s0 X3 Z( \
6 [, z, i! m; U* ]
$ s W: t5 M5 m% m$ f! Q! P6 k6 e
还有就是两个输入输出函数:
6 j$ B! u! m# _0 F: J% U# [8 Y
void output_sample(Int32 out_data)
+ k: V" C" M7 D0 g: r: B4 d. U- o
{
3 B* x+ U* l6 g7 S7 C6 k
AIC31_data.uint = out_data;
! H4 Q% O6 X/ P) a2 q" o; u
MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 Y- Y9 L0 D+ n4 K% R
}
! r5 G: H8 `6 E) q" Q
6 g6 v0 G' y& D0 j( x
Int32 input_sample(void)
$ J% }( E# l( s2 \7 v% n9 t& e* l
{
7 k& [7 F7 m+ M1 t+ B$ ]8 C" `& h0 C
AIC31_data.uint = MCASP1_RBUF0_32BIT;
8 F. i4 c2 W% E2 b9 G7 d
return (AIC31_data.uint);
/ c5 T/ l6 k6 Z" z+ |& B+ A, L* Z
}
5 ]3 F, H$ m# m9 M5 w0 J
! {( A/ Q0 @" |0 ~6 ~9 q
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4