|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 _5 [4 \; O2 X7 [6 ^, S- `! Jmain文件:
( r3 f6 ]- z& @6 C8 f0 e: U& q7 Uinterrupt void interrupt4(void) " n: N. ]8 i3 q/ k; b
{7 ] F7 W; {3 w
Uint32 sample;# t2 H6 E, [6 w. A5 N
7 ^/ T2 x' S! G, _, H1 M3 \8 X7 R
sample = input_sample(); // read L + R samples from ADC
1 m! Z1 j3 J b' w output_sample(sample); // write L + R samples to DAC " i+ E* P6 p4 u/ t8 z" |" a
return;
z: e- i" B$ r3 g4 \- U* ~}' @5 t9 H. A6 f" z
' S5 l2 x# d8 _1 {- P; I) p
int main( void )( g3 |) Z' ? p! G# d
{
: J8 S+ }2 ~& k
" l1 S# w* f8 ~( ~ /* Initialize BSL */9 v+ o% y- Q- y& Z) [
EVMC6747_init( );
4 N" i( j/ x( ]5 z" r8 s /* Call evmc6747_intr function */0 L/ C7 n" Z! s
aic3106_init( );3 H! x# P" S w7 i
while(1);
" z# q7 Q" i- o}5 [, X. ] }$ E' j- Y
. t( h5 C7 U! `6 @% D$ J( b
$ \3 F( \4 u1 J; w5 D; O/ [2 Z6 maic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
- x: O! ~- V4 g* f K& j/* Initialize MCASP1 */
8 X4 c8 I7 [9 G3 x' `! f0 E2 A mcasp = &MCASP_MODULE_1;
, U/ M u3 E8 I5 o. [ mcasp->regs->GBLCTL = 0; // Reset
4 V4 p5 g$ B0 j& N mcasp->regs->RGBLCTL = 0; // Reset RX5 J& j0 `5 u' T! U: u( H: \
mcasp->regs->XGBLCTL = 0; // Reset TX
, e/ m( a: u2 Y- o" S: W" ` mcasp->regs->PWRDEMU = 1; // Free-running" W2 ?7 E* V& e# b4 @
// configure McASP0 receive registers
( r+ X# L: v- o( G mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
/ z* u# r7 \: T% C1 G7 H+ y1 s) G mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) K" |% u% o7 `' J4 p% @
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
! m) t. u E6 Q/ O mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ l7 V+ i+ J# _& Z* S- o" @ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' K9 ]0 F& ?; I mcasp->regs->RTDM = 0x00000003; // Slots 0,1
, R* n7 b) H& y4 j. h$ n mcasp->regs->RINTCTL = 0x00000000; // Not used
$ |, [% O6 v6 I, ^$ k+ I' h mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. T' Q4 E* m5 {# e* o3 _4 e) p, w4 A, n; W+ l( g7 X6 G6 d
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used5 }% Z( F, q) ^6 m& z
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 J0 }% S1 d* K+ f6 L mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
) Q, r& o# I; o5 G# n& E mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16- [7 c8 E3 v( v8 |
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK c( x3 h5 f) ?% ^
mcasp->regs->XTDM = 0x00000003; // Slots 0,1, ^7 m1 c- }0 _+ g
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
/ O; d7 m/ r/ K: `+ K mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ r0 b# i& J; p# ?* C& ^! ?
4 G0 \7 X. \+ b- Y mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
, F& s8 Q3 F; U* }! P mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT2 W" s6 |, J' i
mcasp->regs->PFUNC = 0; // All MCASPs
" h& [* ~1 q2 b u: @ mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
. G5 \2 p: A6 L- F F4 s# @- B5 x
8 W9 x* [$ [( @% [$ ?! C& A mcasp->regs->DITCTL = 0x00000000; // Not used
9 n4 o7 O3 \, y0 k mcasp->regs->DLBCTL = 0x00000000; // Not used
# U- @6 \1 K1 _/ M4 s mcasp->regs->AMUTE = 0x00000000; // Not used
* T" ]. G @7 }3 N9 f
& T$ w% J: _8 w* t/* Starting sections of the McASP*/& q0 A/ S" A: B! f; y0 @
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 p+ f- o( ]4 ^" b' u L1 O while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 6 X5 [7 ?- @6 Q
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
$ _$ m, Y8 G; R while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ X8 E; d4 X, R$ o! ^: `$ B7 N* u5 A; s7 T) b
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# ?, v2 x# j ~7 W- M$ @+ F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ f4 E( ~: y0 @6 I6 @% _
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * n( s+ j8 i& I8 F9 H0 Q" e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; A: n7 \ ^- A7 f! n
3 {. a( e% m) ]/ o5 B, e mcasp->regs->XSTAT = 0x0000ffff;
; f& }% a' e, y" s! @$ Z9 L mcasp->regs->RSTAT = 0x0000ffff;
! x8 y( `$ E8 ~8 z' r8 }5 K. o% E/ v9 h
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
( I+ ?! c: A+ T% { while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, e, K& r8 y2 ~" ~ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; % g- D+ W2 w/ A' o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
8 C% W1 f/ F, R% _
K& V# W n! Y) e0 E- _ /* Write a 0, so that no underrun occurs after releasing the state machine */2 I/ d. A" j& u3 c: m" o
mcasp->regs->XBUF5 = 0;
- {* R3 h0 L/ U mcasp->regs->RBUF0 = 0;9 J M+ n7 D' i8 } |! T; h( K& C
% c4 T/ U7 s+ V% w6 N6 z$ ]
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 q+ `' c' y* Y$ q. P: K. D while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );5 W' {. I" g0 c# n( E: [ y2 V/ y
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! P+ x- |8 K; o) L( @* \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# ^1 `& _& f0 B6 r. ^# n
2 f { Z- [; K mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; & @* z* Z3 Y6 k$ r$ i0 q% Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 I; h% V; o$ W6 j" f mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
3 @5 E9 c3 J8 ?8 R0 R& C( a while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' G$ e0 Q) G% C* e' j) |
9 V+ X5 x/ F' |6 |" A CSR = 0x0000;7 g3 O* n' a6 n9 Z2 W) d. ?; b
INTC_INTMUX1 = 0x3d;
- w. T, `4 J+ N! x# B) f5 u ISTP = (unsigned int)vectors;
. S8 j n, {8 }5 R( O: t* L ICR = 0xFFF0;
" ^6 H2 @3 u8 w" f$ N0 { IER |= 0x12;
n4 p- U# |4 W9 ^ CSR |= 0x01; : f) \) f7 G2 }, M9 Q D
8 E3 }: B- }7 Y# s, v
2 T# v2 k N" I3 [9 H7 I P
, { H; Y, B L, x2 |. @, @$ R, o还有就是两个输入输出函数:
8 a, u( M ~. \void output_sample(Int32 out_data)$ m. {/ G3 A( Y1 s! R
{1 d( L) Z& M G) ?# k
AIC31_data.uint = out_data; . f. _4 O; ^) \- w
MCASP1_XBUF5_32BIT = AIC31_data.uint;( `" n5 P2 _1 y" B+ y7 B
}3 E% n; v( s; V8 }( y. w5 F
. {3 F4 Q1 }$ \ `" J7 O
Int32 input_sample(void)+ a/ W, i. O# M' X7 z+ [
{ ' u% `, j; ] O6 S) o" G
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ h' N3 K6 ?3 u return (AIC31_data.uint);
/ \ \6 X$ Z% e q2 N}
: m/ y+ b- g6 M1 G$ Z
2 i9 w/ h! N: C, X: N |
|