|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 G; w6 y: _" smain文件:( R# X8 Q5 K5 \
interrupt void interrupt4(void) 4 p; m& I9 g* U8 g3 j! }# z% Z
{
/ d% M M" |* c3 m& `5 ^) f$ H Uint32 sample;
+ @; N% I6 H M6 d1 ~+ _" [% v; \5 T5 @( e B
sample = input_sample(); // read L + R samples from ADC1 ^7 d6 o m1 v9 ~
output_sample(sample); // write L + R samples to DAC
0 p& P w4 z# V( u& U return; \! a$ y: T ^: H
}( ]4 \! J! s3 I7 Q8 O& L
% p; O! i* G% ~8 M5 N9 Z( g
int main( void )
! l* |5 u. X; S3 h- m{* z! Y1 p; B, |; a9 }! z
/ o- h) R+ D8 i4 [- q7 ^
/* Initialize BSL */
! y U) E# M6 a W EVMC6747_init( );
3 X& j8 x+ ?& z, X4 ~' {. @ /* Call evmc6747_intr function */
, ]$ S4 |2 \2 o$ v6 R' Z2 I8 w aic3106_init( );3 C; }4 E$ I. M
while(1);% [, p0 A% c3 ?
}
* p8 v8 Q5 r, E5 q# \6 {$ b
# x" T" v6 D$ i- `4 m# K( q7 D
0 \2 G% n9 E. ]9 a' u( s; a9 Raic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
8 m7 p5 u3 n' H6 t! J# N/* Initialize MCASP1 */9 h1 M g2 ]$ @
mcasp = &MCASP_MODULE_1;
$ `3 S9 N3 U' r mcasp->regs->GBLCTL = 0; // Reset: E% A+ L3 B3 M# h7 A5 P5 m
mcasp->regs->RGBLCTL = 0; // Reset RX# I7 }1 h8 @) X( O* s- G
mcasp->regs->XGBLCTL = 0; // Reset TX
; C- o- y3 G6 H( G& E& _6 i mcasp->regs->PWRDEMU = 1; // Free-running
6 i0 Z) n V/ R4 j' G4 ~ // configure McASP0 receive registers$ d: K1 O5 c( z3 k& T+ l$ r `: t
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used/ D/ a/ V2 q6 y( p" k
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( S b1 N7 ]: l( N- h8 A: \, A
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ l: _$ H Q: F5 n% W mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 X$ B" V# ` `' ?* g, ~
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)( k( p6 V' A; o, c
mcasp->regs->RTDM = 0x00000003; // Slots 0,15 p) \" t" l; D3 B! C8 e& S# K! h* t+ F/ k
mcasp->regs->RINTCTL = 0x00000000; // Not used
3 f$ F. ]& }3 k) x C" X mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 N3 N0 Y8 p; j6 ]1 a" S# K0 {$ B3 } R* C% h5 t( e' @5 ~9 K
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
) c5 s5 W2 f$ `/ q! U mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) y t( k: e/ U$ B, C( ?
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' n9 c! q6 @- `( k- @0 S mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16* T, I, A6 Y. e, t) E
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK+ [$ z* F! n/ s' o$ {1 I
mcasp->regs->XTDM = 0x00000003; // Slots 0,1 ^' m. n4 A# t3 q/ f4 C1 ~
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit0 k* ]6 \3 M: j, [3 k; B
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. c4 b* K* e( N {, @+ {
+ g5 o- m( ^+ Y8 I+ Q mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
$ i' Q/ T3 ~% a mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" F6 M/ h: R# L0 S mcasp->regs->PFUNC = 0; // All MCASPs
! m: y) L+ [( } mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 E( \/ ?. L( ]# M/ l9 U: F" _0 ]- x& } o/ F6 i
mcasp->regs->DITCTL = 0x00000000; // Not used9 P+ l) _& {6 D* T/ N
mcasp->regs->DLBCTL = 0x00000000; // Not used% p/ {9 M) y: V
mcasp->regs->AMUTE = 0x00000000; // Not used- S% A. z3 e& ^6 Q8 M, e
& v5 `/ F0 H+ _- x% G8 z6 ^) n/* Starting sections of the McASP*/0 ?4 o& {; o8 ~3 r( A8 d
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ) X* p" r: e' e4 F$ g- \ |8 | {! d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); & P# L7 ^- }. U* V5 J% B+ @! G
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
9 ~7 j0 f3 m8 ?! w1 k+ X1 ~; ?$ ? A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
. p3 y; ]* i3 u
/ c" q7 b; x0 ?: Z, ]. c) O mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
7 j, r1 k6 A1 n o while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
7 Z! g& Y1 Q( \6 s# C0 H mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
2 V9 q# ?$ h$ J6 N! S6 y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 t% o! I6 E7 V3 U$ Y* T# {( T) i+ a, ]9 N! |
mcasp->regs->XSTAT = 0x0000ffff;
' `* Y6 c: ^: G x# i mcasp->regs->RSTAT = 0x0000ffff; ; F$ F3 q0 n7 n1 `( d
' }" p1 C; w ]
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. Y3 H# R0 O2 ^. @/ Z) m2 P7 R( d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) \/ Y$ R. `0 y1 P: {5 l mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
7 K' h( i5 z$ f: J) m6 a, d while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* |5 c; l; R; c) s, O
3 u- h" {' a) D, L: z8 _2 { /* Write a 0, so that no underrun occurs after releasing the state machine */+ v# H; C( p7 E& M, p+ d
mcasp->regs->XBUF5 = 0;
6 f$ L: ~% _7 W" J mcasp->regs->RBUF0 = 0;
+ d" d3 T- e5 D" g; ?' {5 K1 ^8 f4 [+ c4 f W; i$ R, r
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
6 e6 N2 p8 T* M0 ?2 b while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );9 n0 g' B+ E5 z# j( r
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : z7 O) M; }- i1 W4 A& `0 G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 f L/ U3 i6 f7 k) q; B# @( I1 g3 e6 s/ A. I
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
3 N; U: b- U! ?4 h7 G0 h2 M. s: \ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. l/ s$ d5 G. V% _
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* S1 o$ J2 X4 ~! V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
; }+ v' J2 C% E$ ~ M6 M( c% Z6 b
h8 B( N; X& `/ ^ CSR = 0x0000;
# {0 c6 r% f5 v$ T) Z INTC_INTMUX1 = 0x3d;, L4 Q: u: j. k; {* p; K2 [
ISTP = (unsigned int)vectors;9 c" A; g% n; H s* \+ m# D
ICR = 0xFFF0; 9 i; B" e2 T* Q! p( d
IER |= 0x12; $ |1 R1 c. f- T. u
CSR |= 0x01; H5 X, Z5 E6 d& J; }5 }7 p
2 }7 A4 m# q( J$ q( Q! {" M; O$ R$ y/ B
D1 n. g+ r: U0 F还有就是两个输入输出函数:1 ?0 S! v, V, h
void output_sample(Int32 out_data)" h) n# [8 ~* u, Q! @+ ^
{- G( I: c, n. ] D* _
AIC31_data.uint = out_data; ~' G# Q' G5 {' s# k1 z2 f
MCASP1_XBUF5_32BIT = AIC31_data.uint;- l/ v1 t& N q' Y) p
}0 z5 I6 h1 A1 q, a
l7 G E; [6 C2 u" Z& w! R! Q
Int32 input_sample(void)9 e% K- H9 h2 A1 i, d% e7 F8 s
{
- L# @2 Z6 d% u' z1 u2 L9 d7 E( l" ^ AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ o& L+ n) _4 c$ U0 E8 ~/ z1 O' e0 b return (AIC31_data.uint);
4 ~- V. p' o( v8 q) E9 C7 `}% D# \( E& i m# W/ {- j5 U4 ~
. N9 R' j0 P! J, @4 X
|
|