|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# e' v" u- d m6 D4 \" |# F/ ]main文件:! v1 R$ I" X2 c; G1 G
interrupt void interrupt4(void) # @; e- L X8 K) k* ^* v0 s1 y
{
1 ^% b# o% y& ]! M8 R% E4 t Uint32 sample;
; D+ ^7 r. S; b" ]' }8 w5 K, M/ a5 A; K4 o
sample = input_sample(); // read L + R samples from ADC
7 ^+ c1 C5 R, _. F1 ` output_sample(sample); // write L + R samples to DAC / _5 c+ U' H$ N; V' |
return;
( d: l. u( t! u5 W8 G}
9 I' L8 ~6 R# U% E+ h6 {3 r
! \8 d! i" X. `8 |8 qint main( void )
. p9 g) Q+ i/ f5 L% \{+ M4 n$ B' @5 J, {! u6 x
- W- }4 d6 I1 b8 m0 S! Y/ z /* Initialize BSL */
# \- b9 I5 i; a( y$ ]+ S7 v EVMC6747_init( );
# \/ q- v$ T G2 s5 C /* Call evmc6747_intr function */; a* R" s. \! h4 l$ G* j8 q
aic3106_init( ); }5 q4 ~7 F% f$ m' a
while(1);
( d! J \* X2 Q2 ]0 X8 F}
8 y, K0 h7 S9 ~" S' _" G A% M4 S$ U8 d, M( h" Q3 t# V
+ B& T9 C# M* Q5 l
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# m* j0 z; a) d3 }5 H/* Initialize MCASP1 */" z" T, W" q! J1 I
mcasp = &MCASP_MODULE_1;* a; |8 K5 H- v9 x+ i
mcasp->regs->GBLCTL = 0; // Reset
$ W4 b/ B6 |6 p( l/ R" Y: q mcasp->regs->RGBLCTL = 0; // Reset RX+ G# l& U1 \4 P5 D
mcasp->regs->XGBLCTL = 0; // Reset TX
1 p) @8 e- Z" g: n) {) ?* k+ u mcasp->regs->PWRDEMU = 1; // Free-running
6 A" @ F* {- q6 n8 E# b3 T // configure McASP0 receive registers$ q" N3 R( G9 r* z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used2 }. o- ?3 W5 q
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 r0 s, U+ b. l$ s& n7 \
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word( X7 U/ c4 ~ u' T# W, e
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, |# ~. b* W& I# U0 m! W. O mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
% _' O8 b; l5 \* S mcasp->regs->RTDM = 0x00000003; // Slots 0,1
" H5 A7 \$ q7 f( Y, x2 t+ D8 C mcasp->regs->RINTCTL = 0x00000000; // Not used! {3 L! K/ R/ B8 L N
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% t8 d$ [. l6 ^; L, [
, }& Y8 i# ]( G; V
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
7 S4 P3 `7 z# Z& ~8 n* [ mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 O. Q4 Q9 M0 P8 z( x3 z! Y2 M& T mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
7 [, W# | z6 k& _1 n mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 L0 g0 x7 G# P
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK( U: `9 N7 w; d
mcasp->regs->XTDM = 0x00000003; // Slots 0,17 l5 s) J' f( ]" F5 c" V
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ T3 h8 e; { d1 F
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ r) e: {2 a6 N, ]3 o0 c, J; L" Q Z$ L+ m
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
% k. A5 f, ^0 \ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
- { K. p% S* N8 w9 G" K& ] mcasp->regs->PFUNC = 0; // All MCASPs
( O) \# P- `9 q% b& k" T, A: @+ A mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 p T* r! |$ Y) F, p; [
3 ~+ N7 G5 y' N J { mcasp->regs->DITCTL = 0x00000000; // Not used; B$ W# Y( j4 S$ B% v2 v
mcasp->regs->DLBCTL = 0x00000000; // Not used
4 j' |+ F2 ?& s0 n! u: \3 G mcasp->regs->AMUTE = 0x00000000; // Not used3 T& e" o9 J2 V2 A/ D
: }; K3 Q% a. ~, x
/* Starting sections of the McASP*/
0 e" W, U3 v: B. Z2 \# _+ ` mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; v( s+ W; b: V& R/ P8 L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
- ]* r* y7 R9 d mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
5 O# R& C) l" y* l while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 x: `* `( H7 ?, v
& F* I3 q% c+ {0 K0 V6 |2 T
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % ^/ }2 d$ w3 N' a* o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 k; J1 N$ u9 J6 y4 k7 A mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; . A& L7 X9 S! t9 O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );- M3 q9 \9 t S) X# H8 U
7 D1 Q# Q7 @; `0 V* z b% m mcasp->regs->XSTAT = 0x0000ffff; . S0 i9 \! p9 P6 _4 W& D
mcasp->regs->RSTAT = 0x0000ffff;
4 \3 Y! `' @7 b6 E% J1 P9 i5 c+ ^
8 W& K: F# W; \ mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& n# B; G5 t, \1 Q. o( a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );9 D5 _3 k6 K+ v9 d
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; . j$ r0 M- U; ]4 O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 D2 [- H M% D/ U0 H. @& E c( z
' k' t7 h6 M l" N$ t. w$ Y /* Write a 0, so that no underrun occurs after releasing the state machine */0 w0 F- K6 r# ^4 E
mcasp->regs->XBUF5 = 0;) x; n! t- M: q" k4 q
mcasp->regs->RBUF0 = 0;0 S- k( n+ Q* ~3 u
/ i+ q0 E, d% l/ S* W( S# ] mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 h0 T$ \0 D8 A; z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( [" b/ i% P4 p; I2 H" g
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; + K0 G: s. `( O1 t" K4 A0 x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( p0 w# | _! e/ d: h/ r% v2 i5 _+ \# l
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( M7 H( \4 C' D- Y5 D while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );) p+ e" U1 ]* b( t3 V( n( k
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
2 {" \$ s! |# S$ g% |6 G while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
) ~. E* ^0 c2 U) ` l( x G) U- T0 r ^% v& q
CSR = 0x0000;2 q9 w8 E2 |* o; p' T2 t' t% O- n* v
INTC_INTMUX1 = 0x3d;4 A8 |) v# X9 R% E& {7 p! F% G
ISTP = (unsigned int)vectors;3 C1 P) r; G! X; ` M9 Q x
ICR = 0xFFF0;
0 |: m; m9 F4 F) p) t8 A IER |= 0x12; " P D8 V- N+ O- a3 R* }5 R
CSR |= 0x01; 9 y8 C8 u3 N3 U2 P8 o
8 A6 ?; s% A$ @; K6 X: L4 Z [4 A. `3 s
$ Y- w D, T. K/ q
还有就是两个输入输出函数:
1 k! I" |% N' z: J: ?4 W# w7 \void output_sample(Int32 out_data)
, Z* c) Q) J6 J8 ^{6 J, I! z- S0 m6 h1 S$ N
AIC31_data.uint = out_data; Y# ?) A/ v7 k6 J
MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 d# z, b. p3 l4 v0 V0 o5 c5 O# W" [}; P6 o' s T0 N/ `3 R9 a" R
8 T0 t- L5 d6 h3 V2 N' [3 }Int32 input_sample(void)
' D; C6 g( \; Y5 z1 R{
* g: p2 c, r' b AIC31_data.uint = MCASP1_RBUF0_32BIT;( \+ p2 t5 M! @, M% B
return (AIC31_data.uint);
" G `1 d# G7 a; ]& }" i}
' C* g( V% a" g. z( _5 y% p# a+ O1 K. P V4 I
|
|