|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
" r8 y) a8 |: \/ Tmain文件:
& b. r" ]7 ^! Z8 C% U/ T- i& qinterrupt void interrupt4(void)
- C- ]: q( V( Y8 {{- C! U/ g+ D6 V; H
Uint32 sample;/ k; L! e6 R7 O' g: o, g* p
" B6 M+ g/ q2 Y4 U3 m$ A' A
sample = input_sample(); // read L + R samples from ADC
) r& ~1 K+ a8 Z5 R/ n output_sample(sample); // write L + R samples to DAC & d% D- P+ P$ F" M |
return;
d' k6 |' M8 x F}4 K' e4 N/ T/ y p
* H( e) b7 J4 f K g7 R7 } L% C( M
int main( void )7 s% }3 k+ M6 n. T
{
1 @: v7 c) @( x
( w, K& e. i" n5 d /* Initialize BSL */
|- s# I0 _) Y4 [ EVMC6747_init( );) a% L0 O& F& `$ h5 u
/* Call evmc6747_intr function */
, |0 v5 Y. W. h* i+ L6 h( Y$ S( W aic3106_init( );) G! d& g5 n K1 M% b- o* |
while(1);
. o m3 N/ |& {, j}/ Q$ A2 Y$ P" R
: r+ r0 l, L, t2 B
E2 y/ _8 T! h8 g7 Saic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
4 n- z Z5 v1 S# n* f. R O/* Initialize MCASP1 */2 P; j5 |8 r" } B" w
mcasp = &MCASP_MODULE_1;
% S. R" j( m- E! |6 k mcasp->regs->GBLCTL = 0; // Reset) o$ ^7 j& v/ y7 B2 D2 Q! T
mcasp->regs->RGBLCTL = 0; // Reset RX& i' i2 _' E3 t O
mcasp->regs->XGBLCTL = 0; // Reset TX
C3 Z& t! d; h& r0 E mcasp->regs->PWRDEMU = 1; // Free-running
( B, b9 R+ }9 [' g- _6 C8 N // configure McASP0 receive registers8 E L r# f' _/ G( U2 }" K' O) `
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used7 S* c6 j4 [1 Q7 b/ x
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' |7 L' P6 g7 j2 M
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
- |1 |* X- [! I" } \# ]3 c9 j' Q' z mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( C: F+ C1 U& s4 |" I. H mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)' f0 l- D2 Q3 M# \
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
3 W% Y0 M5 ]# W$ N mcasp->regs->RINTCTL = 0x00000000; // Not used; A) I' b' f3 K
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
0 c0 L+ z% A! }" k5 G- C) m$ ?- V+ Q4 C2 O/ t6 k" J
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used7 q% D% c7 a c
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 h' i. S8 b, {1 Y+ S, E mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) o. w5 b7 e, \2 V: o; r# G! s mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16) x" k3 |8 p; A6 z# @- k5 H
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
% j$ O) x6 v, S, X& F% W3 [- V" ~+ o mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) I. k6 K( q: K+ N% T, h! t mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit l2 \3 D1 G* ?% c( O( r5 r
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: E& _- ~+ g+ n4 M" U& }# d: x: j
& ~6 p) h" ?+ w
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN! ^: P8 C0 W/ M0 a, r
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT( u8 r( y6 X" u* h: B4 m
mcasp->regs->PFUNC = 0; // All MCASPs, h6 }* r) Q( Z! l' S2 t
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1. A- u- U' Y, E( K, z6 f
7 H: g* [0 d/ h! O a& X
mcasp->regs->DITCTL = 0x00000000; // Not used
% H7 Z i7 C) I/ b0 ^4 }: _" ] mcasp->regs->DLBCTL = 0x00000000; // Not used7 J7 L3 v0 M! N- q
mcasp->regs->AMUTE = 0x00000000; // Not used0 W7 f8 e" b! \ t y7 s
' @" C: `; o) c8 Z' ?9 B5 q/* Starting sections of the McASP*/1 ]; ~# i4 p0 x, J& y+ e
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ v/ k" e9 Y# D; W8 G while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); - E: f3 \, b# H
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 G" w' ]/ z3 z% @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ B6 m. A8 J$ M. Z! R" _3 z
1 \5 k& J! E9 ]+ v8 ^! U mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* ?. B6 { e5 d5 s4 f x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
9 E6 _9 _* j2 w% R mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
6 _+ h9 D; J3 ~6 l1 C- r; C+ r( T: b while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) I3 Q9 B' z: F5 y. R/ F4 U! Y
. Y5 p b1 I1 A7 A7 M" ]/ ^1 _
mcasp->regs->XSTAT = 0x0000ffff;
! R" j+ \# p5 [" q8 G Z- r mcasp->regs->RSTAT = 0x0000ffff; 8 K- P2 l4 s, _+ N: g
" g) V3 z8 b9 J+ a mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* s* n8 U: b3 \; x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ N6 o! o# Z1 P& ]8 M6 ~
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- {; T4 t- k: B6 E- q! T while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
+ a& ^2 n L) E4 U/ W1 d( D$ p5 T7 d% b' n
/* Write a 0, so that no underrun occurs after releasing the state machine */
# p0 Q6 q6 j1 s0 m mcasp->regs->XBUF5 = 0;+ Y/ \5 F! W) V) v9 ~' P, V- ^
mcasp->regs->RBUF0 = 0;- e1 z3 j3 K& k0 O
0 {, F% F1 ~$ d% [ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 |2 L1 A/ m+ b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' q: b! ?& l5 E6 t+ n* v mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 3 M8 o3 ?5 r. }* d- g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 h7 q7 i3 x; Q* h' V: s
5 n5 s/ L. n/ S6 C8 \
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- M' M2 b. l4 q$ d+ f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
, w. U3 L+ \6 ~$ A7 g, b: V mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; w, h# ~) ^$ l/ ~' c9 \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
; ~! k& B- r# b' O# t+ n- q/ X* s) O% a4 o0 w
CSR = 0x0000;
. \1 T* f: d# ?9 n INTC_INTMUX1 = 0x3d;
" a7 x. v7 a7 Q% U5 Q' h0 H2 G3 v$ K ISTP = (unsigned int)vectors;% {! ^6 b- {/ B4 O1 d
ICR = 0xFFF0; . @( c) ~, x1 G7 A g
IER |= 0x12; 4 B+ A( Q# g8 b+ c( g& l
CSR |= 0x01;
' }" Y' M! m1 k& P2 c- N$ J+ | \3 v
* O/ v+ H9 \; `. \7 _
+ R+ ?( w7 I9 @# t% C# e/ h9 n! D9 }! M; O# R- z, a
还有就是两个输入输出函数:
8 J/ e1 n5 D5 s" X7 jvoid output_sample(Int32 out_data)/ X; `7 O0 e) U1 Q! F0 g; A
{
! h4 x2 M/ U: e& l$ d: @) _. f AIC31_data.uint = out_data; . ]$ n9 T* Z9 {/ e0 H* Y. Y
MCASP1_XBUF5_32BIT = AIC31_data.uint;
7 m& d' y. U7 |7 T* z! ^( l$ h} e" I, R/ {, z$ M
" w C/ ?3 p2 M* OInt32 input_sample(void)* e6 v1 ~4 h3 A8 C1 y% I
{ 4 [' w, w" k+ A7 A
AIC31_data.uint = MCASP1_RBUF0_32BIT;4 s; n7 Y% T& y/ U) {) s) p
return (AIC31_data.uint);
, Y% A8 m9 E l% i' G& c* r}& U0 n8 o* `2 R; B9 ]/ X, l3 r
9 u0 |5 R7 ]; Q! [9 j
|
|