|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:# V7 X+ Z& `2 B; x# o# Q7 A: m" u
main文件:
; Y/ N: p. @- u% w, Pinterrupt void interrupt4(void) # S3 T$ R3 D; q+ a! c: C( ]* H) J
{
% D( T2 X4 e: `% }% ~& R" Z Uint32 sample;9 m" a+ {7 T. g% B- P
. G, Y2 C4 ?; ^6 R sample = input_sample(); // read L + R samples from ADC
) d, M% {% u6 \& ]2 \1 V! C& p output_sample(sample); // write L + R samples to DAC
" \) |8 k% A. H I4 w return;# j9 }1 Y4 R& V' C
}
" o8 I% T: t2 F% D; K7 l0 s% F2 y0 [0 y3 ~! H ^8 S
int main( void )( y4 u W: e0 R* S) |) t
{
* C9 F, o( O" G% _" M* H1 l4 c
4 C2 @' _3 _( a7 \8 B7 G: H /* Initialize BSL */) t) ^& Z0 p/ I2 x
EVMC6747_init( );( j. |; Z9 v7 f3 K# h
/* Call evmc6747_intr function */& ~2 C' d0 x# e4 x. Q
aic3106_init( );& ?" H8 v% B$ z) `& r7 ~" j+ ]
while(1);# l- I3 Y7 i: L6 i
}
R4 O; v* A3 C9 g7 p
8 O. D! Q- q% H$ H4 C3 V" `# l& F. e" ~
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
/ N2 p4 I j1 ^9 j/* Initialize MCASP1 */
; q1 s( q1 M" y; f# t7 p mcasp = &MCASP_MODULE_1;& J' T1 }! |9 D5 P5 n+ h
mcasp->regs->GBLCTL = 0; // Reset
! d* g" L8 I3 ^* ^ mcasp->regs->RGBLCTL = 0; // Reset RX
& e9 w5 c4 a+ h$ b; o8 @( [ mcasp->regs->XGBLCTL = 0; // Reset TX
% S& K4 b6 I& m0 ~ mcasp->regs->PWRDEMU = 1; // Free-running
. ?: l* g6 J$ L9 {! w, f, ? // configure McASP0 receive registers( E0 L& z) }; M! V- ^
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ e1 l" I. U: _7 q1 D mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 G% r- y. z# ` d. o/ T; T
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ K/ ^' F, ^( H3 Q, i" V- Z5 z. W mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( f6 Y" @( j3 b mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
3 Z& c+ T v$ H: W mcasp->regs->RTDM = 0x00000003; // Slots 0,1$ H) \/ @6 d/ I- ^& |9 q: S4 Y
mcasp->regs->RINTCTL = 0x00000000; // Not used* o& P; g, W% }3 A
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ y& b! K( D7 N" ^
& I' r) c% f. A5 `) N- E/ q mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
) G) G x+ u. P0 E7 g0 |- H mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 U$ r1 L5 A% E# D
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 F+ m$ s4 D. ~
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16- [" x6 m5 |3 Z2 F; q
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
; l$ Q' a+ `2 V' [1 [/ f2 k; h mcasp->regs->XTDM = 0x00000003; // Slots 0,1
; q6 a7 T; U' c8 a8 |# i5 ~ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
|# D6 M# }0 x4 t mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' J+ j2 W# Y" c6 C" Y/ T# v; b- q) }! W1 z
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
+ t# ?" ]+ F3 M, \. A mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT$ Z+ k/ a" a j/ t5 P
mcasp->regs->PFUNC = 0; // All MCASPs' x" l. ~: a& D4 M+ V3 S
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
# g! k q: O' N8 \/ ]4 @; |# G9 f6 n
mcasp->regs->DITCTL = 0x00000000; // Not used
# a# R. _2 W. {3 \, [ mcasp->regs->DLBCTL = 0x00000000; // Not used9 N+ p( m; k& {5 _8 i: m
mcasp->regs->AMUTE = 0x00000000; // Not used
9 v0 E) {0 K: {% w: o- P2 h5 G- u2 t% M+ w
/* Starting sections of the McASP*/! x+ F' z | W
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) z/ l4 c y& k; f: Q; }) b, e while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 E" r! k+ F" @2 ? mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ a( o q( E2 G. v |9 x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ h* L4 U z9 H# F5 ]( @9 f
7 u- v& J x2 T mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
" l# s0 A% g8 U8 h& ~$ {8 ~1 V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );: _( Y6 D5 ~3 {" l: {1 f
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 V2 W% `5 `7 a7 `8 s9 u: A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );8 L, u* z2 I! f" l- E+ P6 a# g
- X4 v$ \ j3 f/ E$ c
mcasp->regs->XSTAT = 0x0000ffff; 0 R) I) N6 a2 q- ?, c" e
mcasp->regs->RSTAT = 0x0000ffff; : Z0 L8 W! v7 E# x/ a
/ d' D* G6 `8 I: C7 t
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;3 z! j6 I" ]5 o9 o0 @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 l( J8 I4 [1 l: y/ ]
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# {- @: l+ z) R; t: @# [ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
! |, ?6 x2 E3 ?& G8 d% @1 E& x$ Z
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ R) b7 H+ D1 H# L/ I6 N mcasp->regs->XBUF5 = 0;% u7 Y) @9 _/ X: K( }1 Y0 R
mcasp->regs->RBUF0 = 0;8 J# Z5 P, W7 X0 {
6 R; O8 e% p; r' ]) x9 v mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
# ]1 l2 F4 \% ~- u4 w6 r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );7 q3 H8 e) b: {( B0 r9 F: \
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ r0 @- A/ F7 m% q6 U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" c& F7 s, H# {2 A. I$ p; \% L
% t$ K# G \7 Q% f4 e2 U mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; E6 } K* X% ^: ~ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, W; O% e2 d' A3 J5 a9 i
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# Z- M3 j( B% I6 j" s: A( e while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% b: Y# X% |/ g8 n, r
2 z' ?3 m0 n- ?2 q9 Z+ d CSR = 0x0000;
! p; h# p7 E& g/ b: i! ~ INTC_INTMUX1 = 0x3d;( H: n$ a' Z. N- g1 \; l
ISTP = (unsigned int)vectors;
4 G' m9 }- ? } ICR = 0xFFF0; 0 }6 r. L2 o# q3 L% z: |
IER |= 0x12; % J3 P9 y4 @1 R6 T# g
CSR |= 0x01;
7 \8 f; @% R* U& p" q' q/ }% g# [
- H9 c- X) ]" @/ ^- [6 S% r1 ^! r5 g0 S; d: ]
. v' a6 B+ a6 {, V还有就是两个输入输出函数:
$ l! U6 ^5 b5 Y7 g3 i4 ^% Nvoid output_sample(Int32 out_data), M( ?- S4 T# {; @9 H1 V: v( g0 Z
{" d- J+ z& h" E* K9 z5 l# t
AIC31_data.uint = out_data;
! t5 `# U0 W/ @, d- B MCASP1_XBUF5_32BIT = AIC31_data.uint;
0 V9 I8 l- v0 R" Z, p}7 g) l7 J/ X. a' t$ ~( ^! y0 |; Z
$ q( l5 b0 w3 b7 s, E
Int32 input_sample(void)
; q4 S# Z# B6 ?9 C9 Z" J) Q{
" L' t/ t" `! p4 x AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ c0 l# F" e ]% ?) J+ c return (AIC31_data.uint);
" Z" x$ q F3 I7 a7 P& x}- Z6 A) t" T- P0 B; S. O0 ^
' p/ S* L8 W2 l% D: r8 }8 o |
|