|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 r& R' X9 T6 |, g' z8 w9 M( h
main文件:- `1 A- C" B1 O$ N# P
interrupt void interrupt4(void)
6 k6 u3 l4 ~ Y( |4 F5 H{
% c- \( d& D M8 W9 y2 M Uint32 sample;; K4 c; @% m4 t. e) B- C/ Y
5 }, O* D( g r% r2 a0 d
sample = input_sample(); // read L + R samples from ADC
$ Q2 ]! H3 F7 e P output_sample(sample); // write L + R samples to DAC ( V3 _- s1 b; t
return;
1 N: S- G6 a& M6 [$ ]$ n}. h! D i- s0 I
! E2 j5 q R& ^+ y% n% }. N
int main( void )0 G2 _! ~+ A. @$ T0 q
{* b' u s1 ~( o: R; R
/ @( i) C. |" }) [7 f
/* Initialize BSL */. _- y" n8 A/ \: u% h$ q# A
EVMC6747_init( );
6 s o2 P: A' O* g) B /* Call evmc6747_intr function */
8 \4 k/ P) \0 ^ R, ^1 H# g( Z b9 ? aic3106_init( );
6 X6 [7 H D- x& ?. d8 |6 E( x while(1);
8 ~" {8 `6 j& i6 d}% v8 `0 X: [5 p6 G7 i8 j" Q
: e3 R" T0 R( [% n1 |+ \3 {
% X$ f, {1 v" Z- e4 Q/ E
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题# i- u1 V1 \9 [. \1 U
/* Initialize MCASP1 */ a; m0 F) G" v$ I5 ] D
mcasp = &MCASP_MODULE_1;6 l1 |% I0 C- b2 R4 a
mcasp->regs->GBLCTL = 0; // Reset
. I% A' G# z1 U T, p5 m5 U mcasp->regs->RGBLCTL = 0; // Reset RX/ I5 f/ }; ]5 L: n
mcasp->regs->XGBLCTL = 0; // Reset TX
& ]% O) c9 r: c; R; ^ mcasp->regs->PWRDEMU = 1; // Free-running
! Y, y0 V8 x) o+ O# u! G; ? // configure McASP0 receive registers
; E: `1 h4 X) m c, X2 s1 R mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
Q' y. s& E$ K5 z mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, D1 d8 t/ d0 [) t$ `. x2 T
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
/ x- g1 n' B% i1 F) l mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)9 f6 t4 @$ @8 c9 q0 g4 ]) \. }
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side); a3 Q# Y) }/ E8 c7 ?
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' \& y8 q' O: j/ e- J+ s2 @! u' z mcasp->regs->RINTCTL = 0x00000000; // Not used
4 x9 r5 |( D" e3 A mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
! v, h! N/ c* A7 q8 ?1 y0 J0 S7 [( R
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used" [. b, u3 |9 N6 u
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. k# n& V, x# P" r/ v5 u2 X: e/ N mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 O& S: c$ r& I H6 }9 r mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-163 ]3 l3 X! |4 o% q+ h: ^" t
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# O* P j( h, \+ }+ R, X- V mcasp->regs->XTDM = 0x00000003; // Slots 0,1; l; Z! O" n9 ~: U
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit; S+ S* E0 y9 @
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: B9 W o% W" G- J8 {
: o5 V+ F, M5 n2 J- M) k9 x mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
7 C5 J: ]: F3 k' p% ^# i mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' H4 S; Q4 c. G1 N! T2 [! M mcasp->regs->PFUNC = 0; // All MCASPs/ ^: O. D. k9 U( o/ K) R
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
2 g( V2 C! h3 l- o- L+ J7 v4 y, `) J2 O! y; v" ?# Q
mcasp->regs->DITCTL = 0x00000000; // Not used. X5 R' V! m! ~/ d* G% e! P
mcasp->regs->DLBCTL = 0x00000000; // Not used9 g( L8 s! T* O1 f N
mcasp->regs->AMUTE = 0x00000000; // Not used8 d$ Z$ q& _# Z. z, g
$ z$ G. a. o8 @9 |/ R8 v& I5 |2 B/* Starting sections of the McASP*/$ Y. f, j( D Z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 1 d" Y' S! {' Q* t3 r- @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
6 [* o J; I; ` mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( G h; a! d* y; s! Z W- g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
0 Y" v1 z' y& N: M- p# I; U! z
% L2 v" Z1 b* ^2 } mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; Q9 ?9 H6 B6 i1 ^1 g' l. J while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, o |, x) p% v mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% Y% @8 o! Q7 | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- N+ q0 [. F% a b. w# u* c
/ Q8 C8 ^/ v T1 w mcasp->regs->XSTAT = 0x0000ffff;
: c/ H* P& _1 t2 W ~1 j( g mcasp->regs->RSTAT = 0x0000ffff;
: z& O4 e0 f" l# G7 J+ y) o% H3 t& {- f7 H- y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;( n+ j/ X' p4 I0 | }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 a q! y' r1 k& k9 i mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
4 x+ M1 s/ \. b while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 o0 h2 @ h! ]( ?3 c; }
* }& _) L, }4 Q; Z) s/ x' R: f% U /* Write a 0, so that no underrun occurs after releasing the state machine */
+ S5 [7 M" O! A8 r; y" D mcasp->regs->XBUF5 = 0;9 z6 ]4 G, F! b6 @/ h
mcasp->regs->RBUF0 = 0;
) ?- d/ m5 }8 I6 c8 p7 ^3 [8 p/ G) y3 U' B
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 K, q+ [9 y) O) |+ R7 g while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );0 g" `8 _3 u7 S+ a9 r+ A
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; - z. `' A2 r2 L8 @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" r- V6 p& R" O+ s- u4 \
; l7 E$ ^0 O, ?- N/ O3 ?1 C
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ) Z: W7 J9 Z- f9 T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) j* U' g, F% `. @# y7 a8 q mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 B& X2 ?* {# ?4 d6 A$ l9 D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );1 {* L1 r$ H3 o m3 T
& L& h) c! L6 w: U/ t CSR = 0x0000;
- p" i# ]$ x" x+ ]) V: Y+ O INTC_INTMUX1 = 0x3d;; l6 [+ _6 A" u9 {8 d
ISTP = (unsigned int)vectors;
- z+ h0 g0 m$ G/ q6 c7 @ j ICR = 0xFFF0;
, [2 p( h% T* @1 ` IER |= 0x12; 6 @- v& |- X0 \9 m- ?6 \4 x3 C
CSR |= 0x01;
8 S0 v7 f4 z- M9 X9 B3 W, A# \
4 g$ u$ r& O8 a4 G( l' C5 d( J- m9 g) m- M7 ~# E& F6 Z
, v, {* |! L- ]4 a* G还有就是两个输入输出函数:9 e& O7 R# x, e& {
void output_sample(Int32 out_data)7 q; ~ [; K3 _5 N) y
{# m2 ]) U$ B ]. A N! P$ ?5 M
AIC31_data.uint = out_data;
' S# j. I! v" O7 n MCASP1_XBUF5_32BIT = AIC31_data.uint;
. \; |4 G5 |% M}
6 d$ @1 l* h' @0 q. ]- E' f [' O4 @6 A
Int32 input_sample(void)
X6 r7 s1 w0 X3 z% ]{ " ~- j% D( s4 S$ l) k! P7 X# A! Q
AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 E* g2 o1 _0 `/ ~$ p return (AIC31_data.uint);
! F; S3 V# @7 t+ D6 ?7 `}
" A+ O" J6 ?+ \* g. w
# E! u! x9 e. X5 z1 B |
|