|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 }* N O" e' dmain文件:. f2 n2 V0 Y! m8 U- E( f3 s) L6 i
interrupt void interrupt4(void) ' n% s2 A: f# W5 B7 Z$ `/ U
{
" A1 b% { ~& o' d3 v7 T Uint32 sample;
8 h. t8 Y5 l$ G5 D8 \% Q( ]
7 {" `& W' C' c) _, A& w sample = input_sample(); // read L + R samples from ADC, c: \! U' a) |
output_sample(sample); // write L + R samples to DAC 6 Z. i0 M0 e* _
return;
2 r9 ?. v0 A9 x/ G8 C5 ~}
; ~5 z3 S# ~; S. I# \1 t" L5 ]4 \# u
int main( void ) X; y8 y5 A+ L3 _8 n! _
{) N( }$ A2 I5 L3 E
. ?: x \# H: o0 x
/* Initialize BSL */3 Z2 c6 d6 [: s- E/ S# j
EVMC6747_init( );
$ [+ u3 @- P9 T, W/ a /* Call evmc6747_intr function */2 M4 A2 c$ X2 Z& P) `4 o
aic3106_init( );
8 [7 g* F7 {$ d, J' F; U while(1);
7 W4 f* O# |2 I}, ?' T4 M0 K% ^% Q: Y( E5 I: f9 V6 I
+ ^( Q% q0 i" t! O, S
" l; y6 f. t0 f7 ^2 \& Gaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 n% L0 H% s+ l6 j/* Initialize MCASP1 */ F% D. ]7 |6 |7 ?. D. ]" k d
mcasp = &MCASP_MODULE_1;
. ?, u0 b6 d0 L6 G, J: k, @ mcasp->regs->GBLCTL = 0; // Reset
% m& S# F' w0 x mcasp->regs->RGBLCTL = 0; // Reset RX
. e& G# g5 e ^" l' X% E mcasp->regs->XGBLCTL = 0; // Reset TX/ T! F! E9 C- W5 R) l8 ~
mcasp->regs->PWRDEMU = 1; // Free-running, e; K' B( ~4 z. @8 w
// configure McASP0 receive registers
5 ~4 g& z7 ]4 X. |, N mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
/ e0 t# }+ M4 {" s" V/ B mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ O) o# ~& q- y mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 |+ b: c& B& u, ?5 K* d0 q, h mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 U8 E0 w5 q1 _* \) R. t$ Z( p0 G
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; N" d* \! @9 w; ]1 w9 c. v mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 |! m E+ p3 k1 c2 K( M6 w& X mcasp->regs->RINTCTL = 0x00000000; // Not used
* W2 i( p2 ]* p' |: U4 @) A E1 e% x3 W) v mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 j K9 h3 G: n, F$ o
G: F4 _# v8 C! Q- `! R mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
; G( p; o4 i6 c( v8 u3 \ mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( J* ]! ?/ G; R2 N* P$ p
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ n; L! _0 S9 h/ X, O! H
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 h, E0 q" G* c7 H mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK! R+ K3 V0 E+ B* |
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 F0 Y; A4 O; ] mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' a. m( T# D7 w( \: t ~# l& a mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 T, V( O1 H; ]# E6 `% Q& L, ]( O9 b% k' P8 i3 X
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN- k2 N9 I' Z$ C9 C7 [
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT! C. j+ f" b8 I2 @
mcasp->regs->PFUNC = 0; // All MCASPs
* \# C! r0 H$ k, D0 B6 H mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
7 p9 ?2 o* o2 S. v9 y" h$ I- b/ C" N* K
mcasp->regs->DITCTL = 0x00000000; // Not used
8 ?% c- L/ g. m# ~ mcasp->regs->DLBCTL = 0x00000000; // Not used
; I/ H6 ] F, H! _! g6 S1 J7 }% U* N mcasp->regs->AMUTE = 0x00000000; // Not used
8 V: Z0 @3 e+ I! R, n5 r- X: Y" j5 [, c$ @1 E
/* Starting sections of the McASP*/
3 c& E: ]/ T$ F2 k; e) l mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
$ X. _; [6 r( E- N while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); / H' x1 y. a4 u; E# D" S
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; $ v6 o/ J) ` R6 z& ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 p. F7 `( c: O
" q/ Q! R2 ~3 V mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% H, S0 V1 Q/ w4 X7 r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
# J$ b) Z( {. A c* `' e mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; & Y5 n W7 `7 N" u$ y: b: l5 S9 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );, b2 F2 H) S; N
* e2 _0 Q; W, u ]! _
mcasp->regs->XSTAT = 0x0000ffff; % w5 b' V; a; v( {6 g( F, @& b
mcasp->regs->RSTAT = 0x0000ffff;
% q2 u( T3 a# i* \9 d1 ]' O6 n$ b5 g6 ~$ \* l
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;3 l/ z# b! w9 N7 F( X; r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 h. W: V' t C+ `" C/ D mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* s- o; S l1 K& j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
# b) V0 R# }# @# j4 t5 t$ w% W& I) l. X' J% }3 Z9 |/ N' D. A
/* Write a 0, so that no underrun occurs after releasing the state machine */
x" n5 ^1 s% D: g# G, Q mcasp->regs->XBUF5 = 0;
0 g. |% A6 ~0 r) i7 g mcasp->regs->RBUF0 = 0;) |# A8 @& v. `# B
5 K, B/ X) A$ ]& t4 b; Q' R4 a
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " A Q4 J0 G" e5 w, L) B" C+ W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
7 R+ t2 e! ?# L5 N. { mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # s" r9 t$ e* a3 M- F- x9 M0 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );9 _, n' A( l+ ^5 F& K
2 E! W, r1 V! C# V1 P0 Q1 U4 T mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 o% E$ V" Z# h7 R H. C, { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
# N8 h! B ~) f2 k mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 4 J2 l0 }- W0 R& |* G4 g% x$ ^4 ]2 p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: k$ H- w% }% A2 D
% T# Z j+ d) k/ p9 b) {1 p CSR = 0x0000;
! H8 ]/ x/ a) b" F. K INTC_INTMUX1 = 0x3d;9 M+ ~: o6 j, m8 E; e; P2 K
ISTP = (unsigned int)vectors;
9 T8 Y! Y/ g4 T2 [: Z- Y/ A ICR = 0xFFF0;
; a$ u6 x" |8 x5 s3 \, U IER |= 0x12;
" ?5 t+ S; l$ Q$ i& x7 V CSR |= 0x01; - [0 A& \* _# h z" e# N
6 [8 k5 d' a' v2 p
! D2 o2 ^5 ?4 B! H1 l; u( n7 t" y' q/ v2 n% g! Q* Q
还有就是两个输入输出函数:
9 c w. P9 Y; Cvoid output_sample(Int32 out_data)0 C8 i" U$ B7 n1 M# u
{
, s1 t+ B2 B; P- K8 {' @% I5 h AIC31_data.uint = out_data; 3 S' {4 ?5 Z$ C
MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 z1 j6 _' P$ j' d; x" ]" f}
1 \$ v! q1 z( P! ^# k
/ H+ t$ H& t& e% J: ]Int32 input_sample(void)( }8 A" P2 n+ R
{
' V! \2 m( \* \ AIC31_data.uint = MCASP1_RBUF0_32BIT;, N0 r i b7 B* o( A
return (AIC31_data.uint);1 ]- ]! x" O* v9 s
}
& g4 z& w! x. @& J# R. r F1 _/ K8 E% v6 g
|
|