|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& z) K' p9 N8 b1 m. mmain文件:* \2 t9 h: A" x/ Y5 y Y
interrupt void interrupt4(void)
0 D7 Q5 [' y8 Q3 r7 q: d5 Z' L% n& I{
0 P" P$ i* t, v Uint32 sample;
& c% s. D+ B" L2 N; ?+ E4 Y
" ~- Y ^( x; b+ [) ` N sample = input_sample(); // read L + R samples from ADC, v. u/ q2 d8 E' l8 Z* d
output_sample(sample); // write L + R samples to DAC
9 q+ s* B( ~8 N" e5 f return;4 ^4 n! t4 u" Q2 D$ ^5 @8 M# ^
}# r1 d6 y; Z1 W/ H; F4 P! N' h
& W& z! S# W/ p z
int main( void )
# [/ y& `5 N! g{8 N! c1 P& O. A, E' ]# S
, N2 Q6 d# y9 c5 g& o /* Initialize BSL */
) d7 w! o( F) y% V8 N: r EVMC6747_init( );% d8 C( s+ r! w2 s5 `2 b( u9 C4 _
/* Call evmc6747_intr function */- H2 G0 y Q$ |
aic3106_init( );
' K. k5 E/ F( K! A$ Q+ m while(1);! e7 [" S. `, z0 e
}8 b- |4 v2 @2 B; @) H( A
8 H, j) X7 {! @- g3 f# [& g3 x1 N+ A+ t! k/ j
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' ?. U7 |6 P8 Y" _/* Initialize MCASP1 */
. ?% A$ n- U% ?) s" \- K mcasp = &MCASP_MODULE_1;8 Q1 }% Q7 _8 H6 r
mcasp->regs->GBLCTL = 0; // Reset
( \: r: I- q, G mcasp->regs->RGBLCTL = 0; // Reset RX7 x$ H9 K+ P! @. W+ v* ~2 t
mcasp->regs->XGBLCTL = 0; // Reset TX
; r. }+ b' b) M% e mcasp->regs->PWRDEMU = 1; // Free-running X9 f* F0 R5 N) T- i7 E
// configure McASP0 receive registers
, _" @$ O. M, i6 j; |+ h( R mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used7 I8 C5 O* {/ j% U- T7 i. Z3 F
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; \7 V* m; n4 U9 ~
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, h# p( Y6 j: E; @ mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)" j8 ?8 C4 Q5 e0 ?% J
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
F5 R- [% p' T' r8 G mcasp->regs->RTDM = 0x00000003; // Slots 0,14 W. J' P5 s8 G* u5 ]- j' t
mcasp->regs->RINTCTL = 0x00000000; // Not used
7 ^# }1 c7 _. u- k mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 a7 T1 ~8 b2 I
9 A* o+ V, v. X. g
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
+ K" n) E& E, k! ?3 d mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 N" S" I' d: t mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
: w" j6 Y7 V( A9 ^+ L8 E mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: n3 v% D& Z0 W6 D/ `; I* j0 Z1 C
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK* C, }- Y. e. C6 }9 q7 `& O1 b
mcasp->regs->XTDM = 0x00000003; // Slots 0,1( o* `0 w% ]6 n9 F7 ]. j7 J
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit1 i: |$ G7 ]7 b) P7 w& H8 k
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 }- U3 d7 J# G V3 a7 k7 N8 M" Q
- ^( V& l: k1 H4 `' e: z mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
4 R/ E3 _: b2 v# p: M6 n" O; S mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' @* J2 d* T% G) z mcasp->regs->PFUNC = 0; // All MCASPs
2 s( s5 @1 k, @2 i0 {( e3 y mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX17 d. d3 V0 ]1 @' q; j7 a/ C, @
' R4 ?6 C8 {8 z# n+ C& n
mcasp->regs->DITCTL = 0x00000000; // Not used2 b9 m% i+ S& i
mcasp->regs->DLBCTL = 0x00000000; // Not used
/ v, A) _7 T: X, s mcasp->regs->AMUTE = 0x00000000; // Not used
9 I& [. [, e5 S: T
# @; N; l- n' Y6 Q/* Starting sections of the McASP*/, g, b" r; |3 Y- l! n) F
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 4 m% l8 H" c0 X* w6 U& \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ; N# T: {+ [# \3 Z# A& g
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
. b; A6 B8 _" N& I' {5 Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 A" n [9 c7 v) H
^3 B& E" N) {. l mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 C* ]! `6 J* j$ H9 b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& G: w( [+ v, L) q( z& c) M9 j mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" @+ k$ Y" s; R/ A0 Z5 ]5 T6 |( _$ ` while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );7 u' E) ?' l! m- B( |* `
P0 p8 ?* O8 T4 J9 t mcasp->regs->XSTAT = 0x0000ffff;
9 R: O/ v H# I mcasp->regs->RSTAT = 0x0000ffff;
C ~" _. G7 ]1 [% O g+ L; Z. P0 B& i3 ?/ T4 a
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;# p9 q5 F; }) t4 M) L$ X* ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );( M0 R3 N. I% F& c/ p, ?% X
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 9 i* ~! H( w/ P8 v% {7 [2 x7 [ e: b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 @0 e" z8 n% b: L& T0 y0 s" y7 o. S- I' Y
/* Write a 0, so that no underrun occurs after releasing the state machine */
( t& J6 S6 c+ F3 P% a# r' ^) I mcasp->regs->XBUF5 = 0;9 _3 ` x* g* X7 ~' m. h
mcasp->regs->RBUF0 = 0;; H. O3 E; ^( z* ]$ Y! ?
6 }4 l3 a3 h5 x M6 m mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 Y3 l9 ~2 W2 V9 ^, ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );6 ~; M x5 Q+ w8 K1 j9 x! _# x* E4 e
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ( R) M9 U4 C, e% o0 G; A: @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
7 D! p* I# P1 `& a. C: J4 r: T) V; Z u% W
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 9 f Q+ i; C% w* E8 \3 |) |$ x
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );/ V9 r* P+ W! I, e T8 }" U
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 2 ?4 g; f D) P2 d
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ p/ t( T4 E }5 _2 m& |: x+ q6 K: ?9 v- W* L' G* Y) z/ S4 n
CSR = 0x0000;
/ @8 X7 }! o# I1 f5 G INTC_INTMUX1 = 0x3d;1 q/ |" y# Z& d" J5 B
ISTP = (unsigned int)vectors;2 T- H5 N/ H3 r# q5 i# r2 o/ q
ICR = 0xFFF0;
8 O5 o" N4 }2 e2 N IER |= 0x12; ! b8 t, @2 G0 Z+ p; X6 G
CSR |= 0x01;
' a5 U+ [& S( J1 E) [- \5 E
1 _: h+ J: |5 k# h+ E- K% l: Q' ^& t8 x7 e# K
; h+ l5 K# z a% Q1 Q: J还有就是两个输入输出函数:
# Q% E5 i) Z: A4 F: |void output_sample(Int32 out_data)' R M# f$ Z) D {# h9 D
{
" u" |: j' U! g6 A AIC31_data.uint = out_data; A# ?8 n; v9 w# f( O
MCASP1_XBUF5_32BIT = AIC31_data.uint;9 b6 j% n; G# }$ q8 g8 N2 K- a
}
6 I1 j8 i: |' g9 j. P9 S6 a$ E3 t3 ], F! A' C
Int32 input_sample(void)6 Y6 n5 \" W) {" m; @* [
{ # F- {; g9 I) U" z
AIC31_data.uint = MCASP1_RBUF0_32BIT;4 s1 h+ b% s+ t0 s% r! N! s
return (AIC31_data.uint);
; n: _- w# B: ]}' |5 M' K, d9 p# a: l
" u/ V n+ n5 Y- w! C- M' {
|
|