|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
1 l# Y- L" P3 E# Amain文件:
5 A# }" E8 Z" P9 `! \interrupt void interrupt4(void) ) y& O9 [0 E6 W, j; T* z3 U
{9 S5 m+ D( J# d+ Q; l" {4 {3 k0 y
Uint32 sample;
5 g: p' ?8 M/ z% [2 F- A! Z( ]3 W, @9 Q
sample = input_sample(); // read L + R samples from ADC
! _; p& E* L! c4 ^' i' d" Z, T output_sample(sample); // write L + R samples to DAC
* y5 R* b& J) J return;
+ r4 l/ p' ?4 t- e( ~+ K4 l. Z2 E5 z}
0 D, r" m, l# g; S: D* ? K/ R' R% B) _! V2 L4 G' K
int main( void )
6 D% Y) W# H7 x: S{: s$ F) e1 g5 t4 u
) _' r6 g* r0 D+ A# g /* Initialize BSL */
$ d) Q, B7 c6 z5 @( |/ ?5 e1 Q EVMC6747_init( );4 v) f9 p/ _! k o7 C4 @
/* Call evmc6747_intr function */
3 v, z! f% k2 F A5 W aic3106_init( );
( d/ R6 w& X; z' }" W& S& g while(1);: V6 T6 | Z7 i8 y' y
}
5 u6 T: s ]- X- u% p$ {
: Q6 P8 d/ O$ d: Y! E8 S7 M$ j" H2 N
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 o: f5 o/ P" z7 d) g4 _+ p
/* Initialize MCASP1 */
- J4 [' Q4 Y- o) K; }/ Y5 g* K" w6 A mcasp = &MCASP_MODULE_1;; c3 z. [0 y7 H$ h
mcasp->regs->GBLCTL = 0; // Reset0 H$ V" n6 s. p/ l1 Q9 C2 X
mcasp->regs->RGBLCTL = 0; // Reset RX
+ c' Z& |( k& s i mcasp->regs->XGBLCTL = 0; // Reset TX
; C% s3 `/ F- J i mcasp->regs->PWRDEMU = 1; // Free-running' c: f/ A! [# M- k1 z* W+ U; T
// configure McASP0 receive registers7 Y/ T5 ~$ x: w* k1 ?( r. o
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
. \% W/ U* Z- N. N' ? mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 b- R# ^5 }9 F0 Q0 A mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word: ]7 P' a5 {! D9 F' L
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
8 X( I* |# V, @. [; M5 k5 b7 k5 |- ` mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
# p% f9 Q8 r8 N- D! @8 D# V mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) m \* X5 s, K/ u mcasp->regs->RINTCTL = 0x00000000; // Not used
- ~3 M+ e% i: K" @4 c( M$ O3 S7 L mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 r5 E9 ^7 s, a: }7 C2 d3 x. ?) h6 ]/ E
# R, I1 ]3 w8 ]0 J- t2 L) q
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
6 G- o& E! }3 A$ F5 E' T1 A, R mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' e3 s6 x* V" G* b$ J5 K) o9 q+ J! [
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
0 \$ w$ m8 ^- i1 b/ P0 y M mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
n: t: J6 X/ K) n2 d mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
7 `0 z6 T- ~% ^0 J/ N mcasp->regs->XTDM = 0x00000003; // Slots 0,1* R) s9 d2 ?! o" s" B
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit" Z6 ~4 o' ?' R' }
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 B( {4 Q- V# S$ x2 t, S
( s3 o! T6 r5 f) k( ^6 U, r# t
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN* R% j" ?( K5 L& O+ A8 d
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
o0 [9 ?- O# f0 O+ z mcasp->regs->PFUNC = 0; // All MCASPs; a2 A+ G. J, o4 t0 H6 t
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX10 r$ b% \0 V3 V+ w. W0 ?! M
# P7 g" R# ~0 m$ Z mcasp->regs->DITCTL = 0x00000000; // Not used
; b/ E2 e' P' t) F+ q$ d mcasp->regs->DLBCTL = 0x00000000; // Not used
" d" u( R9 ] E/ _4 t9 w) g mcasp->regs->AMUTE = 0x00000000; // Not used3 W, A6 J$ B S( [. W) [2 ^# ]
6 i v8 P0 m% @% A2 }( Z9 g
/* Starting sections of the McASP*/
/ [- d4 M$ z; J5 j" W& q& ?- t, i mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
8 p3 g8 t: t0 I) O! \( } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ' X; N% d. M6 q) G6 _ a7 ~
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 1 A+ j9 j6 J0 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );: ~/ r( O7 }& `4 T# Z
, Y0 Z$ W% p. Y. `1 t- [ ~
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
- i+ X, }; [8 I$ ~: ]1 } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 z. Q4 ?3 K3 u
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
- g- R! ^4 W/ ^0 U$ f while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
) E4 |* i l9 W# e+ I
O) ?1 ?- D7 Z mcasp->regs->XSTAT = 0x0000ffff;
7 b3 D0 B' y* y& ^* p s mcasp->regs->RSTAT = 0x0000ffff; 6 X+ O3 g" Z( U6 R6 P# f
8 \# H- d$ |8 i2 u- J6 Q% C
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
" m9 l3 L, l! J+ W7 v while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );, O) L9 `2 x. s8 N
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
8 X# \& E# ^, p2 t while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );! U0 u# ?, u& N' A8 W7 p
: p% U+ } A3 k g
/* Write a 0, so that no underrun occurs after releasing the state machine */1 v9 f6 M4 {8 _4 o; [; }9 c/ j
mcasp->regs->XBUF5 = 0;
6 }3 [' l: a1 }# f! K( j; g8 j) b mcasp->regs->RBUF0 = 0;
@- `8 I% t, Z5 q% W ]% w) |0 Q" f2 U7 J$ m8 D* u& `: b3 I
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! I" ~2 Z2 }( v* m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );* \ X, o* {. ] X* h$ Y
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 g0 \# y& @7 ~7 | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );$ h# N; X1 M4 z$ r! P( @" R3 {/ M! d. G
) a/ ]+ c) E R% v2 s2 r' X mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 7 f9 T5 E, P7 u% o6 D
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' v& u1 [! A; y mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 z' x: K9 \$ |# @* @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# b4 _5 `! k3 D: [6 `% V, x1 L8 s$ L8 `" N9 u
CSR = 0x0000;/ s8 T n) _5 }$ V) f& V
INTC_INTMUX1 = 0x3d;2 c4 W" ~, B2 h4 B! e6 ]
ISTP = (unsigned int)vectors;, m Q: [$ ]4 E( l' T/ y1 x G' q
ICR = 0xFFF0;
) @' r( ], X. G IER |= 0x12;
/ X6 Z+ l* n. H% u7 a CSR |= 0x01; A$ v1 x4 d9 x$ [/ W6 {# k$ b
% B. F j' H8 y) ]# S/ z
& O$ V8 f: t% M' O# b7 @: A1 B9 K9 F' L
还有就是两个输入输出函数:
) k6 i; K+ }- o+ w6 t, I2 i9 g+ [8 ]void output_sample(Int32 out_data)
. Q) ]& q% o5 g: m q. j6 ^1 i{
& ~5 y4 a I! w3 l$ T- d AIC31_data.uint = out_data; 1 I4 u. Y @) z( z0 r. v: L# s
MCASP1_XBUF5_32BIT = AIC31_data.uint;
2 c+ }, c2 |0 o: h; ^}+ J2 ~' F+ }, s- K
; A I8 F" ]6 D7 K) n8 B& u) mInt32 input_sample(void)2 ^) q6 l( P# T/ Y9 R l
{
9 w/ f7 o. R! A8 |9 z AIC31_data.uint = MCASP1_RBUF0_32BIT;" D* D3 D2 D- ^) I! m, o! y8 \
return (AIC31_data.uint);
d8 i; _4 H9 |5 a: C} T; ~1 z( h D p" A' F
% c }. j; I5 h: Y* X1 I" \4 D; v; B0 B+ { |
|