|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
* `5 }/ ?1 x# Mmain文件:
& ]1 n3 i9 t8 U% @& v0 O1 |interrupt void interrupt4(void) 6 A" y9 G) {( _$ X
{
% E. ^' U( o, c Uint32 sample;
- E+ D, m& u F2 b' G. Q8 \2 O3 h0 f* G/ J# d5 |; x( r& @2 |* u, v
sample = input_sample(); // read L + R samples from ADC2 g" F! _1 k. E7 q& i# U3 u
output_sample(sample); // write L + R samples to DAC
$ [' ^4 Y/ P. v& V: ]4 U( Z return;; p7 }0 q' s# L( a: U" d& G8 v
}$ j/ x: m5 l2 K7 d* k
0 S4 o4 A) L4 w: t6 ^int main( void )& w3 R5 r5 A: B9 a8 ^' B( K$ i6 v W! s; I
{' ~8 I4 Y$ g* W
6 \" p5 o2 y6 ?8 [( ~ /* Initialize BSL */: a; @ |0 ^9 P+ C/ U
EVMC6747_init( );3 P2 _, r- N/ Z3 E1 M
/* Call evmc6747_intr function */
/ O5 F0 U. M1 @ aic3106_init( );- R2 \# C5 y' p; |' Y( \$ T
while(1);& m4 C6 u# V) K. m u" f
}; P; `6 v/ t5 A; p; U2 X& m/ m1 z0 t
0 M. [3 i- ]) M3 i
: n3 t$ w/ h) K J2 h" H( G- ?* `aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
! @" m* g( h8 N" m9 ~/* Initialize MCASP1 */
# w9 A2 Y" ?7 J5 ~, z3 t$ J9 p mcasp = &MCASP_MODULE_1;
! Z5 d/ `/ r2 ]1 A1 `, h mcasp->regs->GBLCTL = 0; // Reset5 U# u v3 E" f4 y0 V5 P! p
mcasp->regs->RGBLCTL = 0; // Reset RX8 G* L1 K4 `& x0 d. x2 i
mcasp->regs->XGBLCTL = 0; // Reset TX& p6 T" y, ]6 x3 u
mcasp->regs->PWRDEMU = 1; // Free-running, V5 X: h" N- ^2 T* m/ Y; u
// configure McASP0 receive registers
; p6 i* {' p2 s: R, ? mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! i7 x0 V$ @' O# b1 o, o mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 L+ O* d, A. i$ D4 V/ x n mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word4 `0 @1 @4 t0 M& W; ~
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, J( \, _! Z0 A mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) `; t* m2 [. f7 {' q) U4 m, ]
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
W/ O2 d/ j1 o mcasp->regs->RINTCTL = 0x00000000; // Not used
3 w4 C. H' w J# Z5 `9 v mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* L8 ]3 I% q" s% c) [2 b
2 _' H$ H+ [9 f% x! e6 q mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
3 R: m0 s* A* h+ i) e5 T mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 I7 |; j9 T4 J* V3 B+ e1 F mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 E9 t! p5 T7 d3 N' K0 ?0 b, L! n$ } mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: q, u1 s# R0 L
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
. t/ M& A& K% { mcasp->regs->XTDM = 0x00000003; // Slots 0,1, b. D) k7 f5 }
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
+ q, ` \. z9 n+ q2 Y7 R mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256" s; ]7 f/ t6 Z7 `& s, |* i
5 h, z& I7 D' M9 R# T3 j
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN- `- z, l I; a% N* E
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT( x* ^0 f3 c4 |! Y: B- ~8 @. ]0 E
mcasp->regs->PFUNC = 0; // All MCASPs+ [5 t/ T+ ?, y) L2 l- P
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1, F& C+ a- ~1 G( ~8 g8 G9 q3 G
# `! Z, p0 M# `4 k mcasp->regs->DITCTL = 0x00000000; // Not used
6 t/ P) L) F# `& D mcasp->regs->DLBCTL = 0x00000000; // Not used# i! A1 o3 ^# t, q
mcasp->regs->AMUTE = 0x00000000; // Not used
& @4 A2 y1 K9 Q; d& l% w8 K
l$ H0 h9 ]* L/* Starting sections of the McASP*/8 Y% q9 p- {9 t) z9 X
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
% ]7 S3 L9 S$ ^; f2 N while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
# m9 b" B* F3 {3 U+ v mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # \; J: v& P0 @9 Y" w# o. b5 z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# ~' U8 u0 f* ~0 F& M, G$ k- }0 a0 O) N# I# S4 B, e
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ! V! K( r1 y- g* s) e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ T- p) e5 ]8 _# U% m( Y0 F
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ M$ s1 y* L' G3 v) e" V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 Y" e- X& P$ _$ v4 U) W- G( c* ~7 e1 v) \% X; t6 y; y
mcasp->regs->XSTAT = 0x0000ffff; & H" {' D: t5 a j0 }
mcasp->regs->RSTAT = 0x0000ffff; 2 \" t5 `) |+ t
% |( `: t# ]( j
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* S$ K; i6 C g- l2 e while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 L5 R$ o+ ?) V4 P" m) G6 n) M6 Q mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) r5 V! a$ w( W3 {' D# g# y8 y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ Q! Y) W* c1 O7 I9 {7 x& [% ?
3 w! y2 P5 r4 j# w, y2 I; a /* Write a 0, so that no underrun occurs after releasing the state machine */+ [; u0 _3 E& \* J
mcasp->regs->XBUF5 = 0;
T" [* X3 X' ?& [* I mcasp->regs->RBUF0 = 0;
% I& @( Y6 l: A6 j. W. y
. ^ _6 M8 s4 d0 {8 D* @+ f- O mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ( I$ N6 M& k) ~$ q/ M3 a2 U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 c0 M3 n/ R( Z7 T7 J0 c) X mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 V# O$ v# l- h4 H) J6 g while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );6 Y4 f* s1 N; W- d- c' |
' `, T- B) V5 z3 r8 \1 p, \ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; T8 N' M; g' Y9 b( j& A4 I" H
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- n! Z' Y- d# J. y3 k B& C
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 d/ L- _# |% N# @( f+ I+ y/ { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );6 E0 b& q6 V7 |3 l7 D& B
3 i; X' ^; N- A CSR = 0x0000;7 n) M7 N: Z+ ~, }4 ?% Q
INTC_INTMUX1 = 0x3d;/ ]6 k, ]0 F: W1 @2 q' U. ?
ISTP = (unsigned int)vectors;6 j, f8 N6 [, y0 k$ x$ x8 R
ICR = 0xFFF0;
1 C3 R! L. @$ b* H IER |= 0x12; : `1 D- ^* I% f/ ~
CSR |= 0x01; 7 d7 R; o9 j, a7 C' h- d) n
2 I- v* Y8 B$ Q6 a2 f
8 ]# T3 d: x4 l& Q1 u$ o
8 U- c& ^# C( S+ \% ?" p+ S8 Y
还有就是两个输入输出函数:
9 \2 ^5 |/ U: W0 X/ w) dvoid output_sample(Int32 out_data)
! A$ [* Q+ W" @( A{. g Q( ~8 S5 `: ] n+ l- b
AIC31_data.uint = out_data;
1 k6 ~( P* f+ H0 r* f- }+ { MCASP1_XBUF5_32BIT = AIC31_data.uint;/ k1 y0 V) m! B
}9 b: R5 `+ F, a
9 ]3 g: j6 v% z0 L4 r3 i
Int32 input_sample(void)
9 a; @$ z8 W- F+ u; i{ 9 A: N2 \7 }, M# A: d5 w
AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 _; B8 ?) k& {- v6 @ return (AIC31_data.uint);3 [* u, k# G* x+ ?
}, E0 B ^) v- Y% K. h* T
' A6 _0 ~' p8 @5 K& v" D& r2 S |
|