|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
! k, N3 V2 J. X& C8 Wmain文件:
8 T2 [, d: {- D3 z/ Finterrupt void interrupt4(void) 9 y8 y I7 ^0 |* Q8 y; N! S1 W: a
{
0 q$ M1 G% A, K+ [' K5 j Uint32 sample;4 a2 }6 N+ l' o
* }' @9 f' O1 x) ^; x( Z7 d sample = input_sample(); // read L + R samples from ADC& B+ ~0 `8 V5 ]$ o, u# x; t/ t4 _
output_sample(sample); // write L + R samples to DAC 6 F+ T& x3 T; a. n0 q7 Z4 \
return;
" T+ n4 Q5 H3 G3 S# L}
. j- u' r. I4 L
5 o9 T* \/ d; f0 lint main( void )
6 x- E: u4 `, B' `6 J- s{% Q# I. v- j5 b8 Z" R5 D
7 s! f- ^4 f! V G' n /* Initialize BSL */" j& [, y- Y" u4 `0 q5 f
EVMC6747_init( );/ G! p, a& s# O/ R
/* Call evmc6747_intr function */6 r2 z) Q4 V* b+ q! C8 _$ B
aic3106_init( );3 l9 w0 T- x- O( n @" L& M5 G
while(1);
0 ?# ], @9 M& }! U' T}
( O2 o( p- B7 G3 D) {9 S9 W; s# h; I. ^/ ^# |
$ c) w5 B1 H5 U: m1 |* R' Xaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
: K+ I/ {' I8 E/* Initialize MCASP1 */
. q3 g$ |, T2 _) {( ]; [( X mcasp = &MCASP_MODULE_1;
* J3 g) ]8 ]5 ^6 {9 n; m$ O9 e mcasp->regs->GBLCTL = 0; // Reset
$ j: d- {! P' o" O4 _# U0 ?* H mcasp->regs->RGBLCTL = 0; // Reset RX
+ P0 h9 J1 Q" n: I& P, s5 J) H mcasp->regs->XGBLCTL = 0; // Reset TX, ~% w; L- F1 S
mcasp->regs->PWRDEMU = 1; // Free-running1 e" k( ]$ Q$ j5 W# k! V
// configure McASP0 receive registers
) l r. d$ C7 [ D mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
- b. C3 s* |+ K# A mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! i+ u+ D0 L8 z# A- v% I* e mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
8 c) F3 }6 p, P4 y- D4 |/ U) t! N mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( _) G' `" B4 K( T mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' [7 b- p" ?1 F* l9 r" v) ` mcasp->regs->RTDM = 0x00000003; // Slots 0,1( `1 W! |) X- [4 Z2 h% w
mcasp->regs->RINTCTL = 0x00000000; // Not used& c: O. A5 q6 @$ C
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* E* d$ m1 z6 F1 ~& Z! F$ `) k
5 {( L/ }; v ~9 y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
) `; U; G9 T: U. o. D mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 {) T" J% u" ] R
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word( \& p& M' U s, d
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& M4 a! ^3 z7 k9 f- i mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK; _+ _9 {) V/ j2 h
mcasp->regs->XTDM = 0x00000003; // Slots 0,1( s# K3 C9 s7 F- d
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
1 C4 _3 n6 n1 `' D3 ? mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 x2 ^/ P3 e( ]2 r3 P. n; J
! K) P1 W! s P. v( | mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN# P; c8 {( x# X' s8 }% p4 t
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
" J& C5 }+ j2 \; V8 E: N2 k mcasp->regs->PFUNC = 0; // All MCASPs8 v" L! X; ?, e
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ o! L* M8 n: z: ], A8 ?2 P0 r
+ w+ M, a- j$ T& H+ X0 X
mcasp->regs->DITCTL = 0x00000000; // Not used
8 Q) H; D& |' y" { mcasp->regs->DLBCTL = 0x00000000; // Not used
2 t9 g% @; r1 C mcasp->regs->AMUTE = 0x00000000; // Not used
: _( F6 N; i6 q2 S
$ i5 a% X& v6 Q* m L/* Starting sections of the McASP*/8 P. x2 Q# Y$ t% Y
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
& q9 P( Z& I# o0 Q! C. S while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: D% y$ L* R) n0 _5 o% ` mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & B5 }2 v/ `) D! o9 D2 f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );: u' m) t% G0 r4 f9 V
) ~. w& k0 G9 O% W' F( @% F, e
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ! s& K3 q8 i- v \: E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, I! r- A [8 n9 C' e" Z% Y9 q; D4 a mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 S8 b; p! v$ [* h+ D$ P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); j+ ~ K- d0 H; e
( \" D' P2 `3 w: ~, U& A7 b7 A mcasp->regs->XSTAT = 0x0000ffff;
; |2 y, `% e& t+ ? mcasp->regs->RSTAT = 0x0000ffff; * d9 O% _/ ?& d' Q5 I9 O+ |4 K% C
/ m8 V. O: a. T, f; n! `0 k
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! J' E) t; p/ W; z( t( b e1 I
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& i# t4 K4 V8 n5 a+ w mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
$ L: p; D$ r$ _( B8 ^ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; `% e6 F: f" S4 T2 k T1 _' P0 H# d* m1 s" L
/* Write a 0, so that no underrun occurs after releasing the state machine */
8 ?; {/ L' U* a mcasp->regs->XBUF5 = 0;- T2 q' C- c" b; d0 \
mcasp->regs->RBUF0 = 0;
7 g( j% c1 p. I" {
/ {0 v* m$ x- J9 t/ b/ k7 @ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 _7 R, y/ a; K R" z9 @7 @ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );/ C% B/ g# P0 `! ?3 [0 x8 E
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 5 f; G- u9 n' I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 e& @7 h# I7 l/ G1 c* B d- Y' a5 Y5 L2 ~4 ~4 c
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
. w4 n, M- L8 y' N8 p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );4 W. ]4 I5 @1 k4 t3 g% [; A
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) t% k9 p% A9 M( { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );0 X" ^1 e* q- @8 o7 Q: p1 r" Y2 ^
& ]: |* \- H/ H1 s CSR = 0x0000;7 ?: E9 s7 m0 F* V/ \
INTC_INTMUX1 = 0x3d;! [! K0 @' U/ R9 E5 f4 ~
ISTP = (unsigned int)vectors;
* g$ E7 W8 }2 K% F9 y8 J5 \ ICR = 0xFFF0;
& @! Y1 f! W2 a$ a4 w1 W% n* ? IER |= 0x12; 7 A+ X" G) u$ ?/ K, ? G
CSR |= 0x01;
3 S7 q0 Y" E# X/ W1 U7 _2 T4 \# S/ `1 c6 w
- I# z6 h5 [. e
/ A+ q' D, p) D, X8 [% C& M
还有就是两个输入输出函数:# L2 \; g8 i: O7 ]. ^/ x) ~) w2 Y9 i2 J
void output_sample(Int32 out_data) K3 G5 _/ m, n2 p2 E" j
{
4 f' q3 u* k0 m AIC31_data.uint = out_data; 3 A2 @3 w6 R/ j V3 K
MCASP1_XBUF5_32BIT = AIC31_data.uint;
% e& b& k$ l( I) ^}
4 ?8 G$ J& ^& k0 }
$ I# x5 t. P! }* |- P5 k+ |Int32 input_sample(void)" I( c/ W9 r7 S
{
1 d; u" Z0 n: p3 ~/ J+ e- Z* t AIC31_data.uint = MCASP1_RBUF0_32BIT;
: N* Y6 o8 T* M return (AIC31_data.uint); x i r& \5 G' i3 B% M3 }
}3 }; o& P; L0 L* k/ c/ Y8 ~+ {" o
D8 [. h% S, e
|
|