|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:; u/ P0 t0 Y( q( Z% {! F
main文件:7 e7 k9 Q4 K: i8 ^3 g$ U! G1 X
interrupt void interrupt4(void) 6 t# q+ e) U. p
{
6 _+ a7 [: X. b) r5 ^ Uint32 sample;9 M) U+ x$ r+ A" n1 n* b' r" ]: ]
* \7 V" E0 y5 g4 p
sample = input_sample(); // read L + R samples from ADC) y- G8 y& X' w, O# r
output_sample(sample); // write L + R samples to DAC
( U; f5 z2 Y3 M5 A+ m8 W- G) ^" G return;
, E Y. q# }9 ~8 ~' U}
8 ~5 q/ W8 e) Y/ [3 J9 x# p) E9 Y0 Z3 M' g9 u$ f
int main( void )5 C0 O2 y8 v/ C0 ^$ J0 y' `
{( [; ^3 d# T1 n }6 ]- _
: i4 L1 [, Q5 ^ P5 `- ?' {2 P
/* Initialize BSL */4 Q7 q4 i2 [2 ^' H3 f
EVMC6747_init( );. P7 x/ v( D. O: i+ F: L
/* Call evmc6747_intr function */6 ?3 ^' {# A4 N6 t
aic3106_init( );/ o$ F4 ~3 @8 G+ Y! V7 X: l3 y7 |
while(1);
; @1 O" Z5 `0 |: c* R1 I7 J}
1 m' w- a! o% R& k
$ Z5 `' g' C" z. _, N1 C$ w
' ^; L- s* O# K5 P' w/ _0 Waic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题1 E' N3 ] d( C
/* Initialize MCASP1 */
# U, @) A: @2 y7 V! B mcasp = &MCASP_MODULE_1;- M0 ?! F4 L% x: `
mcasp->regs->GBLCTL = 0; // Reset
4 {+ w7 \3 W, e: W. ? mcasp->regs->RGBLCTL = 0; // Reset RX1 k2 S/ e' r# J* Y3 y
mcasp->regs->XGBLCTL = 0; // Reset TX
3 @6 z5 J% v4 c4 c4 |* ` mcasp->regs->PWRDEMU = 1; // Free-running
: Z* s; ^' \3 r! @! \: @ // configure McASP0 receive registers
* f+ }4 S2 F( f/ D1 w8 ?5 K mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used' Z8 m' c8 l/ f: D/ J0 y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" b6 z" k( _6 U6 ~ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
4 u8 X6 z9 N0 Z7 O+ _& ` mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ |( b4 z8 s3 T* H+ u1 g: E4 J; g mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)! U! P1 H4 u8 |+ E
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
" _5 F. ?+ O! q$ K* Y mcasp->regs->RINTCTL = 0x00000000; // Not used
0 z. U4 t# Y! E: I mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# n2 T* w; M5 Y2 O/ B+ F/ _/ C) ]2 E. @/ f8 \' F% y% c" u( E
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' |/ i. k z7 V' c1 C mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
1 b8 n* M i9 p. ~6 E6 e" o9 H mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
0 d; W9 e; o# m0 ~- Z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 x. D3 v6 p" h mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK1 ]4 A2 {; V R- Z
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
9 [/ t9 j2 p& X, b( M mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit7 j) O7 v6 g# e5 q
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 T/ @; d; N" x7 |
6 J j' R+ G( L7 A1 i mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN/ f- r# [+ D9 A! M; N, Q
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT- M3 S; Y( w; C8 F& N
mcasp->regs->PFUNC = 0; // All MCASPs; C* P# P% s8 G6 z3 |- c
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
; d& ^7 m& t- O7 O6 _
5 i) F8 g3 y0 i+ s8 a$ N6 |7 W mcasp->regs->DITCTL = 0x00000000; // Not used
. f! A* z, X, W0 h4 X4 q- ~ mcasp->regs->DLBCTL = 0x00000000; // Not used
5 C& M+ D) o8 r% N3 X2 c mcasp->regs->AMUTE = 0x00000000; // Not used5 w$ @8 A5 [4 d
, G1 O3 O" J# Z& t- n/* Starting sections of the McASP*/; {" M( }$ v0 Y6 f( z. w' Y
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 w" t; }/ L; n# t* C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 1 [3 ^1 x/ g: B0 _6 Q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ! U0 o: t/ b, k) `$ Z- f! R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ ^9 ]' [/ `- \. G; _7 h6 J' b: O; {7 R+ N' Y/ b
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 Y/ ~) O% X* X: ?& S2 m# U while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
t2 i4 g; H+ K+ F1 A mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 w' ?0 D0 n5 ^% k% d8 x0 r' K% q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; _" o( w# \* t+ w" L! _2 n$ h
. V2 I: c# S% O1 ]# O0 W mcasp->regs->XSTAT = 0x0000ffff;
4 p1 q& m( O0 m1 B5 | mcasp->regs->RSTAT = 0x0000ffff;
# K \- L3 b6 ?' T& k- n( C' A0 s3 C! r x5 ^
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ U/ L& X0 l" [) } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
* |4 Y8 G& w* A& c0 [ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 d3 \, H3 O6 O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );- p5 `9 Z7 D, H: K! U* `$ r
' ]7 S1 N" w( g5 i+ }, q) a+ `. h9 S/ n /* Write a 0, so that no underrun occurs after releasing the state machine */" D! W" R* j- P0 F- ^
mcasp->regs->XBUF5 = 0;
, B* }* S9 M# P0 e1 [# T, n$ p* [ mcasp->regs->RBUF0 = 0; \1 k6 N+ {( l: P5 L k n# ]5 T
- p* o' ~' j3 g1 k: i( K# l# p
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " s- W5 w4 {" a) |6 Q$ q* n* m7 B8 K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" l; H9 c1 W) _- x- [! D+ G0 I mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ f. Z O; N) v0 h3 @* o8 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' P9 |1 a- R; T& X2 E9 G9 N G- H, s
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
9 v0 Q s8 u8 r& A* A. X: t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 Q. Q4 p, O$ t2 q: E6 J mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ s8 [/ r, g7 v4 {' V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); H; \% }5 F) o% i! c- x
. {! O5 W0 D% b# F7 S( M$ ?" F
CSR = 0x0000;$ o, e% u) k% _
INTC_INTMUX1 = 0x3d;! ]6 J" p1 b& A; |5 A
ISTP = (unsigned int)vectors;# A% Q% y1 W( p- w. @% A
ICR = 0xFFF0;
0 q1 c4 {8 Q6 @- N1 V' H8 x% G IER |= 0x12;
# |* t2 j/ E }5 o CSR |= 0x01; % V; k; s7 R, f8 \
8 n( P- v1 b) |, l$ u1 ~+ l) q8 K. `2 f! }$ Q6 e' U2 U
+ m8 o; W* W& \0 W7 d# N0 R7 v还有就是两个输入输出函数:3 s* ?; |; l6 n
void output_sample(Int32 out_data)
5 Q/ l( ~5 W2 V% D% c; x) K9 E{
' Y+ Y2 t( j3 r% U8 N8 f5 Z AIC31_data.uint = out_data;
9 w7 n9 e+ d; P$ y4 e6 R" W MCASP1_XBUF5_32BIT = AIC31_data.uint;$ `9 z2 _& |/ C& a5 C
}1 Y8 R' X- c. `9 E4 ~
, O5 v# U: E7 z' r/ K0 ~# @
Int32 input_sample(void)& y5 R+ ~! t9 q! a8 ?/ Z5 Y* h' D
{
; H) ? n" ~5 j; H7 y; r6 m AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ r( {1 I: e6 k/ L/ _: T return (AIC31_data.uint);0 K. a/ @- U; Q0 p$ d
}
8 X6 E* S* {2 o" v1 J7 \$ ?5 y" `, T$ j: O' t" J% {9 x
|
|