|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 {) u- G9 A% R# [main文件:4 |5 a% w6 n( f9 R3 I
interrupt void interrupt4(void)
2 y$ v j% m1 E$ C( Y- @" W{% }. s9 c) U( E% x
Uint32 sample; F) i( Q1 r q( B% a% V7 S! D
' W! U1 _0 x4 h0 o4 Y
sample = input_sample(); // read L + R samples from ADC
' g7 D5 n6 K- I. A output_sample(sample); // write L + R samples to DAC 6 R- p4 ~) T* s h" ^$ s8 X3 F) L
return;) h4 @. ]) h. N0 d! S$ O
}
* [9 o Z7 @+ }, D5 m, ?% D0 l8 }2 l( R( ]9 p0 s$ l* p
int main( void )6 P$ B% i5 P3 a& w- v& d: W
{
+ B* r; e. } V) \
7 g$ g% V3 k# {% A# X /* Initialize BSL */
4 K* F! k5 n" V1 f- r" Y* g! F5 a% i& C EVMC6747_init( );/ D" J! H* D8 J) u; v
/* Call evmc6747_intr function */
! ]" F3 Y# }3 [% U8 J aic3106_init( );7 S7 O( x+ I" |6 @
while(1);
* m. j9 b# q: T}$ E1 w" q% B/ w! l
. `- F9 _, j8 m" w% Q" D2 O! M
0 `- c1 `" H: m* Oaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# T) g/ N& x0 D/* Initialize MCASP1 */' ]7 D6 T2 h" F
mcasp = &MCASP_MODULE_1;
9 D( z% x) e# G1 U mcasp->regs->GBLCTL = 0; // Reset
( {6 W% J7 u' g2 H8 V mcasp->regs->RGBLCTL = 0; // Reset RX
& P2 k9 I% e! p: F mcasp->regs->XGBLCTL = 0; // Reset TX
$ W8 ? f6 K ^2 m! i3 ]+ Q. Y mcasp->regs->PWRDEMU = 1; // Free-running
2 t( E. M. P# \. R. i/ ^! S4 i/ l- v // configure McASP0 receive registers4 p, E" _3 j5 S: r
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used# z+ g2 n. z% g, g/ T+ j
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 b% u7 ~0 X1 X* r9 {
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* V$ t% Z4 ]1 @4 |+ @( H, I mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 e' I' u |% Z8 Y& [7 W; ?/ D) W mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)1 P& [; T* P% q3 i) R. A4 V, Q
mcasp->regs->RTDM = 0x00000003; // Slots 0,16 P3 E' p% G4 C
mcasp->regs->RINTCTL = 0x00000000; // Not used
2 L' y7 V# L6 D5 \! O0 h mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 ]" ~& h& U4 a/ `; g" c
# h) j. m' ]7 W, l6 n mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used% n, |9 F; W$ P, u# o% o* r. J
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% v7 W4 @0 `. y5 g* R9 t5 Z. q
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 k% d: {" M2 g$ W) X/ ? mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 A7 b& r( `- a9 H mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
}3 z5 R+ F5 f4 m0 o6 z mcasp->regs->XTDM = 0x00000003; // Slots 0,1
* e! @# x4 A- P$ A" C mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit8 f6 \+ b* [8 S* X
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; }8 z! y+ g# T- l
9 ?; s. x+ n4 {( p& [, a; Y: A mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN H! F W8 p* ~8 e! _
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
/ K3 j- y! ^, M2 ]+ @# i mcasp->regs->PFUNC = 0; // All MCASPs0 E! ]5 n# d7 [
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1& _. z* E( u. ^; }. R
0 z& E# ?5 z! z& n$ H
mcasp->regs->DITCTL = 0x00000000; // Not used
* e8 L( A* w8 ~# ~9 i4 { L8 p7 g mcasp->regs->DLBCTL = 0x00000000; // Not used
8 k: y. x+ M9 T# ~! r( b mcasp->regs->AMUTE = 0x00000000; // Not used' k# c5 [' `# C9 {
( U1 z' p- O1 _" @% Q8 F; `/* Starting sections of the McASP*/) R- n4 \. S' K8 y( `+ \
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; & P8 U( `6 E2 a1 S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); & _# R2 r0 {4 j5 }3 i! z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 5 J. [" I# {! n( n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );% w- n! \/ U, T$ l* ]3 q. y
9 `1 A+ ^$ X& ]% h& ^/ f
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
- ~2 W& j: ?5 `# z( k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 H; b w' ^5 E9 C mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ! u' e& e& D+ h8 Y: P; b( ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );" c4 Y, Y7 N5 y' E1 }
- Q5 E. B& A% s. ?: v
mcasp->regs->XSTAT = 0x0000ffff; $ `; J: {- W; p! M7 @1 v
mcasp->regs->RSTAT = 0x0000ffff; ! N7 z( d& `& G
1 e, U8 s+ m5 b0 M, Z mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;1 { v( @9 A! x# A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
3 d% L% D4 W) A4 N: Z; g mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 2 \7 w0 ^: B( }5 e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 d: X& l7 `/ m
* z5 Q1 A9 l" t+ M/ Y$ z4 A' E /* Write a 0, so that no underrun occurs after releasing the state machine */# r; ^" n; D6 B. f9 G$ w
mcasp->regs->XBUF5 = 0;
* \5 Q+ q" X* ~) N/ g mcasp->regs->RBUF0 = 0;
# n6 P" R. q2 q5 P- w7 ]# T8 p( v$ a4 W1 A/ W& m2 k$ Q
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ( {9 H6 T' u- {+ P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% {' _# H$ B1 D& Q; M/ M6 x7 J
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 \9 m$ R( I* O$ b8 t: v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
^. p* A n! U. G
) ~% z8 r& `$ H. N, a, f( \; } mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 t0 y6 i/ h0 I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" C' Z; {8 x4 W- ~0 X8 s5 N( k8 U; y4 J mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
" {; S4 K' F) d4 y1 R @6 v while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- S5 e$ p% f7 d/ d7 i5 L
, r; r. q) D" ~1 e& \0 g# h% [
CSR = 0x0000;
4 i Q; p d& j/ I" ~ INTC_INTMUX1 = 0x3d;! ?) k m/ K N4 l& J
ISTP = (unsigned int)vectors;
) Q. V, @4 ]$ s2 k- |+ t ICR = 0xFFF0; ! n1 p. r8 K6 Q. B7 l9 L" s
IER |= 0x12; 5 h* g. h( ?0 W9 u% H
CSR |= 0x01; 1 @5 ^, m% e* Z+ ~" |, X
q. n/ j$ G% y( R1 }0 ?+ J
2 Z- T' I; D6 W3 [ {8 N2 \7 C7 [
+ J+ x% o( ^; L& C
还有就是两个输入输出函数:: W9 m# W1 w; C8 t8 S
void output_sample(Int32 out_data)% W1 T8 n! U& u8 N
{5 N4 n- q' z- g: D3 S4 B
AIC31_data.uint = out_data;
4 Q) g2 b' M* a, m MCASP1_XBUF5_32BIT = AIC31_data.uint;
; X2 u9 S: ~# U2 s# E}& G- D# [9 F; W
4 i j: N" O6 a5 oInt32 input_sample(void)( R9 D' q$ _ X7 n) t$ [
{
5 A. n. T1 i4 r6 I AIC31_data.uint = MCASP1_RBUF0_32BIT;% o E4 n% ?' _6 R* n5 Y) |
return (AIC31_data.uint);
% @9 ^( S$ @3 g V) K8 T- H2 a) J} {9 ~8 L$ `, r! S! o" o
, d3 Y/ Z3 U; l5 o0 Q3 \ |
|