|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 b! G/ S- k9 Y: |! t! v. A4 K+ jmain文件:
2 d$ B( D5 o5 z- [interrupt void interrupt4(void) 2 a1 i! ]1 W. k8 @+ V
{+ N- n3 q! d9 D: L9 C3 o+ n
Uint32 sample;
. n" C1 y& b y+ e8 b2 n6 F- i- _# k! v& X' `& F
sample = input_sample(); // read L + R samples from ADC9 Z6 e) ^! t7 l& c
output_sample(sample); // write L + R samples to DAC
: ~, J& L, H6 I! j return;7 ]0 a( O, e- d1 y! F
}
, S0 m3 B5 O9 q! c& h
1 F6 P# s* I* x' xint main( void )
$ _8 d/ U% \3 l: X{5 u6 S/ \' q9 y# Z
5 J( U' [9 d4 S" |1 O
/* Initialize BSL */
% m" p. B6 ]# t$ T/ [ EVMC6747_init( );, [ I4 T4 c+ s2 X5 L) q
/* Call evmc6747_intr function */
; E( b& k9 i; Y/ } aic3106_init( );
5 \/ \7 g6 r+ ?: ?6 {) R while(1);2 r. |% [ C. W! L) L3 x5 B j f2 e: i
}
, X6 |# ?; v9 b$ ^( f5 f- m5 L; U1 `+ e+ G0 W" s, r, t
* \( }3 [. c3 A W3 ~$ c8 W
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
, a; X9 y2 _/ P$ h( Q; F* i/* Initialize MCASP1 */
0 l2 m5 _! y# v$ C1 t9 ] mcasp = &MCASP_MODULE_1;
. Z% K" B5 C/ }9 ?. I8 E9 e+ A mcasp->regs->GBLCTL = 0; // Reset
* R$ e" w8 ]* P. x mcasp->regs->RGBLCTL = 0; // Reset RX
/ o1 k9 p. ?# ~( x mcasp->regs->XGBLCTL = 0; // Reset TX( {% b4 O. Q$ B# `# u0 t
mcasp->regs->PWRDEMU = 1; // Free-running
1 [2 r& o2 T% w // configure McASP0 receive registers3 A7 f7 `! {& u# q8 l
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! `1 g/ h2 Y! l# ?+ V mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 o4 s" e7 {8 ?. F9 O
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 M8 }' ?( J' C. `4 q mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ K' c0 o# L; ?0 i0 `- o7 E* A) v* I mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
+ o+ \0 H- ^: G2 ?; Z2 T! ~; v mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, X- ~2 Z2 B$ K, Z3 u5 I mcasp->regs->RINTCTL = 0x00000000; // Not used4 ^, m+ B9 z) [! {
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 S/ v" b2 H& K, @
) V7 c- F! C" ?% H5 y' ? mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
: ?9 U4 b, w+ H5 u- g mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! Z" _! W4 X2 k J( J. a1 B: X
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word) u$ y$ |+ x$ s/ z" R: g$ R9 B0 i
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
1 w+ ?, {0 _' C2 \7 r mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK, f3 U8 n4 \# ~# a* {$ M, ]! X( C/ b
mcasp->regs->XTDM = 0x00000003; // Slots 0,19 ?7 P B, ^% ~. L$ |
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit: r" Z3 d1 a8 O' O; Z/ q W% z8 d4 ^, B
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# \: K) u2 p$ e, [- L
" u; p/ M5 A) P mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN2 O( t4 h: a9 ]9 ]: F* g5 L/ @
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
`+ _7 J3 A' X7 y- d& c mcasp->regs->PFUNC = 0; // All MCASPs- |* v7 u8 k4 h [
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% K0 s5 U0 [& Q ]# ~
. ]1 f( }$ U/ S: O4 t/ k
mcasp->regs->DITCTL = 0x00000000; // Not used% c: T! F0 p/ ^' b" `
mcasp->regs->DLBCTL = 0x00000000; // Not used, W+ v/ N9 c3 v; A
mcasp->regs->AMUTE = 0x00000000; // Not used
+ \% c3 T2 j3 `
6 _! ^9 Q3 f; [* `/* Starting sections of the McASP*/
) U; E& d' o7 }' _ X0 T mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 x$ B# S# ^8 L: {6 K8 `) ^ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
$ X$ B2 H. Y* M& k6 d mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
; Y7 L5 c' }. R* ^8 j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
+ y" P. k$ ?9 N" l' ]9 O
' l* [: V! y# \8 q mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& Q) Y+ n( h/ l5 E0 ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
# _0 l1 Q$ y! H, ~2 u% g mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
0 e3 a% [, M% n6 a, N1 k9 k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# c7 ?+ b) @% g
3 r9 s6 K+ c( B$ K0 |4 I9 N" \ mcasp->regs->XSTAT = 0x0000ffff;
" q$ @& o: y% y mcasp->regs->RSTAT = 0x0000ffff;
1 e* c9 H( Z4 j u5 y9 r" f
( w& ?8 p" B9 s0 k- q mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;) w3 t, g. G4 ]' b2 {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );. x/ w9 P8 t! b% p9 @. {- }7 \( g
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; l& b" ?3 {, H3 U6 F
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* I6 S7 s2 I" `4 f: P. I, m9 v7 l$ @& M' c
/* Write a 0, so that no underrun occurs after releasing the state machine */) r$ S$ n2 `) _2 E$ R$ y( m
mcasp->regs->XBUF5 = 0;
- R a4 V: }8 V. x: h7 d% N mcasp->regs->RBUF0 = 0;
( Q: `, c- S# K/ u1 [
$ W. u4 ~: u7 e mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
; U8 i# r' y# l4 @) o( K while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ |; K* G& b! H
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 k" H3 X* g8 w1 }, |5 T* A/ T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 l2 n; K0 _' F3 v4 y5 z
) o6 ~: F1 Q7 D' `' o9 y, @3 M
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # K1 v6 j" z; [7 w, w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- u i$ _! W3 V/ c1 o. E
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; S% K: t5 T v$ ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ Y# E4 q8 R+ k& a# I. e
1 @8 H7 u7 u( C7 @
CSR = 0x0000;( D& J9 U% T, _7 e& {; n
INTC_INTMUX1 = 0x3d;
5 B N2 K- I0 k! b! q ISTP = (unsigned int)vectors;
* T, ]+ I- p- J1 \- ~- L) H9 v ICR = 0xFFF0; . S3 z: H% e4 n9 j r$ x# _
IER |= 0x12; 5 h0 p& D4 c0 P& v+ X& H& Z& r
CSR |= 0x01;
9 R% x( i' p0 T/ {) |; x- e5 Y0 O0 O3 N" B& h
) X u- H- u Q: }0 k
/ r7 y6 u+ |* u8 P( ?还有就是两个输入输出函数:
N8 S/ w; y* c& E% G2 K, j3 A0 Cvoid output_sample(Int32 out_data)% M5 k0 _' E& o4 _9 T+ s0 B
{( U( V1 G( e D: @3 w
AIC31_data.uint = out_data; ) v- a2 @2 Y. j' y
MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 e. G, ?3 X. h4 A}6 r7 h+ J) c# j5 t( C8 K
4 S4 x% t2 Q* @0 A# R2 O
Int32 input_sample(void)! e/ L ^& B7 v7 \& W
{
3 x: p* f( w/ ~0 r AIC31_data.uint = MCASP1_RBUF0_32BIT;& S9 m$ u* g+ s& {' k; d8 v
return (AIC31_data.uint);! \' `- f4 v. m( Z( g+ z$ I9 o
}
6 A7 t: f$ Z! o
& M A$ O2 }$ U: S' [5 [5 q# a |
|