|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:' U' b4 N3 k5 g
main文件:
5 ~! y8 B; Y) D8 Cinterrupt void interrupt4(void)
% l+ Y: P% Y, @3 ^( r9 j2 ]4 f{
' _ a6 ~6 T4 Z; O4 @! X% T. x Uint32 sample;
2 G% c! B' X' W8 U; p. ~7 T
9 Q) {( y) j/ b0 Q% ] sample = input_sample(); // read L + R samples from ADC
3 _4 y2 c$ u% I' \/ b output_sample(sample); // write L + R samples to DAC
2 ~9 |0 z+ _2 o2 [$ O t+ w) l return;
& X t+ C w: G7 ?& w; g}
8 w% j5 ~+ s/ k3 _
/ h4 J J' G; n) yint main( void ). q! r$ Q# j2 Q) z0 r. X. ]# _: J* f
{5 I6 E m' N% A" h% D& [
5 I6 L0 T% V# Z0 i- \ /* Initialize BSL */: a6 h1 _" `% h4 E% [: R% O
EVMC6747_init( );
1 D" Z8 c* ^: {. i /* Call evmc6747_intr function */
- a- p$ ]3 M) q2 v3 n1 P aic3106_init( );
7 M9 M9 t2 f- v/ N: W while(1);
[- J# g, _# J% @) K9 c: ^}
! t u2 ^0 ~; K, h
8 G* k, e$ Y6 |' D1 b* v% s
) B9 H( g/ e& v# _aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题7 U) E! y6 }/ Q/ `+ p
/* Initialize MCASP1 */: p p1 }$ x4 X9 X+ U
mcasp = &MCASP_MODULE_1;7 r6 X! k- p, J5 V( ?' n3 A! ]
mcasp->regs->GBLCTL = 0; // Reset4 ?) I# R4 r$ J/ P5 \6 x
mcasp->regs->RGBLCTL = 0; // Reset RX9 U1 q4 p7 q# ]: ?
mcasp->regs->XGBLCTL = 0; // Reset TX1 Q3 C) G& c% b) }
mcasp->regs->PWRDEMU = 1; // Free-running' g3 S4 e4 u$ d( G% {" I" \4 M
// configure McASP0 receive registers }$ I* O/ l4 ~4 P# S
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used' N6 P! }' h# F( E- n
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. v( f8 t0 V" Y1 y/ c mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word. }. d- b! v7 K1 G U. T
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 l7 T- M6 _* ^
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
* A; D' A) e* c9 n8 U$ o mcasp->regs->RTDM = 0x00000003; // Slots 0,1
; y# U) x6 ^: T; c- N% h6 r9 m, P mcasp->regs->RINTCTL = 0x00000000; // Not used: y: M+ H' L2 e9 e1 Q: Z* N+ K
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( N: `" E$ J1 B7 {* E* s+ h
' G$ P% Z, V1 K% r5 ~ mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used8 j/ Q# z9 f) W, N
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 W" [* F0 R/ L$ R" E7 I
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
: A7 M+ \3 i7 F# q6 T1 t mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16. {! J( ~3 |" A( u9 x3 X
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
% ?" g$ @0 I: M( `: } mcasp->regs->XTDM = 0x00000003; // Slots 0,1% i& R3 v+ C5 ~2 I- x( Y
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit6 W2 F2 x( @6 X9 o) ?8 G
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 H- b7 f8 m$ c* C& _1 K4 n b [; G& T
9 a |9 N0 H/ w' ?! V1 f% H0 _ t mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN4 k& U# z% q9 [
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
( b9 L* \4 ?! V. Q7 L# i; s! D mcasp->regs->PFUNC = 0; // All MCASPs; _3 M# Q. q. c: n- t3 m
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* s9 m/ N" s8 D) S) B# r9 k
" |5 j# [5 O) ~% o3 D5 E" K mcasp->regs->DITCTL = 0x00000000; // Not used
/ B6 k3 n7 y) i mcasp->regs->DLBCTL = 0x00000000; // Not used" }) b( j/ G* |
mcasp->regs->AMUTE = 0x00000000; // Not used0 A" O! R( ~; P: D/ S
" c T3 ?- S3 _/ D3 H* Q
/* Starting sections of the McASP*/
5 O" O- d# h! g mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. j* Z9 o/ K1 t a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); , Y6 L% a. v: R1 k
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ n' `) z5 T7 M3 ]1 [$ e while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
! M, T+ G; _2 w9 e
2 k. N; t$ l4 a# \$ j1 i- u8 D3 U mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
" i0 \7 {# e$ E, L2 f# K while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- [3 U. n; r+ x$ F mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 W2 V% l9 [4 O- C2 P0 f) W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
8 |+ e i/ }& ^3 H, |4 ~* n7 P
+ r2 D4 V* O. X3 E; b9 H! Y mcasp->regs->XSTAT = 0x0000ffff;
: b% K4 @9 n: x. e, E, o mcasp->regs->RSTAT = 0x0000ffff; 7 l- C+ j3 P% G2 ~4 ^. i
" K! M2 X8 x6 j" u2 {+ ?/ ]
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;3 n" C7 [- G( f) y6 P( s: k
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; B, E/ G. r( M mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 5 r1 h5 h1 i9 @: I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
, H; Q' o* j9 k! }$ B7 F+ n0 x
6 M. ? M! u n+ b /* Write a 0, so that no underrun occurs after releasing the state machine */
; v, `; c8 `! ^& p7 `+ h mcasp->regs->XBUF5 = 0;4 C' E6 U. d; ^7 ~4 O2 }' T
mcasp->regs->RBUF0 = 0;: |" [7 E) s0 G6 X; v) I
0 C8 y* I' c! G# v! n mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" b6 T* F7 l' `# z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- X: T; l) q( b8 T+ d R5 [9 y. |) k mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
& H( {3 |6 z) X( a' _& Q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' d2 c2 e9 D2 I: T
- `. o. g' x: r) R3 h& k mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' F% h3 r/ l0 ]; z+ Z, Z, T$ { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 X) y9 ^3 w, D' k- z. b mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 2 c7 S+ p/ g3 N$ k2 ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 R& \2 F# a# t4 c; O) @6 U/ j/ m5 U; n$ z& i' c
CSR = 0x0000;
0 C* ~8 ^7 a+ w0 h6 C! s INTC_INTMUX1 = 0x3d;
/ _' x% {" _3 r ISTP = (unsigned int)vectors;
f" S% o' g1 f8 I, G, j ICR = 0xFFF0; 2 B7 r, q5 P/ e f* O
IER |= 0x12;
% @7 k1 G o1 n& J$ e9 x- Q6 v CSR |= 0x01; 9 e9 c' I; a% l* e, z/ c" C+ N+ v0 r
8 c7 k: g6 L, P' D: M+ g
- y# T, o: z/ |; V
, @, s# R& `; ^5 i4 o) o" I$ ?
还有就是两个输入输出函数:( I0 k* e! a* h
void output_sample(Int32 out_data)3 y2 `1 A' E A! ~+ ?9 { }! q
{
3 ~! Z7 o$ `& X AIC31_data.uint = out_data;
+ W: b2 D- u1 \$ w" {. a. N# _ MCASP1_XBUF5_32BIT = AIC31_data.uint;0 M7 D* s& U# A' T5 h" z
}
5 } k5 t! ` e7 [6 t5 Q; f% x @& ^
Int32 input_sample(void)
4 S F/ S* v0 d2 q( F* i) ?{ + s" o, b/ V( I
AIC31_data.uint = MCASP1_RBUF0_32BIT;' A1 e3 m7 x' G' b- L1 a
return (AIC31_data.uint);
& v, @ o8 G# s2 P6 V$ f}
' r! S0 I# G8 L8 E
. k3 D, _+ a) F" V8 g( [ |
|