嵌入式开发者社区
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
[打印本页]
作者:
yusijiangchengm
时间:
2016-3-15 16:07
标题:
C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
/ f3 T9 }# Y" l2 q
main文件:
5 f0 x0 e1 V- ?/ i4 ], U
interrupt void interrupt4(void)
9 [% r1 H5 w1 a
{
- h4 i$ k3 t% T5 D
Uint32 sample;
9 {5 u7 i* s2 g$ j# [* x* J7 l
+ s/ n$ H2 T. j: p+ y* I
sample = input_sample(); // read L + R samples from ADC
: _! _& l' m5 n, K/ d3 ?
output_sample(sample); // write L + R samples to DAC
' E' y5 X* Q& p7 P/ g
return;
0 ]; ]0 w4 K5 s5 j" E
}
5 R1 b: ?2 t% X; k3 L& Q
* B3 J5 r2 L( W3 T; |' @
int main( void )
$ d1 {, b( K( ]+ I
{
* a3 D' k# U2 s: M3 \
3 C& k2 T6 E. c
/* Initialize BSL */
k, [* u1 Q! Q! C
EVMC6747_init( );
2 _" e7 w! c) u8 r @
/* Call evmc6747_intr function */
4 Q l3 t( A6 j: K
aic3106_init( );
! F+ J: ^ g+ S5 E; {2 S5 R- G0 _
while(1);
& w! F. R6 T" a: x$ W/ a3 j+ K/ h
}
, u8 g4 ]" ? e/ U8 ~* V7 T
9 n v2 R- k6 {2 G' ~+ o9 P) ?0 T
9 W8 _, S4 D$ i/ e9 j8 j- O0 O
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 X: o" H) @% m' d; Q
/* Initialize MCASP1 */
" Y |# l# H' J+ |) H
mcasp = &MCASP_MODULE_1;
7 M- V- e$ u- D' C l3 k
mcasp->regs->GBLCTL = 0; // Reset
* \5 s: ^1 p" R. `1 W
mcasp->regs->RGBLCTL = 0; // Reset RX
' t/ o2 L. S( j6 ?
mcasp->regs->XGBLCTL = 0; // Reset TX
3 E- m) q( t7 Y+ E: s& n- I/ }
mcasp->regs->PWRDEMU = 1; // Free-running
3 f- _3 Q2 V# P; f9 ]- H: |
// configure McASP0 receive registers
+ x2 b# f5 D4 R9 m7 l
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
& w! K# ~) ]$ D# W5 I
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& _* n" F# W3 q6 `
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
0 u! a( z* |% k1 j# q4 @) W s6 z
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# ?1 u) Y8 P8 q( A* X
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! N+ E- u/ C0 z% }$ e' a1 F2 [( d
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
0 z( T4 w3 ~7 K: t2 O$ D
mcasp->regs->RINTCTL = 0x00000000; // Not used
. A) m- R! T( S$ v' m
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' ^2 t8 W* z( |8 Q W
# d# s7 _4 o) Z7 P; d; X
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
" j1 L6 \1 F# z* [* j4 ?! b) [
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
* x( p0 ^/ g4 o' R
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
, l* J0 c3 E) k( p5 |
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* h1 w. B* Z$ h8 ]0 v& ?+ }/ Q
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
6 K! Y8 ?: Y( P4 F; P m
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
- g5 N0 i* U& Z- ], Q
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* @+ y7 T& \* y/ b
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: ]1 O- N @/ P$ K& D% V1 D2 Y
1 X, _& Y! X0 j+ Z1 H @2 ~( I
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: L4 e+ X. J% S5 p
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
6 d- f" n& P' m- P2 M( V
mcasp->regs->PFUNC = 0; // All MCASPs
& @ k$ Y- m! e7 Q2 b7 s7 Q" ^# N
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
# S0 l3 b8 O1 g3 ?
( M( i& t2 e2 M2 o
mcasp->regs->DITCTL = 0x00000000; // Not used
% ]4 k# n/ p3 o! u
mcasp->regs->DLBCTL = 0x00000000; // Not used
& Z3 T# ?" B2 P' P
mcasp->regs->AMUTE = 0x00000000; // Not used
# R: j; T6 r# G2 \( y
4 m* ^& k4 @& n
/* Starting sections of the McASP*/
2 o* K8 G* d" g" T$ B1 S' `
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
2 Z4 D+ b! X' @; p
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
% d( y$ b, d: z- ?7 P: W
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, E9 O' u; ?6 J3 f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* ~% ^' [% R, E4 U3 i$ s1 ?
4 y; I1 ]8 Z) g* k" _
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
! P+ U2 V- Y7 W! E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 g& [# g: x" B6 r" W& M" L% E
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
8 ]' M: {; ?6 a3 x- J1 s$ u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) {. z/ T) \! S; a2 z- a
% ?/ @' N2 b* D! M/ Y, Y5 F
mcasp->regs->XSTAT = 0x0000ffff;
& Y% ?+ J! [7 U N7 L+ [
mcasp->regs->RSTAT = 0x0000ffff;
) N% [. U% I4 v" @* v, a9 \, Q
; A5 Y e( N, H3 Q0 G- O* x# ?
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
& o, O+ n- D: E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 a8 b# {* y% `, p8 E; }0 R( A
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 P; \7 ?6 R8 I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) { O/ U. q3 ]+ `' j) g7 W
' c+ N% j8 j/ _0 @* G
/* Write a 0, so that no underrun occurs after releasing the state machine */
' r6 [1 Y! {" ^; { V
mcasp->regs->XBUF5 = 0;
8 L& I O- S7 `4 `& W3 o0 \: v
mcasp->regs->RBUF0 = 0;
$ m9 x, b; x. Q! y5 @9 d# W
; v c, p6 n x, P
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
, U. T* K+ Q( q3 n2 S8 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* b4 N3 l" |' W# |8 \
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
& J0 L+ P, r9 [# Q" P3 i' s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 k e2 G4 q2 R& i; M
8 |" l1 ~$ w2 H4 J7 Y
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ l: t; W% ~4 s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" Y; R1 ^, {6 A/ s9 ]; J
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) a7 D+ I2 i, R5 B1 [3 m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! h: {/ d; E, l; n) ?% H+ m
$ Y" ]7 f# H P* r& T
CSR = 0x0000;
7 A3 G, Q1 }8 Q/ `9 H2 Q- c' \
INTC_INTMUX1 = 0x3d;
2 B0 P; H4 y* [/ s4 Y! Q: w: @
ISTP = (unsigned int)vectors;
1 ?1 V' E! O7 n, A' k" D
ICR = 0xFFF0;
1 c4 ^) ?$ j, k# W. f$ e
IER |= 0x12;
5 V% j# T, k5 t' f2 ?) |. |
CSR |= 0x01;
0 m7 |7 [+ Z: E: R! `- F7 r
# w4 O2 \$ i: i( A0 z
# G# R' x; m% X7 o, |
1 C+ k5 N. t) {
还有就是两个输入输出函数:
/ |7 ~! N. f! h' C# Y! S. ?: D6 J
void output_sample(Int32 out_data)
6 c9 r' |3 ^$ [7 k) f& p
{
/ N$ M; e, \+ q4 E6 c* k( _, \4 {
AIC31_data.uint = out_data;
" s$ T+ h0 a$ S u6 x
MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 r4 \( Z7 ]; D' g5 g
}
" V! {! P% ]. I" g
0 O$ {$ G/ l# i8 G; `: p2 S& s
Int32 input_sample(void)
* ~8 J! h3 j/ {
{
% e5 A' i1 G+ V7 N# r8 s
AIC31_data.uint = MCASP1_RBUF0_32BIT;
. N7 O. Q8 I/ k, |0 O ?/ f& r
return (AIC31_data.uint);
! d, h* F0 |* M4 s4 `4 k7 w) R4 ]
}
/ u( S4 H6 b) H a0 b2 P- a
# y8 m$ l; O8 v. o( H3 r
作者:
human
时间:
2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4