|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:, f1 g- }3 d) _& V0 F) v0 A' m
main文件:" C; E' [' h d/ K) F+ X" {
interrupt void interrupt4(void) & K6 k, u8 |. k( I" z$ f
{
& \- A7 A/ t% ?* D$ p. | Uint32 sample;( a" E1 @1 r2 E% W& w1 p8 g6 g1 h- M
7 C6 e4 {- K) Z% _4 z; [0 ?% h, | sample = input_sample(); // read L + R samples from ADC t4 I/ W# A- n7 T% _6 |' g! o2 y
output_sample(sample); // write L + R samples to DAC ) ^5 m/ s- w% G
return;
/ n# G7 B9 M) g( p! G# ^}
5 e3 J% X0 |% d5 h1 c& V5 R5 z! K4 M' g) `
int main( void )
7 B: j \3 W- Y: y h/ b) `{
* P2 E$ l, t1 k# O1 n" p& f! X: y$ p& m9 a9 {- ]
/* Initialize BSL */
$ n6 D% q' e, m EVMC6747_init( );6 a" _1 V) e. @& c
/* Call evmc6747_intr function */
! M ]: Z- D( s aic3106_init( );; f5 F9 `' c+ X
while(1);0 {- D( F# w; c+ [0 v/ p2 ]
}: Z% I) c( o" \- c5 W$ M
) A- p' O. |% x' e& P5 N
4 l$ N6 c+ P. iaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 h! E- C; B0 k- k/ w! H/* Initialize MCASP1 */
# ?& _3 X9 _, g M8 G mcasp = &MCASP_MODULE_1;
) @4 T: {* t5 C; V. f, [3 Y mcasp->regs->GBLCTL = 0; // Reset: H0 l0 p3 P: C' |( k
mcasp->regs->RGBLCTL = 0; // Reset RX, h2 k4 e4 v [: G- i$ w% Z& D x
mcasp->regs->XGBLCTL = 0; // Reset TX- v# M: Z V/ a3 @) D
mcasp->regs->PWRDEMU = 1; // Free-running
. {3 A- _ Y; V; F- }7 A7 R: ? // configure McASP0 receive registers
( z! j. R/ o' R4 J0 e mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used9 R1 \0 o; z) j& E b$ l Y5 \
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 |6 p) `$ |4 y/ p
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word/ B6 @+ M2 g, u0 f! V
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 [# ?% v, T2 S5 r mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)) c) w4 s# I* U6 w8 t) `$ k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
% o5 E+ e% a& N mcasp->regs->RINTCTL = 0x00000000; // Not used) v* v, ?* m6 j+ P3 Y
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 y9 m; {* f) f9 D, k) x* G
* F/ Q( k6 }. p7 \9 c+ K7 Y mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 F5 V- T! l4 \) r) B* P mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" I4 k8 e+ E2 T8 Y mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' U7 A* e, m3 D) Z4 S! f mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: G7 p- Q/ \+ n' I- p* { mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, v: l# k; x) d- d! m; D mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* J" _% T# |9 S& w* M7 C8 P mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
( F( x, z- J7 D! a mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; D1 T3 C2 L, H: O. \ F$ I
c# S# W; W: y; G, q \& Z mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
0 d' }, t7 A& \" s/ f/ h& z1 B mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
3 o) [5 G% S" c mcasp->regs->PFUNC = 0; // All MCASPs
' @ u* }+ d' r ?. F& W mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
, r: X2 g+ L6 p {; `- r" m4 Y4 e1 s7 E, M# m. e+ t
mcasp->regs->DITCTL = 0x00000000; // Not used+ \) Y) R- r! X; K N1 |
mcasp->regs->DLBCTL = 0x00000000; // Not used
0 V% H" @2 Y: m: A1 H6 N4 N; i4 d& m mcasp->regs->AMUTE = 0x00000000; // Not used4 k n- {2 Q+ I+ F# K) @: B5 c
& [* p ^7 d5 ?) z( [8 D
/* Starting sections of the McASP*/
- [% ?' z& |2 q% y+ k. M mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" |2 r& }1 X1 _( U' ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); . |. _. g$ J# g# T& u4 M
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & B% q$ k- L; r3 E4 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) R; V! g4 a$ G/ G( u" Q' \
V" c/ G9 S, L mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
( x$ y$ B* k5 m# U( Z5 U7 P) `1 Y& { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );) [1 U9 J C1 s. u
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
( f/ M5 j. E: @7 L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );* j% t' g! g/ J/ `/ ?- n
2 D/ m% ?" E. [) t mcasp->regs->XSTAT = 0x0000ffff; - t# u. i' m1 g2 z/ Y8 j
mcasp->regs->RSTAT = 0x0000ffff;
" C7 Q. W( A* c7 Q+ G- C5 Z# f1 n" L
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% p! j q+ ^% ?6 S9 p5 u: h- q) x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );5 r( s* \+ r/ B( y+ [
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; $ M" H$ o" v( Y* X1 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' V Z) ]3 g+ M
/ ^* {4 C3 A* v7 u' z/ e4 s! ]
/* Write a 0, so that no underrun occurs after releasing the state machine */
4 J* d \6 y) j4 x4 `& b' D- W mcasp->regs->XBUF5 = 0;9 O0 S: X. r9 L d
mcasp->regs->RBUF0 = 0;: g8 M; X! a4 z Q1 y3 |
7 |/ Q" J$ A, H1 |. H# }& K+ q mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) U8 a& f7 L6 }9 a& N) |/ f) \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );) @7 N3 f# G, G9 E+ c
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
- c3 i, B! q+ t/ ?: L% H7 y; x8 y& K while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );) q0 D, S& {" H0 w7 P8 |
. B/ ?2 d. t! p* l( C6 y" _ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
: W% p. j i3 j% `* {8 K, `, ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! k! G! |- P( b" f/ }* S% m1 D mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* i$ X# e# K' N6 D* ]% j1 ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );: s- R% l, v- O6 E7 R9 Q- T8 Y8 c( M7 J
6 W: m. R) x2 a+ D, S% Z% G
CSR = 0x0000;! d1 o1 Z% f7 m# u& H( M& D3 ], ~" j
INTC_INTMUX1 = 0x3d;
7 R* d) @* l5 \3 M) w% @ ISTP = (unsigned int)vectors;
6 |* F8 H4 Q. a& z" V/ |. }* h9 m ICR = 0xFFF0; $ B7 L$ V) S$ ?0 x" Y3 n
IER |= 0x12; ( q# i, \6 ^# V6 L
CSR |= 0x01; ' D8 B4 h; w' M9 C+ B6 k, m
9 k6 |# k- _" U. e, q @! V$ y
: ]9 O& D6 f3 w8 j2 k5 [( b# p- r' h4 _: d2 `
还有就是两个输入输出函数:
& u8 t9 A2 a" t2 @2 Tvoid output_sample(Int32 out_data)4 Z. X# g( [& R3 h1 q5 r9 w
{
; w6 Z k) _$ z, U, z5 K AIC31_data.uint = out_data;
. ~ j; d8 b2 y$ S MCASP1_XBUF5_32BIT = AIC31_data.uint;1 t! A! a- V' N
}
+ {. R# }- P! r8 `0 r7 r2 N8 D4 j$ g( d3 J* k* T$ G
Int32 input_sample(void)
+ t; U e" N3 i! [' Z7 o5 g8 p0 P{ 8 E+ D) v; z7 |2 |
AIC31_data.uint = MCASP1_RBUF0_32BIT;
- G: A3 O q. T. M D% Z return (AIC31_data.uint);% ?6 \7 v& E+ J; Z h; x0 l& r7 Y
}% Y1 |3 M W6 z9 m: Y7 i
l; G, L% L2 N8 O3 {3 e' X/ x
|
|