|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:5 [, ]3 Y+ r9 w1 B6 O
main文件:3 F4 [; Q2 V; I( j6 u( G$ F* |
interrupt void interrupt4(void)
- T; r* q( W, C- d0 d; t{! |7 V4 B8 Q0 X
Uint32 sample;# I N2 Q- S) z
5 ]8 L' s, p' y* G! X$ h8 O sample = input_sample(); // read L + R samples from ADC
0 G- |9 ~6 t4 `4 k9 O1 @ output_sample(sample); // write L + R samples to DAC 5 t* f5 V' G) [4 E, O
return;
+ K1 M% C1 K0 X/ I1 O. ~}
! n+ c( ^+ ]% ]# O
' `2 \9 a% B3 P8 E+ Dint main( void )0 [3 U/ }: f1 G
{4 x; y1 @; i+ g8 \( Z- i+ h* Z
A7 l6 L9 q0 Y! s8 K# ?8 D5 _3 p /* Initialize BSL */
* }1 Y" o* L- j. |6 {% e8 \& A EVMC6747_init( );
0 n1 t! O4 g4 C% |+ @" z7 u, B /* Call evmc6747_intr function */
* @6 x0 ]1 Z: W; G aic3106_init( );
1 j5 p$ Y/ j; b' {$ [ while(1);
7 I' L5 b L4 E; I8 Z' I. c}1 ~+ J% x5 _1 Z2 \0 V
1 J, m) u( P! b4 K9 Y" ?5 z, g' q0 L( v* S% Q9 {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 d8 N* j/ h! b/* Initialize MCASP1 */9 d- T/ L, u9 d5 ?) l7 E
mcasp = &MCASP_MODULE_1;
6 l* S# B$ s% ?2 ^6 ?( N# ` y mcasp->regs->GBLCTL = 0; // Reset# K& W4 ^! S4 E" Y" a7 k; d
mcasp->regs->RGBLCTL = 0; // Reset RX
, _% ]* P9 N* t' q! |, Y3 n mcasp->regs->XGBLCTL = 0; // Reset TX
. f3 Z; y6 @: L9 F% z# ]3 q0 y ^ mcasp->regs->PWRDEMU = 1; // Free-running
) K' N3 s- f7 o3 P4 q2 o" | // configure McASP0 receive registers! \! b8 q* O# g$ _+ k
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
' F* ~6 q x* f mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% O {# {3 v1 }! _
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 O8 i4 A& p2 v# P0 Z: | mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side); A! G2 a, T4 i* U% y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)0 ^) X+ @1 w& M. B& s- C
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
6 o8 ^" n/ X: N' z$ {# |2 @0 d mcasp->regs->RINTCTL = 0x00000000; // Not used0 B' p8 w4 t6 c, Z- S: @
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% e% s, Z' ~. ]6 w& E1 p) {7 G, v( S5 ^; t+ P. b# G
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used& s9 e$ Q6 _+ d
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 E6 t) N) [* P) X mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( K+ V/ K. t5 k6 Z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: v* L. W7 Q' C2 p
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK* F4 {2 b: {; z& r; O5 _ T9 S
mcasp->regs->XTDM = 0x00000003; // Slots 0,18 x! \, s7 f% @5 m# n- L
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit& H7 o6 t+ M; P! D4 W/ K
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# c1 t' e& d9 a8 B" y0 O0 n6 z
$ x3 F( J6 G: [) E7 I
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN; p! p$ B' f& O* a, W/ J
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
# k: P$ y% M g* ?$ s1 h mcasp->regs->PFUNC = 0; // All MCASPs/ }! E7 g1 @: L# m( c6 @
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
% O9 s* }( j" H. H. d" h3 F2 S. i4 _0 s# I
mcasp->regs->DITCTL = 0x00000000; // Not used3 y: F& b6 w6 i8 n* |, i$ ^7 }
mcasp->regs->DLBCTL = 0x00000000; // Not used
1 o, h9 H# U8 m5 W9 n9 Y2 | x mcasp->regs->AMUTE = 0x00000000; // Not used8 p% A7 W7 ]! \( b' c
7 E+ d7 f' ] w/* Starting sections of the McASP*/* {: F* E( ]+ Y2 U$ C
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 7 V% n# F0 b* ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); / k& V5 K: u3 D
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 y2 G1 I) A1 G& Y6 e% f/ p while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
8 p/ Y) V- x3 T& m* Y
6 Q8 e. Q* Z$ f% x' K1 J mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
+ g. V9 x Z# H0 m6 [ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& S, Q3 O7 x9 f7 l5 ~1 X! q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 8 |4 E2 `" a3 x: v( q2 a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
# q+ N6 m$ h7 ^4 i7 b1 v- `( a$ P1 n1 b1 x, N# j+ C
mcasp->regs->XSTAT = 0x0000ffff; ' D" m4 M6 }7 `# v4 o- V
mcasp->regs->RSTAT = 0x0000ffff; ! l/ \" U6 \" g; ] g8 A
* D0 Z a0 S3 q9 y9 F# Q# Y3 e
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; {; p' @4 o+ ?7 W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
+ p+ _& B1 s) D q: }) a1 C9 D mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, v4 K& s& }7 c while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
5 i% N& H0 W+ t Y& W! @9 S5 d9 |0 c& H
/* Write a 0, so that no underrun occurs after releasing the state machine */
! X6 u5 C8 z, A) @8 O. Q mcasp->regs->XBUF5 = 0;
N& o$ D6 ?6 N) z3 d3 s* f$ q/ S mcasp->regs->RBUF0 = 0;' i" q: g/ ]0 C+ F' g
2 D4 D! [8 `8 p mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' w3 ?; U4 a: d% c$ N& A7 |8 A- G4 m0 P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% n/ K* I& L( Q& V( W
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; # E {0 x I: @* J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );! b' r/ \' m+ d
6 C; ~ K! L B1 m& i mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, }) N; G" D! T+ `7 V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );% Q; f, C; y; ~# `7 e2 O
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ {" b R, ?# W/ \0 x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );1 S- J9 }0 Z$ Z) t9 S
" }! H7 k3 I3 q1 ]& `
CSR = 0x0000;
b* {- m3 N) V( ?0 G$ e2 Q& v INTC_INTMUX1 = 0x3d;1 M' H1 X- d" n( o% M: |) R: S
ISTP = (unsigned int)vectors;
& ^4 g0 s4 p3 L+ S- g0 V9 O" d ICR = 0xFFF0;
# G. I& a. t" y IER |= 0x12; 9 J3 `7 C# y2 V- [ r
CSR |= 0x01;
# ^: r3 A& k4 `7 f9 q# H9 ~
! f U ^6 E# u/ } E
3 E4 v4 ?- }2 \9 M g3 Q; |5 K: h$ |( t; V& q
还有就是两个输入输出函数: _5 N+ G$ K/ d! i5 ]
void output_sample(Int32 out_data)3 ]0 u$ m3 d4 g R; M
{0 w* o0 U9 [( g# T# @9 o
AIC31_data.uint = out_data; 7 [" R3 b* o% v6 T4 ~( F
MCASP1_XBUF5_32BIT = AIC31_data.uint;! h- U" A6 n, c; N
}
* ]8 c1 P7 ^8 I. @" h0 _
$ w( [2 O6 |! DInt32 input_sample(void)
1 q6 {/ ?# ~. N7 m" Q- B; g{ 4 p- F0 @. k4 R5 o$ n+ t
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ ]. O. Q. d; X5 u9 K return (AIC31_data.uint);
: i: I+ ^' v, `1 H3 g6 y( R}
9 } I7 p$ C$ D: ?
( R, T& n; a/ ^; m! b+ j |
|