|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
m, b5 ~; ?( Y1 {) Fmain文件:
5 J3 q, F, ]+ C+ ointerrupt void interrupt4(void) - _7 e, f, q% C, ~
{
2 e3 X% u! [ W* f* M0 y8 ` Uint32 sample;
5 d# Z- a# r1 r5 s3 |; }1 Z$ ?/ g8 |
1 t- [7 `& g) h5 X/ B K. x% V& n/ S sample = input_sample(); // read L + R samples from ADC
# x, K* q, [; L, r- @; Z, s1 s; I' n output_sample(sample); // write L + R samples to DAC # n `. l" ~1 q3 ` M
return;
. v' N8 |' Z3 @$ n0 {8 {}
4 |, z7 q; `" N5 b4 V4 {6 X! r. d6 m2 y9 }
int main( void )1 S* r J A$ I5 J3 ]. O; X0 k6 N
{4 f8 A, E$ M& \0 p* {
9 U9 \; p+ w# | /* Initialize BSL */
7 G' J8 x! ~* h' L EVMC6747_init( );
8 e6 a* H L0 F8 ~4 O6 | /* Call evmc6747_intr function */" e# J v! g6 {3 p5 {, j1 |
aic3106_init( );
1 T2 W5 V2 E. c- k7 t while(1);+ z' i4 e# ^* N2 V/ P
}
2 `& r( u2 S: D. q( q1 Z- S2 l; }' F/ _4 K& t( `
1 e# Q9 r1 ~, d0 C- m3 {aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. ^9 _9 s6 a3 z7 b! X/* Initialize MCASP1 */
; n) h: i2 K5 v! w0 A; a mcasp = &MCASP_MODULE_1;
! Y) u- W9 D& e$ Y# [9 P mcasp->regs->GBLCTL = 0; // Reset
# }4 [4 @. x- ]/ W' b6 F; ~0 j- t mcasp->regs->RGBLCTL = 0; // Reset RX
* ]( Q# N' Q9 c: I+ p6 q; n mcasp->regs->XGBLCTL = 0; // Reset TX4 t( j/ V0 E1 }7 [$ W& h
mcasp->regs->PWRDEMU = 1; // Free-running. J- @9 X# k( s6 c8 w
// configure McASP0 receive registers# A% h2 `! c7 h5 \6 @% s2 p
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
) l8 N4 z3 S* N) s. e! C mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! `, h9 c, n) P4 m
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
4 ]- q7 B7 h& n0 t/ I+ ^# ] mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)+ M) f6 f' u6 ]" R! O& D' m4 L
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
0 N' T& Q. z5 { x0 z0 E9 B7 J/ I* X k mcasp->regs->RTDM = 0x00000003; // Slots 0,1
9 {* }! }* J* L7 C* [# O1 t, v( i& F mcasp->regs->RINTCTL = 0x00000000; // Not used& o. V, Z3 _ z+ p* c$ [6 {1 w
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 K$ v+ T4 `) l& j6 \ `( M
% ~$ K% T0 Z' D( q0 T* \4 Q4 O mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used& W* H$ h+ r8 w8 X, m' ^- Z
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ F; W; e% {3 m- ` L% q6 v( h
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 t" g# K9 o% Z; O5 P mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
! b3 m) S7 C* U8 i1 e mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK. M% s4 T& c. c( B& H
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
- _4 {- w9 w7 w. B% E mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit, l o' E0 J' ?1 u/ H: U9 b/ P1 S
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 n! {9 a! Q; L \" H- ]
) V! E- H( Z, D- _5 `2 P8 x
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
% q7 E- s% ?* h* Q; o% z+ P* r" y mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' ?/ L# B. _5 s2 N% m8 a6 m6 f mcasp->regs->PFUNC = 0; // All MCASPs3 `: ]/ l" O$ v. g* F2 b+ Z& k
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
, q7 E3 R! l9 ^
/ D0 H' I. ~. k/ X2 f mcasp->regs->DITCTL = 0x00000000; // Not used0 b& w- x& o7 J: e5 u. W: w2 @% _' h, ?
mcasp->regs->DLBCTL = 0x00000000; // Not used
0 Q, L0 O; _ ?* A; _ mcasp->regs->AMUTE = 0x00000000; // Not used9 N' ~6 {# K$ B. \" u4 p
' K5 V1 w8 a4 w* _3 k; V8 m8 |' ~
/* Starting sections of the McASP*/
, w. {/ a }+ M% t7 u mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
# t' [7 I3 T1 B, `6 j while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
( i1 u! I/ |0 |0 d* o( M mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & `5 }' e) D: m5 Z5 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
5 R% g2 z' i' X1 F4 p& ~9 P( F0 H: P
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. S. I* P. I' V$ Y while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 w( l' _1 `1 E% D0 D- w
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 N, F/ H, E. |9 U# }5 V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );; C) h( Z* l$ _7 _% i3 o2 W
0 ^/ }4 t. m4 U1 H mcasp->regs->XSTAT = 0x0000ffff;
# D8 X$ P) M8 b: N. Z% ~0 |+ x mcasp->regs->RSTAT = 0x0000ffff; . g4 D8 D3 _9 L+ G7 @5 {( _
- |' J& I& |0 P% h; C: F( ^, N mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;) {, p- g, ^2 [9 }' x5 s& m
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; y3 D! `/ }% w0 L" ]/ ?# |3 \( O mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( C! r9 l; J0 {' n' U' \& d while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );2 m, B# `. E+ \' K9 G
/ s( I. ?+ ^- n /* Write a 0, so that no underrun occurs after releasing the state machine */! R4 e9 O3 V2 j1 Q! D4 Q
mcasp->regs->XBUF5 = 0;
- @ K4 \6 W7 _0 I# \ mcasp->regs->RBUF0 = 0;3 y, }9 _# `+ O. J& U
" Z: D5 n5 F0 v3 V' \9 M
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! g4 y# s) t3 f% t+ J( A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, Q$ L I, e3 c, D; {4 S mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
" O3 x. Z; R2 Q+ n" h/ e1 E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
C/ u: t* h$ A' [& N! ?; `2 N; F9 d/ m
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# v" h" S9 Q- I6 b2 ^ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );* Q' e5 N7 T1 I( X
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 n0 o! f: s- b) c2 k% B& Z6 e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
2 M% r }" Z3 {2 Y5 W. P1 }6 |6 F" y; q% x: f ?3 R% O
CSR = 0x0000;% \ X$ T8 H8 H" P, ~1 b
INTC_INTMUX1 = 0x3d;% w, X- l9 F+ a1 e# o
ISTP = (unsigned int)vectors;
1 l! {$ m- ~( \3 x' m ICR = 0xFFF0; 6 y0 x7 Y/ W @0 E' H6 j$ g
IER |= 0x12;
- u2 ^ `( d! b n% r, I CSR |= 0x01;
8 C9 N2 U7 r9 d. a* K, n/ R2 a \3 n% w5 c1 Y
4 H% `) Y3 L4 T. U# W6 P ~( R/ U- ]: X" O
还有就是两个输入输出函数:' l% X S/ ^% f/ v- @- Y7 g) ?
void output_sample(Int32 out_data) K& w8 ~0 a, l/ I
{
, i* t! o. N3 ]; Q$ A6 X; B* t AIC31_data.uint = out_data; . K3 _* r0 u4 R) z# c1 Z
MCASP1_XBUF5_32BIT = AIC31_data.uint;1 S% w% v1 Y3 r6 Y
}
5 g+ [4 ?! M( Q) f7 d
" f. \3 {6 A% V& A) \! n% O& K8 HInt32 input_sample(void)! j- m O+ ^, a8 Q$ Y
{
3 N( M* i; F! B9 g! r/ E6 ~ AIC31_data.uint = MCASP1_RBUF0_32BIT;
5 z( \7 J/ i6 Z0 Y. W- e3 `! g return (AIC31_data.uint);
' [0 h( ^7 K, v& j- W; }/ B8 u}
: q- W: M W$ X4 @9 U; `) L- j* X/ |5 ^" q
|
|