|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:& q4 Z& e/ G7 m" Q& [
main文件:
q0 i" n5 \1 e% Finterrupt void interrupt4(void)
2 f+ h3 u" H8 [9 {, X) i/ y7 ~{
' X) o6 @, n7 Z S" j' n Uint32 sample;; ^3 x8 T! Y. b6 ], |
7 C( V+ z2 e: d2 G5 T
sample = input_sample(); // read L + R samples from ADC
! a# z% [! E' j% @+ o; K output_sample(sample); // write L + R samples to DAC
: ^! G+ t p( ]0 X return;- _. B/ {) N' ^/ G, x' V0 A9 `2 c1 \
}
0 t! W. E: k, X/ g7 j* B1 s$ l4 [( x+ ] K& D7 T
int main( void )
! C9 b+ T! r) [{
* i1 ~0 Z0 O- B2 n/ E& p$ Y" N% P- w9 k
/* Initialize BSL */
- v, Z0 [( p, M5 l. m EVMC6747_init( );
4 K8 P- f F' T% R5 f0 l* }- B /* Call evmc6747_intr function */" m5 p' B/ n3 W% \8 d" X" R
aic3106_init( );0 ?% j+ z4 A; F y& F& ~
while(1);5 ]' _* v( \+ a
}
% W- m2 n; k) r$ v8 r6 j' s' J
* Y% p% Q, m3 E/ `$ g9 s- L) |; U) ^+ }2 b/ K3 M- e" z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* l# ~3 E+ e" }3 @9 D/* Initialize MCASP1 */( j- {% s4 Z( b: B; b/ a5 T8 F
mcasp = &MCASP_MODULE_1;
7 W/ E% n; H- L) x1 I- L1 w6 ] mcasp->regs->GBLCTL = 0; // Reset \- z i5 b/ H! ~2 K
mcasp->regs->RGBLCTL = 0; // Reset RX% u- L$ X9 O! a% y5 Q1 e
mcasp->regs->XGBLCTL = 0; // Reset TX. a1 ~, g3 n/ h+ |+ m
mcasp->regs->PWRDEMU = 1; // Free-running1 o% W1 P$ A! L% |0 A+ F
// configure McASP0 receive registers( j8 I1 k+ i) g; U3 N; n8 ~! W
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
- \: K. C& G; ^# B mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. {/ w+ k7 V: Z; w1 ?: @" t mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
3 |9 a6 \* r- s* q9 e; k mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 ~% O* c5 H% v4 V8 y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 Q4 c* r; ^8 `& o/ h8 c3 `( C mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 ]5 e6 V& e+ s" I mcasp->regs->RINTCTL = 0x00000000; // Not used7 t0 ~" W7 C$ D, \) G9 T& }, u' Q
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
, @9 `+ ~3 p) [* j' W$ C9 `! P3 e7 Q$ R: p
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' S- U, L3 s3 x# ]& T8 ? mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. i- H- u& Z) K' M0 b4 `
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ G" w% T5 O* H9 L5 d0 i: X9 H
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 b, L* j% M: x: J
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
% E: q9 H' k6 V; | m mcasp->regs->XTDM = 0x00000003; // Slots 0,18 z/ j1 r+ D8 L. G/ U4 v Z
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ `, d5 \+ U# `8 `8 o8 l; F mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 f/ w( ], H% I2 H4 t0 _
. C5 Q3 v. k' d
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
/ k9 q& H3 @6 T8 E( N, H! @ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT- q' s+ B0 ?- L5 u2 W: S0 o/ t
mcasp->regs->PFUNC = 0; // All MCASPs
4 p1 t0 U6 @8 p mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( }1 k7 Y, E+ E+ K) I
2 O) o0 ^3 J: a, e0 K! P mcasp->regs->DITCTL = 0x00000000; // Not used
" K$ \+ J7 M/ l9 n3 t mcasp->regs->DLBCTL = 0x00000000; // Not used& y6 S$ i& r$ {7 Z" ^
mcasp->regs->AMUTE = 0x00000000; // Not used; h3 V4 }$ {# D1 {9 t5 [7 N/ j. k$ g
/ e' R z( V& Z" S( H" M, E
/* Starting sections of the McASP*/
' j+ ?- R% M6 r8 k+ @ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- C b3 n7 N7 M/ L& U9 t. S; @ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 b/ {$ m5 t8 D' ~ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 |) o' a# j; c; U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 Z3 j0 t+ L1 R$ Y- o+ t5 F, x3 R6 J1 e" s/ g2 q' }
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, }; [5 z/ R! t% B* ^" ^3 x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* c1 S" U8 {* d& s; s! R mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 ?4 M, _4 P* Z. u. k t* A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# ?4 H+ o, w9 V2 z
: Z: R* R* Z- E5 k0 c7 ~ mcasp->regs->XSTAT = 0x0000ffff; ; S( N0 e4 C. i& {5 X {. W
mcasp->regs->RSTAT = 0x0000ffff;
) i( ]1 S/ T6 u. F+ B. y4 V& _) ^! x( o. a' m ]" G% z
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 m0 Z9 }1 N8 u- H7 L' y: B, ]4 f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
e) w, w1 v2 Y) }* @3 x0 I mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 B! ~1 j6 @! d& x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );# A, B. d1 ?) u2 Q, u/ D* ]* C5 K
3 M& i i9 Z- H* F
/* Write a 0, so that no underrun occurs after releasing the state machine */$ b1 T9 I: \1 F! V; a- b4 _4 a
mcasp->regs->XBUF5 = 0;# s+ \- `! M, ^% y! Z. [
mcasp->regs->RBUF0 = 0;
& [2 S& H' f: A& R- V0 I3 o) ~) Y
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
) w( W. K- a6 Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );) k# I$ X1 T5 m0 ]0 Z, ?
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , ]5 e' N% Z9 I2 G9 V# y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 w/ ]8 S8 }$ _# B; P$ K$ \8 v0 X; A
1 L" X% X+ ]3 y- N" o mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( v7 W) Q* ?9 `" A( J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );9 L3 A! w" D; E' N2 f% u# J
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
. @( F( o/ Q9 s( E3 X- U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- S P7 T) B( x) l7 f$ Y- O0 h
# x- w" G# o0 H3 q* Z) E2 `* E
CSR = 0x0000;
0 T0 a, c( m5 I( z INTC_INTMUX1 = 0x3d;
j* _/ w+ h, U6 r$ ]1 W% X: Q ISTP = (unsigned int)vectors;
5 ~7 R) L2 Z( {8 C3 y1 u ICR = 0xFFF0; ' T% E$ r$ a4 Q, R4 V( m
IER |= 0x12;
5 X. \2 K+ m' m2 Y% l) J CSR |= 0x01;
% k. z! F' y0 Q, O% |& |9 j' R7 b
9 h; }9 P% F, E/ n! Z3 `. n7 ]) m b3 h" M* o3 I
0 [; P7 i: O: I D
还有就是两个输入输出函数:
% y' x& e1 `! {; o" k4 A! pvoid output_sample(Int32 out_data)& p/ g$ }$ T s! }, D
{
/ J: K1 T& x H AIC31_data.uint = out_data; ' Y0 M$ ^) f% E) ~" {/ {( Y
MCASP1_XBUF5_32BIT = AIC31_data.uint;9 ~$ f0 X; i- x
}0 i5 L; G& E- Z* M) R4 [
9 i. F( A& I: ^ U# t( RInt32 input_sample(void)
' Z% i5 y8 B8 X* T4 g{
+ c7 e( J/ Q% c+ ~1 I* N7 V AIC31_data.uint = MCASP1_RBUF0_32BIT;
. j3 s% X6 D6 y8 N5 M" S return (AIC31_data.uint);
8 j- p! N* z) W% X}
* D) {4 T3 ^: @& L' X
8 g/ {" i( W" m |
|