|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:' d! ^! @4 K8 U( u/ a/ I
main文件:
7 R/ H" \: n$ o& F/ z/ sinterrupt void interrupt4(void) * Z/ `6 X' S3 U& i+ m
{8 O7 P' w# t; H7 z
Uint32 sample;
4 g4 O- L [9 M. i: a: U' |$ ]6 U7 W) J b
sample = input_sample(); // read L + R samples from ADC6 f, O$ w9 g& _
output_sample(sample); // write L + R samples to DAC
6 S2 C' Z/ }# S. ^! t% z return;
8 J6 N- v2 o; L: ~# o9 \/ S}/ @. A, y7 F8 d( c
. _+ a: p2 Z+ C: e3 Hint main( void )' N1 O! s7 E s, J0 H6 ~% F
{* H6 O, n9 u/ }3 N) f; T7 |6 c! }, V
/ \3 _* Y7 c: O) C) q3 \ /* Initialize BSL */
3 B( q* f0 J% d8 _ EVMC6747_init( );
( i A% i7 I( Q" h; {3 p /* Call evmc6747_intr function */
+ |' u8 ~, x7 n; Z) `2 i aic3106_init( );4 H2 V% U: w/ L$ b
while(1);
$ p) N$ y9 |( B- Z0 h! Z& m}0 u; c: {2 Z3 ~# U, y
9 h& v; W; @# o. ]7 u0 y7 g+ k3 Y H) k+ y2 O
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# L$ ~5 K4 y; [ t/* Initialize MCASP1 */
9 G# W! K: L0 }6 x8 p# W) w; K mcasp = &MCASP_MODULE_1;
4 @0 v! x ^1 _% G mcasp->regs->GBLCTL = 0; // Reset
! |1 K5 j/ @: ]. D- k6 p2 d mcasp->regs->RGBLCTL = 0; // Reset RX3 o, k" [7 ?3 H+ ]- B2 [' p
mcasp->regs->XGBLCTL = 0; // Reset TX
5 C0 s& k/ `' I) o7 D0 ]1 U1 t" S mcasp->regs->PWRDEMU = 1; // Free-running) m) I1 X& Y& B0 a9 f# X2 r% w
// configure McASP0 receive registers2 E' U2 y! Z9 z# O c E
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ T0 s+ p) ]7 w; n% s# j mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus h4 M+ o" ~% Y, g2 G1 w
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 E: f# ?% k9 A" p mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 t3 b* q" g" f$ _3 }
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side), [" a" G {% ^+ M9 ]8 m I" s
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
" J) B( Q- J9 P7 m mcasp->regs->RINTCTL = 0x00000000; // Not used4 {' i9 C, N! y( {
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ m7 D' a) G& c6 m3 C" E
& `# |+ x6 g/ l- t mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used0 k7 Q/ X6 y! x4 b1 T3 y) }4 g+ k
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" v9 @ ]1 W7 V9 @ mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
; n' r" f5 ^! d5 R1 l mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; I' P" t% D9 W! j+ p' e2 x mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK j5 v" v4 V" ^2 Q
mcasp->regs->XTDM = 0x00000003; // Slots 0,18 r' r4 x/ t, n! N& k; z, c
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit/ @* X: [2 Q9 @$ y6 K; ^' N
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 `5 u. L1 G# g7 D. V, O1 [3 Y
* Z0 P8 w5 \8 U, O# Y mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 c( p8 v% C! H- a6 m mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT% {3 D1 K* O& \4 m7 S- ] i
mcasp->regs->PFUNC = 0; // All MCASPs
! t, c; _1 O2 P) o mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX13 W/ {3 B7 h3 j
" B0 C0 {- |" _" ~) G0 h! w mcasp->regs->DITCTL = 0x00000000; // Not used
- u' f' ]/ q- l2 s; E mcasp->regs->DLBCTL = 0x00000000; // Not used
, c* ^0 [& V6 d$ n mcasp->regs->AMUTE = 0x00000000; // Not used. g+ p5 M8 |5 B: K
2 x. A1 I W7 r0 j+ l% t/* Starting sections of the McASP*/, L& I2 v- ^/ m& Y& W' l
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; + e# F7 B6 @" J
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 5 L1 W3 V; u) U( S& R) m
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 u6 G* g: W9 {3 _+ Y# q while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 i4 K( y* l* \* C& F2 P
( u1 Q5 r* m& g$ |7 S' U7 F
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # k- L+ u4 ~; z- r0 p1 @) S& H! c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );! l' |2 S' E* m* ] S
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; + A8 _" O) s8 j( |
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ M2 e7 e1 v( X4 ?
6 J1 H2 f3 P% W mcasp->regs->XSTAT = 0x0000ffff; 2 y: w5 C8 F/ J7 T2 c$ S* I
mcasp->regs->RSTAT = 0x0000ffff;
6 d$ U9 r/ u1 ^, [: U' B" o
7 \$ m4 l+ T8 Z- C+ x7 ?) c6 U mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;/ e. @& s; a0 f/ S* ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ A; L7 ]4 T8 X mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& g; H: B6 w: ]- M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 s) F' l. L5 S/ X: J2 `
2 c$ J$ ]! Y& I. l /* Write a 0, so that no underrun occurs after releasing the state machine */; j- Y. B6 y, C) P0 J$ R
mcasp->regs->XBUF5 = 0;; K/ O5 r2 s% e' G; s0 o
mcasp->regs->RBUF0 = 0;0 ?6 _) z+ b2 k8 E4 g4 \
. q. R; i% E0 A mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 1 @5 e4 U T2 ~9 w, I- W7 U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ V* ]3 v w) j$ P* F mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ; Y6 ^/ U3 t0 ?% y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
& R& E) d0 h5 h+ A& s* m. u0 O# ~2 S+ Z+ {) \
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
$ b7 t7 w0 o* V. ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );& _/ q1 k7 H1 u/ z
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; " j% T7 B: I; x6 _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );; D8 I l" e7 Q, J6 L( b; ~
7 j3 ~& Q: S: s7 D* R+ n* l CSR = 0x0000;
$ ]5 Y4 T) X- E5 c+ Q1 U INTC_INTMUX1 = 0x3d;
5 q. w( m, Y2 P ISTP = (unsigned int)vectors;$ |9 U, F5 N: J$ @& M5 C0 R
ICR = 0xFFF0; # w9 A: p0 H0 |6 a* L1 k4 F
IER |= 0x12;
1 ?, {7 \8 H$ K CSR |= 0x01; 4 C. L0 Q8 n9 Q0 _" j6 b! [/ p
; }! o6 i" {5 R8 `6 ~2 I7 X+ M; b
5 p7 ]7 \3 y( w2 N
2 G3 j+ C$ U5 Y' L7 V还有就是两个输入输出函数:; M: Z; D- z0 x& T! [+ v
void output_sample(Int32 out_data)
3 @( N1 ~4 x, j F! ^{
4 v( z, n1 ]0 O- X AIC31_data.uint = out_data; : V1 ~4 O: u9 p: E6 h; T) |
MCASP1_XBUF5_32BIT = AIC31_data.uint;4 Z1 J9 Z# X# U2 }) {/ o7 G
}8 x7 X0 X" T% r/ }; n
3 q) c2 ?3 T* g! o' z2 \8 S2 |5 [Int32 input_sample(void)
2 Z0 ]( M5 |" l" G+ n{ + _1 V+ f1 [9 e! v2 z% ~: k% s
AIC31_data.uint = MCASP1_RBUF0_32BIT;' J F7 O( \7 O2 E! S- o& P
return (AIC31_data.uint);2 Z3 b H% \5 m; Q
}5 h7 ~2 U6 g7 h
/ l6 F& {. n9 ~5 o/ g" S |
|