|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( a5 ?5 R; u6 l9 z1 m0 {/ ~main文件:2 J7 _, u0 {" R2 A6 L. \
interrupt void interrupt4(void) 4 G9 k1 l. } C B" q8 l ]
{
1 p# ~4 I1 p. V; d" T, y Uint32 sample;
( m+ }( W/ C" H# [. K" A% V& I$ t6 |$ K% P. D
sample = input_sample(); // read L + R samples from ADC6 L1 H1 C2 v1 Z" G: }
output_sample(sample); // write L + R samples to DAC
) Y9 g: I; H: d/ |8 P. C return;
1 `$ Q3 K5 c7 U' I: \# |}
$ w+ C |" n- L3 V0 Y/ j/ M6 g9 P" V" T4 V' B
int main( void )
|0 m6 |& {! V/ J4 [: H' _{
6 Z% \# u z8 E6 |- A4 x9 r6 m, P6 V, n
/* Initialize BSL *// A% D4 _2 D3 Z* n8 ]
EVMC6747_init( );- S8 |; R# t- m4 y+ X
/* Call evmc6747_intr function */8 v" X" b" p! J8 a. F- Q
aic3106_init( );
0 n' f3 f8 B8 r) v) E* O: w while(1);/ T% M& l* ?4 W9 k8 W
}
/ g. A3 Z. t4 v) `% {' x2 B+ ]7 K& H3 { K4 h- Q! L0 B; {/ }
8 B- O6 @( W7 x6 M
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题. K5 S. H6 Q6 ~ R, L% c& X3 t
/* Initialize MCASP1 */
1 I: n* e7 {4 H% [5 y- X! e mcasp = &MCASP_MODULE_1;! ]( P7 p! L8 m" f: w4 c0 r0 Y$ E
mcasp->regs->GBLCTL = 0; // Reset
. y' d# N& p& r+ D: y mcasp->regs->RGBLCTL = 0; // Reset RX
) l) u+ {" r o) w' `: b1 C8 c& M mcasp->regs->XGBLCTL = 0; // Reset TX
" x! c& } b$ g mcasp->regs->PWRDEMU = 1; // Free-running
( l2 t+ h2 R, }* Z. m7 } // configure McASP0 receive registers
4 U2 S$ L8 H7 R# A9 ]9 d* t9 a6 q mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* {3 ^. _7 P% R' B
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus! A9 Z$ Y3 w+ }$ k0 e3 ~
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 G* P. _# Q9 W- y. [ t6 D& y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) J. j# @9 s2 @9 m: ?% D! z
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
+ R; |1 a2 J( g% ] mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, n2 ]/ S/ ^- C" Z; R% ] mcasp->regs->RINTCTL = 0x00000000; // Not used
2 [+ d2 ]! p' D5 R7 `! R0 s mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 s2 b& P" `! N& K7 s
9 H( s A. n# i2 c" S2 q8 Y" k+ ? mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
# b/ T+ w) k! [1 R mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" ^- V$ x6 d I mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 O4 _. J6 c0 S7 c mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16" z1 F9 |* ^- o/ [- ~
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
% V3 H: t$ T/ T, f" h% R; z mcasp->regs->XTDM = 0x00000003; // Slots 0,19 l! n# h- E0 Q. M$ u9 K5 n
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
$ c+ R1 M: N8 B) N) X mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# m! K, P9 Q4 H, k, `3 ]+ i
, i1 J' |' T" ?& k8 o mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
1 X& f: X0 W) N# y mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT( ?, @3 n. J5 M! A; l
mcasp->regs->PFUNC = 0; // All MCASPs J& o% O/ z& v3 ]6 D) [- w3 Y
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX12 f7 J' p$ B9 x9 i0 M
& z" j" O' p/ J, A6 k, L mcasp->regs->DITCTL = 0x00000000; // Not used; z$ |2 ]: N7 X; B) c* R _% ]9 ^
mcasp->regs->DLBCTL = 0x00000000; // Not used
/ l& H: n& L0 J3 X* k# N mcasp->regs->AMUTE = 0x00000000; // Not used2 b& r5 v* g+ C! M, J5 j
a" `. o E4 R2 o u0 B) O. ]
/* Starting sections of the McASP*/. `" N/ ~, ?3 b1 b6 Q, o
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ! S' x' x' { r# w& j) _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); + `/ T' ?5 b6 |) q' F; |3 V) G+ @7 P
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; $ B3 i) T0 b; Z& [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );3 N& T# y- ^$ K; G
3 T$ H2 `9 e7 n/ m4 t- t
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 7 y- R& f4 T! y5 c0 C- I- P* Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
; T5 a% W8 Y& \+ U: p" p2 a mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 n& @+ _/ O b& |: }- [ f5 b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 ~9 e* W% I, Q
; |4 G( h$ P! r& J* u
mcasp->regs->XSTAT = 0x0000ffff;
+ f- x- z% s3 J mcasp->regs->RSTAT = 0x0000ffff; 4 j$ H& y; y% a V' Y
2 G0 s0 n" n3 ]7 r/ ] mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 L) u6 a. u+ a9 S, |7 e/ X* M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );! }5 b# e/ z5 V* z
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 0 O$ w" A/ s) e4 t
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
0 s5 l2 @6 {$ R1 _. C+ e& y( K0 v# R5 x8 z: e, m* Y: k) J. O) Y r
/* Write a 0, so that no underrun occurs after releasing the state machine */
. I( o2 F+ R' _2 n0 B- @ mcasp->regs->XBUF5 = 0;4 W ^4 k4 w4 K$ v+ i, e
mcasp->regs->RBUF0 = 0;
. e3 p# J& l' d* G% u j; N. r. P4 i" x" U6 Q+ [
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 4 R! J8 U+ Q1 N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );: }. n; E9 [4 |
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
' A' d0 ]) O4 G& `3 b7 S2 l/ E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );& O4 A3 a2 K" k x! [
2 S+ h; l# l3 d8 n6 u% Y0 X% ]
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; k7 g, N4 Q3 r! s3 Q, V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" W9 Y1 f2 i2 r( Y, X mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
. N8 h1 O2 J' C; T; t while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );* g, @! C: ~2 K% s8 N4 [0 q1 N
+ x/ h$ I7 S: a. {7 G, D* }
CSR = 0x0000;
. W+ X) m; y5 n \9 y1 l. _0 H INTC_INTMUX1 = 0x3d;- k( U2 p' P1 N
ISTP = (unsigned int)vectors; J8 z8 Q7 A. S1 j2 F3 R- ?
ICR = 0xFFF0;
/ J5 o$ s0 Q1 A% E' L6 _1 s IER |= 0x12; 6 E7 {: Z' x+ m
CSR |= 0x01; P# j6 u& I8 ?: K+ \+ u
" y* r0 ~5 x4 G6 E6 j w3 I
- ]! t: U; s/ Q( z! W. @/ @5 \
( t" O+ ^9 U& j7 t4 u1 Y6 t还有就是两个输入输出函数:
& }) n# F: A, k! p9 m! Gvoid output_sample(Int32 out_data)2 U8 U, B& g% J
{
; E& P- C% |( ^# g, m0 s4 U AIC31_data.uint = out_data; & x! ^: g3 _4 \" U% G
MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 J, Y" F$ d; b; @3 `/ v}
% N* u0 \2 x1 H2 ^* G, L0 F- t7 g; j3 @( I3 a) R4 K
Int32 input_sample(void)8 c" A$ h4 O+ z F0 u- e
{ 8 ?4 X% f) R, {" E0 a
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; N+ i- H& s/ l' c: O4 r w return (AIC31_data.uint);+ i; q3 y' q {- s" I% t; t
}. n# i4 O8 `1 |$ s/ o/ f8 | G
/ u" q7 g/ [0 y% J* Z$ G* a" v |
|