|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:, [) f( }7 s% r# g8 V& h
main文件:
/ A) j& n9 H; xinterrupt void interrupt4(void) 6 K% Z7 P% C( S* q* _
{
1 @( V9 a7 _" J: C. ?! p! ?. e Uint32 sample;" `; ^1 H6 i6 X v
: g$ x. _5 {8 l( k0 j) X
sample = input_sample(); // read L + R samples from ADC
6 h) p, U7 H6 W" h9 c3 {+ M output_sample(sample); // write L + R samples to DAC / g8 |$ A# s+ t4 [. O
return;8 T( ^ K. c: q6 l
}
0 `! w5 U: ?% A: {8 e! b* F2 u+ v9 k" G. V' @" {
int main( void )
5 {: l. W6 a( C{& M6 a& s6 u- }
7 W4 G4 O( c7 Z/ |: G+ }/ K, B- K4 J /* Initialize BSL */, _. _( L' J( y
EVMC6747_init( );
6 o9 G4 p7 [) d7 p /* Call evmc6747_intr function */
\& ~' U$ o9 c3 a6 }2 w. U# U aic3106_init( );
! `- S) o9 A1 C+ u( l+ V while(1);" X; I3 E* {7 H/ R
}" g$ R. F; u: ~, f
& {; b5 e+ v" Y& s
; b( q8 R3 y4 n; {aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题3 |2 o1 s: l/ |% {1 X8 L" N
/* Initialize MCASP1 */
$ j0 i1 ^; Z) |8 D mcasp = &MCASP_MODULE_1;
6 _/ \6 |* F+ Y0 m& P" H mcasp->regs->GBLCTL = 0; // Reset, K3 B/ A t3 Y' [1 b& h, O! c
mcasp->regs->RGBLCTL = 0; // Reset RX
: D( d% m( q9 n# ^6 m/ c mcasp->regs->XGBLCTL = 0; // Reset TX
; v8 r6 E6 p6 V. ? mcasp->regs->PWRDEMU = 1; // Free-running
+ \% x$ A/ K/ S: {$ i6 ~0 T8 w // configure McASP0 receive registers
; d9 Q3 y- B& o3 X: s* K5 j mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
/ f3 F) @2 k1 g, k mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 B% M: g2 O: F2 w# A
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
9 P, U/ _& {1 B. Y mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side); ]5 B8 P5 x( U. q" L: @6 n
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)) p* A/ b h0 m. k
mcasp->regs->RTDM = 0x00000003; // Slots 0,1! U1 e/ ?4 X. R# b
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 ~8 K2 S$ s; z6 B3 V# ] mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ j$ `- z! v% a4 F6 x1 m; {
* j- Q3 l% E5 T1 W mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
8 ?( V5 D7 v; K# n% c0 W" }' Q mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- l% \% ^7 h0 @. }% w% g! y
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word' j4 R8 ?5 S. t: X* D h: t
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: o4 k$ b% `: O9 m) O4 U mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
$ s3 q0 S e/ U3 q, a mcasp->regs->XTDM = 0x00000003; // Slots 0,1. e& T6 U" Q+ q; N( A+ P5 N" x
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit% s; \2 k& M! {# X, _0 r( ^+ a
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 V0 ~" T& ?. L; h& B2 L% i, t% i- Z; o
4 q2 l- J8 ]7 T# t3 E1 I
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
, f; m6 ^% Z* E1 H- I6 v mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT' H; H- r6 _% t7 W3 \2 l
mcasp->regs->PFUNC = 0; // All MCASPs8 _5 s& t2 l5 Y% h( T
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ v: D* y* R- ]$ l- n8 k+ s
! z5 W2 P/ Q: l: e+ D1 Q: l. C- d mcasp->regs->DITCTL = 0x00000000; // Not used
7 e! k! W! @9 T. N+ @" B# O mcasp->regs->DLBCTL = 0x00000000; // Not used
" @! N5 j! {. a, O, o2 }% n mcasp->regs->AMUTE = 0x00000000; // Not used
5 m/ L [9 c' W7 q2 M, }( x) g; K1 q
/* Starting sections of the McASP*/
( h' V+ q) x2 n mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 g9 t, u+ S6 V5 Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
& V; n; u" R2 J9 _8 S+ \ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 C' {! A/ P) ~0 O# G+ j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
6 c4 o0 z1 G+ W% y, Z6 G% m3 _1 `
3 @ C- f2 a( P6 i& N$ m mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
% E" B6 w2 ] a5 x! v$ A$ k9 c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );% @' w1 M/ j# p8 }+ e
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 ?0 p% V- E3 Z0 F# }; @5 m% {" y' T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );( b. C. {& m$ r% V4 x4 X# P0 k
7 I; ~* {& k9 d4 C
mcasp->regs->XSTAT = 0x0000ffff;
, j( j4 G* z4 a( V& }, g; c mcasp->regs->RSTAT = 0x0000ffff; . K! S# q& p; M/ E
9 i% g I D& v; _( H
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# n0 t9 ~+ m- [# l+ F( m7 I while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
( M: B# G6 n, Q: X' g( a mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
( [2 |( N4 g2 \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );7 c& }' U! v A6 Z
) D% W% g/ o+ I/ N4 I/ m /* Write a 0, so that no underrun occurs after releasing the state machine */
K6 o$ n$ I6 @$ V! O mcasp->regs->XBUF5 = 0;
2 A/ K& ~2 B7 G( n3 t7 ~1 P mcasp->regs->RBUF0 = 0;
! [7 g- y& `1 R& Y6 g3 x
' x! G4 `3 Z# Z; I! J, `+ D4 Q mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 E, O% f; S0 @9 }+ v) ?4 }) @ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 u+ R, U* g4 P8 U8 u* P" |3 J mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
# @0 D& Z! J7 m6 S6 r6 W while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
: r" }8 v& q$ o+ x% z7 |0 o2 K. ^2 |2 g. c0 ^
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- |1 Z; P1 i# [4 ?) Y" e. Q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );5 N \% j8 k8 A0 w3 N$ W
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' E S3 a- W+ A8 @6 m- k8 R while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- r% j+ ^2 |: O" [& M- N
" g4 v# N7 ~6 s( L7 s! r$ f CSR = 0x0000;) h% |' {2 O5 J; d+ w! s) z
INTC_INTMUX1 = 0x3d;2 e7 X/ L) ]2 C2 N% H
ISTP = (unsigned int)vectors;( W8 z4 Q& d2 {5 |/ k
ICR = 0xFFF0; ' a4 S; q0 ^( G
IER |= 0x12; # F* a F& |' l2 A
CSR |= 0x01;
) h- a8 m! B9 S7 Y: J$ `. x w( z$ A5 Y9 T) C x7 h8 M, n
5 b0 [* t) O5 ]! R+ @# l) M* Q6 V5 `
还有就是两个输入输出函数:
" L q: D* h" W9 q Yvoid output_sample(Int32 out_data)# c& f/ ?' k7 c5 Q; \8 u* X; O
{# d" ~9 q8 D* a9 D) @8 @2 g
AIC31_data.uint = out_data; % i5 I7 V" ^; v) u$ {) K2 `5 ?5 p
MCASP1_XBUF5_32BIT = AIC31_data.uint;# z8 S. p7 N- j( r8 r
}1 Q2 y) }- u; C; N' h9 U% E1 {
( R+ n$ Y$ ]" W2 Z* v0 c* k
Int32 input_sample(void)" M6 |2 U; O2 ?2 s. g: \
{
; i p" p; @: q C. s AIC31_data.uint = MCASP1_RBUF0_32BIT;+ i& R* q x2 {6 P$ U* U$ Y7 d4 u0 P
return (AIC31_data.uint);) a1 U# Q' S! N# f% a( E
}
+ V' ?7 X# J( s+ h- @! L. g
9 O9 p5 K& s' U: A7 i5 u. L |
|