|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ j, o5 G! N1 _# t+ mmain文件:
% x& }* B9 s2 K* ainterrupt void interrupt4(void) 3 M) {# O* C5 J7 w1 g7 k) c/ y! C
{' K* X- H: e) Y" X
Uint32 sample;
: Q9 z+ u; o! d. \3 {/ }% P" h* l9 ~3 p% ]6 j, G4 l
sample = input_sample(); // read L + R samples from ADC
m* ^7 F+ [$ e0 w/ H4 z output_sample(sample); // write L + R samples to DAC
5 c" {$ G, E& c. O& e return;. C+ h5 d- C( i6 y
}* x7 }+ V) u' S _+ z
3 r; X8 A& p# f. J" W
int main( void )
# s* `5 g! c/ u{( G9 K/ K( G2 w: m8 R* g
6 r9 x7 Q+ [& A; L
/* Initialize BSL */
D( n2 W' c5 c8 z2 q* G7 | EVMC6747_init( );% B/ v4 W0 u6 @- C/ {
/* Call evmc6747_intr function */) I4 I% c$ p, [9 n
aic3106_init( );
( r! c7 G @: g' X while(1);0 ^- @4 _) D, ?4 \
}
# K+ u+ ]9 ]# g+ `! F @6 a. R0 S
2 v) V1 M7 r/ h" F
0 _2 ~4 c7 a2 t' g$ U/ @- caic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
U+ y9 n2 g* _+ t! x1 }$ a/* Initialize MCASP1 */
! ~# } X H: d) k mcasp = &MCASP_MODULE_1;
* ~1 s! L; |8 [6 E4 g$ P, W: J mcasp->regs->GBLCTL = 0; // Reset0 \3 t' F5 Q8 n1 J3 [
mcasp->regs->RGBLCTL = 0; // Reset RX& M. C( {$ d6 ]. E) K
mcasp->regs->XGBLCTL = 0; // Reset TX5 x; a' r: n1 u) ^, S
mcasp->regs->PWRDEMU = 1; // Free-running
2 w0 {4 d2 p! G% ^6 D, X) w# c" u' A // configure McASP0 receive registers7 v2 W- R' o2 p) T+ G5 @9 ]& |
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
. c& n \3 P6 H) m7 X3 S2 l- E3 E mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: H' B! A+ c `- c4 C8 \4 I mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" o# P$ n. q) g, b4 D% s# P8 E mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& @: K) V: \& M4 j z mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
% y' V+ p- F6 D' q mcasp->regs->RTDM = 0x00000003; // Slots 0,1
( B p1 @$ W# i& T- d! P mcasp->regs->RINTCTL = 0x00000000; // Not used
# b. Y2 k0 `# j2 | mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& X2 L7 Z y/ p5 ~
, o+ X w4 a- i ]/ ~: a mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
( {9 M% L' j( j7 r! S- T! x mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ z$ J' C6 [2 W) @+ ~$ t \
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word6 H% ^' q! F w
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; V6 }$ k% t$ Q% R" B! u0 o' I. [$ q mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) d% w+ A$ e* g; W mcasp->regs->XTDM = 0x00000003; // Slots 0,1. z/ D7 q0 Q3 L) @
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' a: M5 i4 Z& ?* `! K: m# q mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" U* S( ~8 y! N. s
* I* m$ J* C6 [. \: a* W0 o5 y7 o mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN& O) `, p+ M! l
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT( a' T2 j. U, B. [6 C
mcasp->regs->PFUNC = 0; // All MCASPs& ~- J' L; i/ o5 @9 h
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 h- [' l2 b) J* u: e* e! n$ Z* \, U" _ Q4 q4 R: m9 d
mcasp->regs->DITCTL = 0x00000000; // Not used7 |4 i5 s3 z( E+ q( Z5 H
mcasp->regs->DLBCTL = 0x00000000; // Not used' H! u8 i2 b4 e; Q
mcasp->regs->AMUTE = 0x00000000; // Not used
4 v+ z( g% p6 H: D
: e$ @; `. C" J' y& Q/* Starting sections of the McASP*/ U. V! z2 a+ B' \8 J
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; & t2 N: R+ C* P( L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
, J$ X" i3 `* [2 z mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 U) V; ?7 b/ x5 w0 b# U* r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );. p* G3 d) K5 o U/ l/ o5 ^0 I7 B3 O
" n2 ]! X+ g. k6 F3 W$ t: P! v+ ~! I8 y mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
" r' r9 r7 M# s- R0 _& v7 m, b* O while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
9 A% t# `3 Z! v1 W mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * e- b. h" _% m2 w; w! l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! k: W, m) [: w; i; I4 c$ ~* c7 }# n3 E1 e
mcasp->regs->XSTAT = 0x0000ffff; 2 z* ?/ v( Q( j3 N$ E' w
mcasp->regs->RSTAT = 0x0000ffff;
. M& u6 S( O) g6 v
" N& M( w. T5 M8 H9 w9 w# I mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 I+ N( ~3 d. i$ s while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& p* C3 _) q* I& |6 ^4 u% ]: j2 J mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; . S% _: z! l, N6 J' s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );* v7 a. c1 @- R( S
) E& i8 D) K' r! t /* Write a 0, so that no underrun occurs after releasing the state machine */9 ]5 B* V6 y/ H7 x
mcasp->regs->XBUF5 = 0;
; l, a! h: U0 G% i( W mcasp->regs->RBUF0 = 0;
5 I* T$ I$ O( j8 D, b$ \0 z4 p: w" d$ J" [+ l3 J! b5 W6 {
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - M9 Q& V$ k4 U& y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );7 h# ]: ^% e% l8 ?' M3 t
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
. }# Q* X" \& I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% a6 ^3 e. R$ z1 F/ ~4 U
8 N& P+ j1 O! V7 ]2 \ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; H1 Y: ^0 e. L g$ \. f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 Z# y' a9 s* H' a/ c# L8 i3 c
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 s# h) L l( u2 m) F* L+ F, b4 q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );8 L8 b+ j! ~3 w6 C
. E0 g' ?9 n. O9 W0 a( V; r) e
CSR = 0x0000;
' I8 K3 L: u0 S( N" ^/ A H INTC_INTMUX1 = 0x3d;
- L0 z Y9 I7 A ISTP = (unsigned int)vectors;
6 Z, Z$ ]7 L/ a% }% |6 F9 Q3 @ ICR = 0xFFF0; . P3 C: B: o0 s5 v* V) h' r/ P/ y
IER |= 0x12;
$ n( W S: e$ V CSR |= 0x01; U- @% a C! Y
7 I* m" }, L) t
. P3 t* t$ \* o9 L( U, }5 v) @0 U! E4 Q1 d% Z$ v( D+ \$ t
还有就是两个输入输出函数:: g$ L+ \9 S* L7 L9 m
void output_sample(Int32 out_data)$ |: f# L$ X# c/ A3 O
{ M0 F6 K8 z6 P' \# n, ^4 ^4 }
AIC31_data.uint = out_data; r0 t; z' q6 @
MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 \% I0 s- p& T$ I; f6 j) L+ t: n}/ s) q7 C+ }4 K& f/ C+ G
) P: o7 S3 H) R# pInt32 input_sample(void)+ @& f$ ]/ F- r
{
0 n `' U0 p( h AIC31_data.uint = MCASP1_RBUF0_32BIT;
! ?2 I( o3 v. r( P return (AIC31_data.uint);0 p; ^) m: r( H9 k
}
; f9 X! r- R+ Q5 d+ p6 ?# A! k
# J+ W" C/ Y# X# Q4 x |
|