嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 y' P8 a5 q, P% N7 B1 p, z
main文件:
+ |+ ?9 p, r; C" |' G0 ?3 S
interrupt void interrupt4(void)
/ G) t' }. d' S5 |
{
; }2 m+ m6 o% S _ ]
Uint32 sample;
, s4 B0 H) h; D9 ~" H2 U
2 Z3 ?( g7 X Q* Z- W
sample = input_sample(); // read L + R samples from ADC
! `9 a2 V& B2 o0 K# D; `
output_sample(sample); // write L + R samples to DAC
' T2 ~9 D- ]8 Y. [& l
return;
6 P+ Z4 j% ^! I2 E1 s& |! }
}
5 V- Y* ~; g: t- O6 u
8 X, c' k" G7 F _
int main( void )
: C( f! L' v/ F' l5 T- e$ o7 U
{
/ {0 y! @/ \! T& h) c5 L' G, U
& u6 G) G1 x) b& C4 z" N; _2 t/ B
/* Initialize BSL */
: n8 H0 W3 Q9 N* u6 s! Z
EVMC6747_init( );
1 O8 u$ m; U4 X2 v
/* Call evmc6747_intr function */
9 j! p; G( |+ Y& D8 k/ g- |
aic3106_init( );
. G: x- V9 B6 |( l- d; H* ^. k
while(1);
6 y$ |( |; ]8 D) q7 l: C
}
% T, S8 ^# g) M$ u* l2 Q
6 r' o# l8 e( S, S1 L7 \7 t
* m r S' H3 s6 d6 T F
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. G6 F5 }- G/ |" q; ^: m
/* Initialize MCASP1 */
' Z* l% ^9 _, m+ q' Y1 L0 e1 \
mcasp = &MCASP_MODULE_1;
, I* A7 @( c% g: N
mcasp->regs->GBLCTL = 0; // Reset
$ H- U# h7 i5 x E8 `' a' U* a
mcasp->regs->RGBLCTL = 0; // Reset RX
/ l8 M" I( F$ |" S- E
mcasp->regs->XGBLCTL = 0; // Reset TX
5 C, L) C2 U: j' p7 p* t
mcasp->regs->PWRDEMU = 1; // Free-running
) Y1 r, U. L" C, U) d
// configure McASP0 receive registers
- o$ [5 ?! c s1 A9 |( I
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 J' S+ y- Y/ A3 J( h, X& H
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 X: ]: [4 v8 p# A
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, p. ~8 G, ]0 d% _. s; C: h
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! ^- z, w% W& r: `
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; i' Y+ ~- b/ k: l
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
$ T% ]" z5 B) N5 J( c8 p
mcasp->regs->RINTCTL = 0x00000000; // Not used
' }8 U3 ~! |+ l# u( J% S
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 M% [% A9 i' q8 ]4 b: c
- p; F/ U2 z; Q+ K6 P& F/ C A
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
* o1 C5 c% j1 M, T
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 H- ^0 ?4 g) [5 H
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 V$ @" s: j5 f$ x
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# d# j0 `) f6 N' d% X$ U% z H# l8 s
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
6 G. y/ `; @/ y( U; `7 Z4 H
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
2 R* b' A; w A X, D
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
3 {1 G J5 ]2 H
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ I+ y6 R* j! j4 `2 M# Z
}( T+ S3 F7 m0 a
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
+ u- L! s5 f; @% c6 D
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
# Y) ^5 g2 Q7 N& w0 R+ ]6 [5 i9 S1 i
mcasp->regs->PFUNC = 0; // All MCASPs
, X' Y4 K$ ]( _2 A8 K7 i+ f1 P1 {
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( v: J; i k! F* o( C
, Q: V2 A' b. f: T
mcasp->regs->DITCTL = 0x00000000; // Not used
& M* z7 X* l' A) @& n
mcasp->regs->DLBCTL = 0x00000000; // Not used
$ i. c; o/ I W( S1 {2 T9 z j
mcasp->regs->AMUTE = 0x00000000; // Not used
4 M8 U6 {. i% ^5 S* s( U+ Z
% ^8 O) ^" S" J! E& J K1 y% `. ]& ^
/* Starting sections of the McASP*/
; p, \5 c# G% L" @7 g2 P0 @
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 e2 n* ^& J6 I9 f& d" c* x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 b. A7 D& \) i0 W
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 V7 x+ O2 u/ T4 \, J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 J) y7 i t3 L8 L2 @. z9 W V
( k: j0 w' L5 p
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) z/ }! j8 n. M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 u+ A3 N9 R; v% R: q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* q' L6 h% W3 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- P" I& P8 ?) p" P+ r' y* p
' m' J! |5 U+ O8 h; ?- I) Q
mcasp->regs->XSTAT = 0x0000ffff;
0 ^# t) u8 u S$ b5 t: F; h% ^
mcasp->regs->RSTAT = 0x0000ffff;
( a7 _8 ` `0 t- w
! C. W, L6 C; l+ a' R
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- |' x7 V* r. }. u& G, [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, R! U a- q1 q6 d: n
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) B; g+ Z4 m6 w0 G+ f, L3 @9 S) U- U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( t I# t/ ?8 W+ v8 I
1 G9 G/ Q( ]5 @9 n+ _" S
/* Write a 0, so that no underrun occurs after releasing the state machine */
: b" P/ n$ R7 [) q! w
mcasp->regs->XBUF5 = 0;
; M* ~1 X" o W% `
mcasp->regs->RBUF0 = 0;
8 M# }3 I- A4 A) h1 P* E
: x6 {9 z' X v
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" E W5 Y. R2 Q8 H* ~) J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" q6 c- J7 z& J4 k
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( s. z8 j4 M! p! I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 s$ R) F) H) W
* i8 O O- T. j, P
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
7 z6 W! c& S7 Y( A/ H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 G2 e( h& O3 h" b# l" t
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! K v9 t8 |( v1 w( d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
4 S* N0 T' j1 H' S4 j% Z3 y& @
& Z) o# B6 U/ a& Y& k
CSR = 0x0000;
1 `* ^/ i2 t+ |2 w7 G
INTC_INTMUX1 = 0x3d;
% M; G$ m* Q0 \7 J( C( a6 Q
ISTP = (unsigned int)vectors;
* |5 I( l2 N& i+ q8 e' O5 M$ u
ICR = 0xFFF0;
$ @, ?( M4 l1 G$ E( P( K v
IER |= 0x12;
: |9 ~7 e, x- H* O
CSR |= 0x01;
I n% E' E9 ~ J$ k5 E
) W' m# v% [: w
7 f( O. R3 s3 D" N9 Z
" U" k5 M% _' F" `2 B% f# {- j
还有就是两个输入输出函数:
( h9 a; [2 D, \' S: ~) D
void output_sample(Int32 out_data)
5 V5 ] F; G! ^% q. L* I. K( K
{
0 K. ]# ]2 T9 r. j `6 F/ U, D
AIC31_data.uint = out_data;
' g/ k) z7 [$ U5 u3 z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
u. q/ ~3 T, m; _* ^
}
$ y) M: j, z2 ~8 j) G. i
2 `" p' S1 u2 P% S' ~; G5 B8 C
Int32 input_sample(void)
8 o% S+ C' h7 s$ e' a
{
3 B$ U; W" m5 f# M% T. O- R
AIC31_data.uint = MCASP1_RBUF0_32BIT;
. k+ U- N4 |) N, z7 y* h
return (AIC31_data.uint);
% W9 j; H2 _- q' V2 b
}
, b8 I! ]0 ?, C3 A' j, S
9 S( N/ W1 L+ c9 S7 i" U7 P; x
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4