|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* d, [1 r1 t4 y- c) X3 t o
main文件:+ I7 m7 C9 ?, V: U: `/ l
interrupt void interrupt4(void)
+ S% r: o8 q4 b6 }{3 g5 @! D/ ]0 g% e( _0 E4 e
Uint32 sample;# A$ {% ` A7 Y2 p/ Y! a% F
: k% `( c) R0 R9 J1 c sample = input_sample(); // read L + R samples from ADC( O: O1 S, x8 }& W8 Z
output_sample(sample); // write L + R samples to DAC 3 W6 n+ q& A* e! K
return;9 W2 T6 d3 k1 @3 w; P; r
}9 ^6 ]" A4 j# B+ w1 M4 n6 A2 Q" A
/ y6 C( W9 |# r; R
int main( void )) i. w( H* L- ^' _. p. R
{! }9 C2 R- Z! j4 Q! A$ A# s3 P, n& Y
0 y0 f9 ?6 z$ ?% \0 `1 n3 L+ t, p) o /* Initialize BSL */
# i; Y( B+ M$ W3 v0 Q! ]4 Q! P EVMC6747_init( );
/ M' `5 V) x* f# L2 i /* Call evmc6747_intr function */
( W: x8 x, w) _1 t' e2 I6 n5 T3 x0 c aic3106_init( );% p% j2 U. {7 R7 Y* M" z' g4 v1 P
while(1);% b& V& c# t0 _* p
}
% K6 l6 L1 r% l- i, a. x: i4 W4 a
! h5 c- V7 e2 ~7 J' F6 Q
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. F, m$ s% b9 |- r' n3 n( Q1 p/* Initialize MCASP1 */
4 g8 ?5 u- h6 G' a: E mcasp = &MCASP_MODULE_1;0 L+ y# ?- E, E" t3 Z2 @! h' w
mcasp->regs->GBLCTL = 0; // Reset
" }' j- P9 C2 H6 V- Z8 l5 S! H mcasp->regs->RGBLCTL = 0; // Reset RX. ^" ?8 _8 y4 K% z L* _+ \
mcasp->regs->XGBLCTL = 0; // Reset TX
: G9 Q% U/ y( {; b: E mcasp->regs->PWRDEMU = 1; // Free-running- u6 h2 D2 R1 s) B) Y2 G5 r, v, X
// configure McASP0 receive registers
# Y3 C8 c K" H mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
, h! k6 s' F' |7 `% { mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% @! P, k% k% r2 K mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, g' o% _- o2 F6 A mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, m' K: ^( a: h3 I& M mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! Z0 K8 @) R/ B. J4 z0 t mcasp->regs->RTDM = 0x00000003; // Slots 0,12 K3 |. W( K5 X: ?( u6 E+ h
mcasp->regs->RINTCTL = 0x00000000; // Not used
( E- V" P1 g9 m' F( H% E mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 {1 F: D0 I0 ]' g% h+ M
B3 E) O" o3 S mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
8 t$ ~3 }% \0 A8 b! W( B mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus r9 E% T- A. u
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
. P+ ^$ v- n' b: \ mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-162 k2 r5 d; u- H3 W% n d
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
' B9 k/ A$ b% c. X) y mcasp->regs->XTDM = 0x00000003; // Slots 0,1! V& _, I( o/ l" |: |4 y% U
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
. F' _( z' H( ? h mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) s! [4 e. Q. ~- v
! y% U' A4 Q5 x+ a+ S) g* x. e, ^ mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN3 F: D Q4 u9 N$ N3 G$ U/ h
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
! |( V1 }4 U0 }# {/ `, _( V7 b' M6 @ mcasp->regs->PFUNC = 0; // All MCASPs5 ^+ c$ n. c( V- e; Z- J+ {0 E. S. j
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 e: @$ ^1 }/ @5 c9 t: Q
3 @0 k& f0 q) n( D6 b mcasp->regs->DITCTL = 0x00000000; // Not used, O- ~8 G3 \/ t6 |
mcasp->regs->DLBCTL = 0x00000000; // Not used. {3 g4 c, ^* i' ?
mcasp->regs->AMUTE = 0x00000000; // Not used0 x7 \4 |0 D- `- e3 [4 ~
r0 S4 K5 j |; H5 l
/* Starting sections of the McASP*/" i- Z n$ R' a1 ^* n" H% O3 ?
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; }6 L% y! x5 q* w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
S% [8 M& b# F7 B mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ N2 p$ h, F' r* l8 R9 M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
: D# s# j n. _1 X7 J+ M, U, r& k5 a# w
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' y! g+ G# v: M+ J! T" e, n& i while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
' ?! I/ C" f! S* z' I mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
# C3 ^& E- r. Y" l5 F9 `) F4 ` while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
' ~9 w- c$ `+ w9 D" g+ N4 T' t4 u% I) f, z9 }( T
mcasp->regs->XSTAT = 0x0000ffff; ( ]8 D) i) C2 Q+ `6 r- j) ^. O
mcasp->regs->RSTAT = 0x0000ffff; + B6 _/ F, F* _3 j( h/ c; J6 i
6 }6 p( |% m0 b, ~2 G0 H
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
2 ~' Q4 _8 C+ _1 A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" R7 t$ H( V! [- K8 t# u! S2 z c mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; " |# d4 d Y& E4 S1 @5 L8 A8 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );8 i$ p0 M6 F2 [9 z
9 r" v! K2 N# K- J* l- [+ T% v /* Write a 0, so that no underrun occurs after releasing the state machine *// G" x% o2 F1 |
mcasp->regs->XBUF5 = 0;7 `( f( d$ r$ u. q3 r
mcasp->regs->RBUF0 = 0;4 |, `7 e# ]: D9 p
! u$ G/ b/ {/ W# r mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; : |0 F+ w* u. _ [4 b. X. @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- C3 c1 b, @4 S8 I$ p mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, g# S4 S8 Y6 R1 L; \8 \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );0 _% K( P! m& M* u {9 {
6 j) G, ~- [- K5 o% m mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# |5 K5 x0 c. |0 I! F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );! f8 z% u3 o; @# U( Y. \. g
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
0 N2 [5 o, C9 N S0 {' s2 W% r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
3 ]! t7 }1 x1 |/ G2 q; e% d# B: w, u- n {) Y* L: U" K$ N K
CSR = 0x0000;
: ?7 T$ F' P: A2 B INTC_INTMUX1 = 0x3d;
8 I4 D9 t" K7 x! j ISTP = (unsigned int)vectors;
4 s* ^# T$ A% k7 M ICR = 0xFFF0;
# o2 K1 L) x2 K7 Q( V% E+ } IER |= 0x12; . y: I6 S; l. q7 U
CSR |= 0x01; 1 v& H2 C8 u. q) h, p
8 Z( m1 s5 q6 U1 m6 d+ M
0 o, Y$ V2 R& R" U" Z) {5 ]
' ]# C8 w4 ^ Q$ k; D- Z8 g& }
还有就是两个输入输出函数:2 o+ j- k. H$ X) r1 U1 ^) F# ]- ^
void output_sample(Int32 out_data)
2 ^+ L% k& \9 t7 {{( P& O J+ t( w/ W
AIC31_data.uint = out_data;
$ W/ N- v8 S6 w MCASP1_XBUF5_32BIT = AIC31_data.uint;
$ k: |4 O, n% U9 c; J3 E- O}: g6 X, ^: R3 i- J/ Q% F5 m
* b6 u" F3 p# l+ M( l5 Z
Int32 input_sample(void)4 ]! t- r9 [) [1 W' A5 w
{ 2 [& M0 g; K) j4 @0 O V1 D Z; ?
AIC31_data.uint = MCASP1_RBUF0_32BIT;
& Q& F6 x) I* H" @2 j8 o5 C5 p5 z return (AIC31_data.uint); ?( J$ s5 f1 B% M0 @
}
4 |3 R; U, K( U, N
/ y: F; W5 U2 Q$ h9 q' B |
|