|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" C/ C# Z7 ]5 g9 O0 O& Amain文件:. B; j% T6 O1 {) z/ @) j/ W: l# h; n3 r
interrupt void interrupt4(void) $ H- v" r1 m, G+ a* m) F; S9 d
{
, l6 x2 V6 ]7 d. e9 J2 e7 @4 r Uint32 sample;
, H: Z% Q- m% ~% I9 G% K
+ \5 Y5 p, @: g$ ? h5 N( n0 B sample = input_sample(); // read L + R samples from ADC% w; E: P/ X+ f2 d1 F- F% _
output_sample(sample); // write L + R samples to DAC 8 K- `2 `, T7 d
return;
# _( J! ]7 x6 r7 z; C3 y}
/ O$ S; u0 o/ \9 a! L8 _* o9 A
+ k# c" Q X8 |int main( void )
7 o1 x) D5 `- r6 [# u{
. A- c. U& x; i k" A+ c5 w( T% ~0 G, P3 l7 k, O6 k
/* Initialize BSL */( p9 ~9 r8 C8 [' x% |5 w! n; E
EVMC6747_init( );4 |2 b6 R/ B1 S" Y
/* Call evmc6747_intr function */1 U3 V$ n% J+ t$ ^
aic3106_init( );
: y* y# D9 X5 x! U6 z- b5 W while(1);
. J' B5 m5 X- B, @9 P}# L8 U% p7 O/ u: x; M
, s2 `* @; L6 w$ @, J
( v" a* n" y( c8 eaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
1 @" g+ w3 {6 m$ x/* Initialize MCASP1 */
/ T# D: T( e2 ]3 ~3 L/ Y mcasp = &MCASP_MODULE_1;( R: s* k- G0 b3 \4 r5 B
mcasp->regs->GBLCTL = 0; // Reset
% z' {6 H4 B" V* n: N; Z/ A mcasp->regs->RGBLCTL = 0; // Reset RX
0 C( p8 |1 Z/ _3 K mcasp->regs->XGBLCTL = 0; // Reset TX
0 _) I' _- V6 P: ~" g, T1 k4 m mcasp->regs->PWRDEMU = 1; // Free-running; `, f( T0 J: T
// configure McASP0 receive registers
g) F, E6 v* d" ` mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
5 D7 r4 U( l4 [1 G9 E, ]) P mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 C. p8 ~3 E5 L. ^4 [ mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word! W; i, g7 G; E3 Q& U) Y3 X
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; P" S [( _' } m. b4 q$ K/ _ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 G! @: H+ @5 @! w mcasp->regs->RTDM = 0x00000003; // Slots 0,1
4 g/ ?. D. R7 Z) f. ~ mcasp->regs->RINTCTL = 0x00000000; // Not used; c2 u* l2 d& U" d- W; I w
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. L4 I5 B) n3 }+ n
( _2 V8 ? I+ J2 i2 P
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used: H9 ]9 W9 g+ |7 P# D$ H% c+ X( A4 ^- i0 N
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 X, [ _7 [1 u% ^
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 f$ l% b, f. ? u6 ]( {6 [6 N mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 p7 b) \+ y- l7 X' F mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
l' v( K0 J k6 ^+ E, j0 p mcasp->regs->XTDM = 0x00000003; // Slots 0,1
8 A1 [& t( c2 s' N" g0 P% ~ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
9 c( ~9 I- U! C. | mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# }6 U- Q( V6 m3 O9 M% M( I0 V% k/ F# u L7 ~, F2 t% x
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN& h* r- S6 K' W* [: w1 L4 F4 e
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 O! ^+ ?) I5 f o Y mcasp->regs->PFUNC = 0; // All MCASPs
; {: p$ K7 H0 m+ w1 x4 S mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 v: L+ S K% ]+ I( ^7 e$ G, X5 x- `
mcasp->regs->DITCTL = 0x00000000; // Not used- L5 u* G) p) |7 m, r2 B
mcasp->regs->DLBCTL = 0x00000000; // Not used5 n2 c* r5 E# c1 g, {
mcasp->regs->AMUTE = 0x00000000; // Not used2 B; T3 L9 s9 N- y# o! n/ ?
* w0 N2 \# P& J) F! a1 M1 [/* Starting sections of the McASP*/
+ v9 C4 r9 j( w& l mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 h! U' w) A2 k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
4 A, B; N5 `; a( G1 O mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) `" S* y+ @/ D* }* d. N& c u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );! v' ^4 {$ Q' d! K. S- v
1 A0 H3 G; t; u+ d4 [' X- o
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 E3 G/ Y, [" |; d' |' r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 R4 B9 v6 N& I mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ M% M3 t) z& T2 J# N' E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 f; @; l- R ?" f& X. [$ a2 d& E- F5 Z( ?. f
mcasp->regs->XSTAT = 0x0000ffff; : C/ y, i) A% L8 P
mcasp->regs->RSTAT = 0x0000ffff; / s3 @4 C2 v8 c6 u, U- A! d
1 n8 @, a- Q d1 ] mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;; [6 ~- k+ H" i7 U% i2 z6 J& N" l
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- o; L0 L7 x/ k
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 o6 w, r5 D9 d while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );+ T3 N6 y q% G6 M8 Y
: P* p! A/ B; B6 s. F" v
/* Write a 0, so that no underrun occurs after releasing the state machine */
) x1 I3 u- w3 e2 y mcasp->regs->XBUF5 = 0;
# i% T$ C) N0 `* \7 u, S0 }7 V& E mcasp->regs->RBUF0 = 0;" Q4 I! e: H3 M7 ^% H8 ]/ ^( h
5 @( [8 S% e l( Z# A mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 r1 k* G9 x/ S( W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! A5 H @6 `6 a9 R0 ~5 k% o
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( ~/ x* t3 P. F8 {. j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, p& ] |: m9 z. |( g! D8 C `- n) w
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* ?1 E9 v+ a3 F$ I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );! M3 J) B7 t, ?0 J l
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 1 G$ O# Y$ c& Y1 t% h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* U1 J$ @0 [9 z8 ]! N" {# X$ ^
+ o8 g$ b1 u4 i4 Q" R: e, Z7 T CSR = 0x0000;
8 v# s0 E+ }$ h& K INTC_INTMUX1 = 0x3d;
8 V! b1 c1 ]& C* D* s ISTP = (unsigned int)vectors;
* n* }$ l* t5 i ICR = 0xFFF0;
+ Y2 t7 B1 Z0 y5 h( } IER |= 0x12;
$ l6 @0 f- E. a% a O s+ I5 Z CSR |= 0x01; ) Z7 x. R% q& j
$ y( B( K1 T# l
+ j: o( a+ x+ j/ Q
1 _7 O( E# N8 F& k& u还有就是两个输入输出函数:4 c7 ]0 V& D) E9 [- R6 G" a8 m
void output_sample(Int32 out_data)
* ~8 S- z5 r0 C0 b K{
% c7 s# }5 H" u AIC31_data.uint = out_data;
( U$ }1 j7 Q6 Z+ _8 {& `3 d MCASP1_XBUF5_32BIT = AIC31_data.uint;7 s! J1 ]; F& |7 A0 k/ G
}% V8 C2 C1 N1 y$ t7 {) o
. N3 V9 }1 k2 H- ~
Int32 input_sample(void)
* O1 T7 Y) F0 Y{
/ G3 f& y6 O4 [) W* y# T AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ z7 @6 ?# U7 y& d return (AIC31_data.uint);
J9 }+ w! s; L* J3 [; A}
8 w! I' y/ {; p" F' W
$ u& `" C& _+ R- F Y5 o |
|