|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- ?; G6 H# Z* O4 H" j5 o a; E) f2 p: Emain文件:6 `* A# g9 Y, u0 p8 b: `! R% q
interrupt void interrupt4(void)
' P0 F- b3 u6 C' x{ p5 H$ c; s' V7 r- ^
Uint32 sample;
# C8 A6 k; ]! l6 R0 G9 f7 o% k- i' ~5 C2 u7 ]- @
sample = input_sample(); // read L + R samples from ADC* u2 e# W$ N$ e: ]! T1 E
output_sample(sample); // write L + R samples to DAC
0 Y& N3 r9 Z- Z, c" _ return;
7 b% r, J& t/ P6 b. o5 }}9 L ^' T" e. G2 G7 G, ~
5 s; {+ C5 H2 K4 l0 \! }int main( void ): i$ ]- E- W' J8 K; B7 a
{( q1 ~ L! s5 f& m: T
# H! p5 X6 B! A# E4 K1 V6 M) W
/* Initialize BSL */
) y& |( R' s' I- @ EVMC6747_init( );
/ }& e% m9 Z# z9 t4 a+ l /* Call evmc6747_intr function */
: L2 R; ^) z- J- L& ` aic3106_init( );
$ x, C: |9 W K' ?" O( X while(1);- G% X F! n0 Y4 Q+ @2 q
}! d2 o# J. Q' j) a, Q0 U8 K
3 x O9 q* `3 g; |+ _+ K F! r; m' @5 ?! L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 V" M& {" f- _6 J5 c( V/* Initialize MCASP1 */
' L* o3 ]& a2 D! l/ d: ?6 c( g, D mcasp = &MCASP_MODULE_1;
' B2 [6 J, d( l0 h mcasp->regs->GBLCTL = 0; // Reset3 S' i. P5 l* ~5 V! v% }
mcasp->regs->RGBLCTL = 0; // Reset RX2 ~3 E; j+ o8 T) b; Q' g
mcasp->regs->XGBLCTL = 0; // Reset TX; U; o/ Q. j v$ g _0 V- v
mcasp->regs->PWRDEMU = 1; // Free-running3 Q2 J. J* i! {+ L7 o0 q, k
// configure McASP0 receive registers
2 O8 ?. _- b, k7 E9 b; z. I- N mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
( p" l/ _" \( T# J, t mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 B k. t0 [& ~/ N2 K$ J
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' E3 L1 c/ H; n6 n mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
: [* R; ^0 x! R mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 y$ g! j$ A* `4 ^1 H2 c: S/ T mcasp->regs->RTDM = 0x00000003; // Slots 0,1. M: V% G; [. n; n- n% k
mcasp->regs->RINTCTL = 0x00000000; // Not used3 u0 v! o6 o% y& F1 o) _# {: _: ~
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! T! `$ |7 V. u3 f1 y4 u: n$ h) l
# D) \. s6 X1 E" R! q! t
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 z+ \4 x2 O& x3 _- Y mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- C$ Z/ C3 n2 [+ `& D7 k; v* I* |
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word: L( Z- R; m4 a% s/ V2 t: R
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16. I" D# Z# n' E
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK* l/ Z, u6 q# P0 N* L2 \1 s' z
mcasp->regs->XTDM = 0x00000003; // Slots 0,12 G+ V4 T7 r! @% P( {1 v
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
L; U6 y* o x/ m mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ s, ~. @2 y, O; X: W7 J5 d, G# P' W1 `: U: |$ b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
; W/ R- c e# { mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT2 l2 M7 M. d% r( w9 e, `. t+ H! ?
mcasp->regs->PFUNC = 0; // All MCASPs2 G( {0 u2 d8 b, H* W8 [5 L' M h- V
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" t6 y( {5 Q, e
4 e) e5 K3 [, v( D mcasp->regs->DITCTL = 0x00000000; // Not used
* p8 U+ @& F* O% ^1 ^: f% E% Q0 c6 H mcasp->regs->DLBCTL = 0x00000000; // Not used
. S4 f" [$ b! J mcasp->regs->AMUTE = 0x00000000; // Not used- {3 w! w2 {+ F0 v ?( ~0 K
8 P5 F4 r& g2 A h9 c
/* Starting sections of the McASP*/
+ I( k" c, m7 { mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 5 a, Y# S3 S8 l5 T( }: `6 Q$ P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 z0 J+ F7 O7 D! {( {7 s4 Q mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 R* ~8 c! e; H. n- Z+ z. H4 P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
; o7 C+ F0 M' @: N y- V' l2 I! ?, U
$ X/ \- e3 ?. Y! N: P$ j mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 s; |) m% K/ u6 R/ T$ E( } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 D3 |- B' \5 e' N3 |
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( a! E% _8 ]+ h& N, c! n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ y: S7 f! }. p* E X4 s" |0 J% U. c% F$ [; i
mcasp->regs->XSTAT = 0x0000ffff; + W; h- m; `8 Z7 |" I4 j4 s
mcasp->regs->RSTAT = 0x0000ffff; : |+ j- |% e. V$ Z
, }. D* R/ G9 G/ _/ U0 V1 [* E
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;' T% I! K0 C5 f. {" I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
% H4 D# i' q) V2 V ^ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ' J" n- e( u3 \ {2 I* M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* z6 }: F) h4 }& S* a; i. z3 w4 w- C8 u3 S' s7 i0 d! }, B
/* Write a 0, so that no underrun occurs after releasing the state machine */
! y# l9 x( w6 F. Q. i- D mcasp->regs->XBUF5 = 0;
( r0 v3 V; L- H% X4 S9 F mcasp->regs->RBUF0 = 0;3 p7 D& F: d/ H1 u2 K' E( X; E
! V$ ~& C& |2 \& b Q$ l
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
+ G8 _7 b" T/ F( y8 m3 P while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );+ i2 O/ j( E/ Z% o9 `, |
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ t* e; N- z, c; x H while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( [3 E a \5 f+ E2 T& d+ }% s# Z% g6 u/ G' [
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; % {9 E# T' [, e# w L) F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, k% _9 T- ?5 M! t3 u" B
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 3 ^- U* A) Y/ k' U5 h8 P6 U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# N t8 U7 {8 s3 l5 U% R4 U
1 |, t/ r' w9 i# y+ e, _9 J CSR = 0x0000;3 X( D- O' n9 Z8 }2 d5 j9 ~1 T# h
INTC_INTMUX1 = 0x3d;
$ b" X0 r8 X; L8 D( } ISTP = (unsigned int)vectors;5 N% d4 @% E! f% g* \
ICR = 0xFFF0; 0 h: w( [7 j: U0 O- E2 g5 c: ~
IER |= 0x12;
( i( f) J$ O) I. @$ v" d: s CSR |= 0x01; - s# `1 N" V+ I9 Y8 o) e
) ?# ~( s6 b8 w6 ^; w& O, q! i
# N5 x3 ^5 d5 H# R, R2 r8 w
* B7 S2 W8 l/ ?; P; C [还有就是两个输入输出函数:- B2 U0 |' d" r6 P2 i" a: K" X
void output_sample(Int32 out_data)6 U% B9 ^6 [/ Z, |& D
{
9 {& Y9 l! L a& q" C4 W9 q( C AIC31_data.uint = out_data;
9 a7 c- H0 d# J: | I. X MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 U ?; e) F. l}: L$ e! a* i3 r/ S3 f8 e
( B6 H r0 @8 ^3 rInt32 input_sample(void)) A" U# e+ n* B ]# e; K
{ 8 \/ A( [+ B; Z+ A5 Z
AIC31_data.uint = MCASP1_RBUF0_32BIT;; U" j1 m, S% i* T, m# C6 k
return (AIC31_data.uint);) o# t! ?- l9 h/ [
}
" b4 M) s% d) y _2 v2 U2 y
0 S/ h; M4 N- m# w' x+ r |
|