|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:9 g5 S7 V% z& L( o( S$ U- L3 q
main文件:, b1 C( w \+ P% P- \# r
interrupt void interrupt4(void)
) z2 b- Q8 `' v1 H{
* f$ u" v; h! b. U6 {8 v+ @ Uint32 sample;
2 v& U7 |' `8 l' Z i7 ?# {9 l7 k
8 x: T2 ?. x7 `6 D sample = input_sample(); // read L + R samples from ADC1 [- l# B: a8 j( {6 W6 ^# N
output_sample(sample); // write L + R samples to DAC
9 p+ H9 Z" Y6 R' ? return;, j) o! `4 x' n4 L
}
, J2 l- V/ m3 L* T, p- Q. y6 N* X& E& g0 M+ d7 \! }0 g
int main( void )
& L( w2 T$ k5 G{
v! |3 {+ E' X. v* q5 e7 {' X/ M) A' V* z4 n7 \9 y
/* Initialize BSL */
0 \% k; k; f% _. o5 k' P EVMC6747_init( );
( s @+ @& t) A$ P" i /* Call evmc6747_intr function */$ n# a- v1 v6 ^/ {% ^0 `/ {
aic3106_init( );
, ~2 q# s+ o" W, n1 x: A( B while(1);2 H7 L9 g/ T4 ^5 e
}
5 K5 u. ^! ~+ f1 I7 ^7 L& X
: F8 P" E5 W) x& X: G# F# Z8 x* g0 e2 d$ q6 E- e: Q( u4 v
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题, N9 j. A& M6 O1 v3 O Z
/* Initialize MCASP1 */& Y! L+ C3 }2 \! `" a2 B' d
mcasp = &MCASP_MODULE_1;9 w# w" Q' Z. d% O$ J
mcasp->regs->GBLCTL = 0; // Reset* B' y* n* j' T/ z+ V' |
mcasp->regs->RGBLCTL = 0; // Reset RX
$ \/ e9 P, @3 N0 O- O mcasp->regs->XGBLCTL = 0; // Reset TX9 N! R' [/ m" a, S9 y! ]9 ~6 P
mcasp->regs->PWRDEMU = 1; // Free-running
6 f; u* R9 l3 q$ h) u // configure McASP0 receive registers
! `! ~8 c$ i& V7 a0 g$ u& L& ` mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used; i( q; E+ P9 t* y+ E; u4 u
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 z/ W' @, x2 y# A7 P5 k! ~" Z mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word" w3 j1 O1 g* ~' @/ p% |# i4 [+ ^
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
4 b' U- C8 r7 U2 h! H4 ~ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
2 T% V" I3 b1 _0 H# w( H mcasp->regs->RTDM = 0x00000003; // Slots 0,1
- u7 E* L3 X8 U mcasp->regs->RINTCTL = 0x00000000; // Not used" K) x/ \" O6 r5 t3 U5 E7 j
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 ]% R: s( S K6 z$ [
" x, J8 F& |5 g/ e mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 X% ~) G+ w1 M mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; T* \% Y$ i' I8 L* M1 |% i
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word3 a+ R0 |7 b0 u' c, V8 e
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16% Z% ^4 z% Q% U7 V- A9 u; ^
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
- e1 D0 h2 ~# L8 q mcasp->regs->XTDM = 0x00000003; // Slots 0,1
|9 Y/ m* g. X5 @' D2 y$ Y7 w- j8 ? mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit4 _* ]' W6 u( v& T; f0 ?
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ k' K* k* b, b. O8 j3 b
! X! @- d2 {/ _2 e) t; T! U+ H4 U mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN! o' U: i s0 o) o2 x9 y. j
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
) f- N: i+ T$ E5 | mcasp->regs->PFUNC = 0; // All MCASPs" r) X. [! |3 G- i3 Z! |
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ P0 g. H% n1 a6 w
' Q& e+ }0 Z# j- o/ ~; ^' f mcasp->regs->DITCTL = 0x00000000; // Not used
8 f: q9 \0 i! i* C6 _ mcasp->regs->DLBCTL = 0x00000000; // Not used
/ Y) P3 t% z; G* t& i8 T) m mcasp->regs->AMUTE = 0x00000000; // Not used M' C9 G* x& ^% q7 t- C
6 x( A3 Y3 J' {5 v5 u/* Starting sections of the McASP*/* p+ h% C' |: T: G5 ]/ C! Y7 S
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 5 y) t; ^+ t' B4 w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); / p" a" V5 }5 B5 ?# G
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 y7 r0 v0 S0 N while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );; w+ X' o( M' u* u# b9 t1 X
0 v4 s% v% ]+ O0 f
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 E" ^$ X7 @3 u& s) T' \9 d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 |0 v1 i$ X. r# i
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; $ Y. y' M! p# P9 P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 n+ C. D: F+ M* Q* m, p+ Y
( K0 Q Q0 x4 o7 h/ n2 } mcasp->regs->XSTAT = 0x0000ffff;
* u! l5 y2 c+ U0 O) Y5 l' Y mcasp->regs->RSTAT = 0x0000ffff;
, ]; b2 O2 P% F! U' E/ d! Z9 u$ O' A4 Z' [9 N6 R4 I9 @! d
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 g3 j+ b' i( C7 \. B3 w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; i) i5 S- h" l: D1 @5 M mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' ? s6 z) P5 J, z2 B" G while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 ~. }5 B; A' w, m" N' R
5 ]( y. G, i; Q" k7 s /* Write a 0, so that no underrun occurs after releasing the state machine */& h5 ^) V$ i" ^" H$ |6 n* Z
mcasp->regs->XBUF5 = 0;
; e6 K2 n6 _, z7 D" m5 a5 B. w mcasp->regs->RBUF0 = 0;
: g- |" Y1 z' B( o/ \ q8 Y$ Z: s3 H% m1 C, A
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 L! }3 Y0 i z+ n while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
6 x- d; Y, d2 ~ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
% S- c8 z$ x" a while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% U6 [' O6 v% ^! `( b
% x+ L' D$ f1 Y% ]' \ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( D/ Z6 o1 N; m: b5 V# `9 d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );8 Y, {, W' M' u' _4 m- T2 n
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % m# j7 J; Z# R3 w7 `' |0 |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );' f8 O- _! s5 k: O
7 U4 I5 t/ V" G1 Z CSR = 0x0000;0 R3 f: h( `( l8 H8 c0 E
INTC_INTMUX1 = 0x3d;, c! p- {( e3 ?1 `7 c
ISTP = (unsigned int)vectors;
& x) m- ?2 `) N, p, ]; p& l5 ^3 k ICR = 0xFFF0; 8 R, L: W- x3 L; ? ^
IER |= 0x12;
. Y8 ^& ^ R8 V0 i CSR |= 0x01; 6 z. I- v4 A1 ?7 i& ^2 I
1 m. r; s$ a( ?: t& a. m% ^7 R
4 ]5 N0 R4 n9 S% D. n+ {
0 m8 g1 W" C% h' p, S- ]8 ~
还有就是两个输入输出函数:
0 T7 n- O# }0 D9 D, Ivoid output_sample(Int32 out_data)2 |% n4 i/ R9 S+ M
{
/ R+ o# f& ^- G1 d AIC31_data.uint = out_data; / S/ N. a8 L6 e9 m
MCASP1_XBUF5_32BIT = AIC31_data.uint;7 b* A+ K1 D( p' f
}
/ L% U( K0 m" K2 _' r2 c5 _* |5 o# }# v
Int32 input_sample(void)
) Y7 b9 c, e* v b{ ' I1 Z# ?2 ?! M2 c
AIC31_data.uint = MCASP1_RBUF0_32BIT;( [& F# j& i- Y/ m1 E4 S
return (AIC31_data.uint);
. N0 D; }+ ]$ d}
. f! c, [3 D& [5 |7 `" ^0 ?3 X" J4 ~; ^9 m! q1 E
|
|