|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! E# k% s! J8 H; v2 o7 @main文件:$ G$ U% P! n S% N8 b# @
interrupt void interrupt4(void) 0 `+ s y5 B% e; c4 u
{% _; ]/ e& @1 A4 r
Uint32 sample;" Y( n$ Q0 j7 {
) N, `+ W0 M1 H t sample = input_sample(); // read L + R samples from ADC
* Y+ A, u' C2 l3 n' v" m) s5 d, ] output_sample(sample); // write L + R samples to DAC
% K) ? \$ ]% C7 T return;, F Z! i7 P* E, g/ f* s
}3 b7 Q |, z" j- W$ w9 D* x
) m. B( S2 H, y5 E- A( |: i) t
int main( void )
* e$ w8 Y3 L+ g& \{
. ^, G4 G" e/ v. i% {& u- Y
$ f' [/ h1 F) I" G" y6 k0 S /* Initialize BSL */. M+ q" v$ j. S3 m
EVMC6747_init( );
) K7 J( p# ~" N4 @$ i: ?" d4 m /* Call evmc6747_intr function */+ W; @: G4 m- ]5 H( Q
aic3106_init( );6 W, G2 {5 z, J$ Z* O& Q5 f
while(1);
4 ^* X' K0 y3 w4 I: P3 P}" L1 m8 ^& I: i6 S
4 Z2 b o9 X' T1 S$ ?6 a) x& ]* n8 T0 `: X5 d; o6 @/ w
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
o5 N/ Y: s/ l8 z8 L& N/* Initialize MCASP1 */
/ K0 ]% m. q( u0 v6 Y mcasp = &MCASP_MODULE_1;* s( e0 @3 {* m" S$ z
mcasp->regs->GBLCTL = 0; // Reset4 c$ L ~* v, [
mcasp->regs->RGBLCTL = 0; // Reset RX2 D# {( {4 c" U5 f0 u
mcasp->regs->XGBLCTL = 0; // Reset TX
; F/ z+ r& C9 H3 `2 O mcasp->regs->PWRDEMU = 1; // Free-running( {2 V. F# q: o2 F
// configure McASP0 receive registers
: H+ M, \' l0 n, | mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used$ u' ]3 P8 W! S
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 X f/ Y! v+ z6 A
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 Y9 {6 P1 r) J mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& a9 x5 u" J P# L' k mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
, l9 b1 z N$ M; g& n; K+ L mcasp->regs->RTDM = 0x00000003; // Slots 0,1- I/ M1 q* |9 p1 H0 F9 o
mcasp->regs->RINTCTL = 0x00000000; // Not used
" x% H5 J* R2 ]( q0 J' w6 P5 N mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ w# w4 `5 h: D" v. J
7 H" G' d# y# h. B6 f6 J
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. D9 {6 \9 j! k g) ^ mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 X% a3 |- Z2 n9 ?; y2 O
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& D+ |. m6 F0 h mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-160 s" B0 U# E' N
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
3 C( M8 _- S4 C: _0 o2 @1 ~ mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) R$ F( ~5 v. J mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* U$ l% C8 V# Q- F. M5 s0 X+ d8 P5 } mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 M' A. ?1 |% r) \ n+ T' J# f0 [
6 X5 {+ k. H7 ?, E mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 Q# p7 f: \+ v( Z+ r. ^ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
% `! S9 b0 i: u& M( y mcasp->regs->PFUNC = 0; // All MCASPs
4 _9 @( `* {% l& p( j: F mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 d( Z1 m K" G8 K/ q
2 H4 n( J! p& P
mcasp->regs->DITCTL = 0x00000000; // Not used
$ `6 |8 I p Y8 G! g mcasp->regs->DLBCTL = 0x00000000; // Not used) t8 c( V2 i- _' K5 r& a
mcasp->regs->AMUTE = 0x00000000; // Not used
0 s! l+ L5 F1 x7 N8 ?
! c- C7 l- h# K: H l/ C1 n/* Starting sections of the McASP*/- U' w6 y; _- `& @+ {' H z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; / D1 r" k0 f" d, J ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
2 S9 r7 S7 g$ |+ q mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 8 G$ Q! G) z. ~ t U+ R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); o3 F5 Q" \- ?
( r* F/ y4 m9 `. v mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 2 @! _/ m+ b4 z Z1 R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 T& w: B6 K& R- N4 i) b9 K mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
. A ~; ^3 n* C+ ^% r5 e" L0 z% j) E% X while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );: Z) q- {4 f/ G+ c
7 L3 K1 {+ N! A: j* x1 x' p
mcasp->regs->XSTAT = 0x0000ffff; # H0 {! q' I2 a7 y
mcasp->regs->RSTAT = 0x0000ffff; ( E/ I, `$ h6 k1 V }" g3 @; C
/ u r" E l2 O# K
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;1 n" X- A# u; Q- d* s' U! _! s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );2 O1 t7 V- f! b$ l- h e: [- Q2 E
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ e% [; G0 P! Z; R8 K m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
' J3 W2 E* [& |
, S9 ?% E3 Z! f! _7 ?; I- s /* Write a 0, so that no underrun occurs after releasing the state machine */
. C5 H+ x6 ]% j7 K) E. s6 E5 \. l mcasp->regs->XBUF5 = 0;
2 ~. m. D4 U3 W1 f9 g3 W; B mcasp->regs->RBUF0 = 0;5 y# ^, t) `, @+ {0 S
" i1 D) e5 b# t8 L mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ( [/ L0 [3 A- K6 U# v9 i! r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
+ X7 x9 i0 B0 b! X) ~ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; B4 V0 ?7 ^0 Y# f5 [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ ~ I! t6 q# i [% o) Y+ \ u& Z. G( k* o. x+ s# S
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , O4 ?/ L5 r$ T/ f% Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
: u" B5 `9 Z' i2 [6 \+ w% r mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 f( c e3 k/ W) X: s$ R; P( p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );; [! d2 D3 q, M& J
( M( ]% S9 V# `( c u; P7 y7 U
CSR = 0x0000;* n! d3 E) w; x8 k# E7 ~/ y
INTC_INTMUX1 = 0x3d;% T7 ?& T( Y& Q! t5 D- }
ISTP = (unsigned int)vectors;
8 |; p+ u8 @4 ?% x2 ?7 s ICR = 0xFFF0;
7 y& z- |( V9 m, [1 f& m IER |= 0x12;
# B4 H0 x8 f" E" W" P' A5 Z CSR |= 0x01; / I5 _6 @ s8 F& e6 F1 a0 S
* I* g0 k& a) q+ m5 K( m' s5 E9 D( `. C3 v# u" ?6 N
/ i1 b- G1 Y# t2 p F6 S& i还有就是两个输入输出函数:0 k3 W- L# R; {& [
void output_sample(Int32 out_data)
6 w( M% e' D& |" {; j: Q, ]4 [{9 L0 A$ R" T ~* K
AIC31_data.uint = out_data; & U1 E; U) R. Q6 _% D
MCASP1_XBUF5_32BIT = AIC31_data.uint;9 g7 b' e7 {! @& P" n6 |
}+ v1 m1 @& Y: S4 ^
2 l4 O& Z$ x* V$ iInt32 input_sample(void)
3 H' i/ ]! Q; y& T7 O{
! o: b2 @( E& N AIC31_data.uint = MCASP1_RBUF0_32BIT;
2 p; z; ]& g* j2 L- b" B return (AIC31_data.uint);# A; a) w1 z3 h- P
}2 V. P2 [8 ~4 r: v& ^7 n0 ]
5 g! q- ?1 o. T! {( R! ~
|
|