|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:: o" i, N9 h: T6 d
main文件:$ G: M2 n9 K- F) a0 f- e
interrupt void interrupt4(void) ! a& \5 E2 T( U i) X7 t$ X
{1 \6 W. T/ d2 L" Z
Uint32 sample;8 [' |2 g9 \ Z" V9 R+ }; f
1 _$ O+ P+ j3 F1 V& U
sample = input_sample(); // read L + R samples from ADC- G* T* W/ m+ J# M w
output_sample(sample); // write L + R samples to DAC
3 E$ m5 u2 {5 b& V6 s' g- U1 s return;
6 `) f# m6 e4 ~) e3 l2 g/ O7 c' z& G}
* K! b6 W! J& e1 v# H. V, A. d: T7 v1 r8 \" |5 [
int main( void )! C8 i. f0 s. ~
{# z' o& _) k. Y# { |6 E C
8 V) R: e' L" Y3 V, g9 X! N8 o/ } /* Initialize BSL */ y+ v8 i" j6 S2 E, L
EVMC6747_init( );
6 b: p" j8 K7 Y! E, T7 E2 M /* Call evmc6747_intr function */
1 s: ?3 f; w" c! }" _5 D3 H aic3106_init( );9 o' h7 M) q" d- L
while(1);' t# a0 _7 H% l3 r
}( k4 ^7 R7 Y2 S3 i1 y
/ x* u0 U* w/ \2 ^: v5 a! j, O- o
3 h1 o; S* N" Qaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) u9 F! E& u3 `6 N4 }% ~( X/* Initialize MCASP1 */) F$ C) O$ L- Y: j0 y
mcasp = &MCASP_MODULE_1;/ ]& c9 C% r1 z) x( I( [& A
mcasp->regs->GBLCTL = 0; // Reset, J6 t5 [5 b8 T x
mcasp->regs->RGBLCTL = 0; // Reset RX
- J0 U0 s! Y" q7 v! V0 [9 q- R mcasp->regs->XGBLCTL = 0; // Reset TX
9 j: z! k1 t8 X: e$ o1 S( ` mcasp->regs->PWRDEMU = 1; // Free-running4 q- X# E5 v5 Z5 V5 Q* U
// configure McASP0 receive registers, _ S4 ^4 E$ [7 ^# j' b
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used. k2 K' T/ K+ a8 V% J# D) k- `
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& v- u1 A9 V: {' M3 {2 v. D mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 J+ ^/ J' {, U) @
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)* T6 M( s) `. ^- [7 h; v
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
$ ~2 O6 p0 R5 F4 e8 V9 P8 l. [ mcasp->regs->RTDM = 0x00000003; // Slots 0,18 S% ]; m- M5 } l, D
mcasp->regs->RINTCTL = 0x00000000; // Not used
; I& z" U% p& z" B mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. U2 V4 x, I: o* a- N3 D/ e" n6 e7 k# I3 m# X; Y, D
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
9 k# T' p, A9 @. i8 Y) e% P8 Z mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; Q& b1 s7 w# Z7 |! t mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& K0 ^* s* T7 E" k$ ~, O: @* j0 G
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: c+ o* n# r' N4 {, i
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
: H$ `# z4 J( O. f* G3 p8 I# P mcasp->regs->XTDM = 0x00000003; // Slots 0,1% n) m( C5 a/ d+ \6 ~$ H$ P
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' t% F; ^( j- u; y: `9 Z mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 P5 I# s+ K2 C! `4 Y% z3 v3 O, o1 O$ r. b% x
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN( w2 k, G8 P8 P
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
4 t- g5 k2 x5 F) O5 a' T& ^) [' n mcasp->regs->PFUNC = 0; // All MCASPs' |3 H. z* W9 Z% [
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 N* Q! z: G$ v0 L" Y; w) Z/ f0 l' a9 Z" E( F$ D# z- p
mcasp->regs->DITCTL = 0x00000000; // Not used
; A- ]* z' Y4 E3 r. m mcasp->regs->DLBCTL = 0x00000000; // Not used% @ F0 h! W7 x
mcasp->regs->AMUTE = 0x00000000; // Not used9 y P" [0 u* q% H
2 U- l' q8 w/ R$ S- A- C% I/* Starting sections of the McASP*/1 f/ p1 t& }) G; y
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' B8 q3 P. b! h; i) N while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); * n3 Q7 K6 M8 M5 H' B" h
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; % ] h4 U9 T. r. x+ G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 M1 f8 X8 \9 t9 @1 I
9 e' |/ r! t' O- Q: x9 e# E
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 s! y) l x* @$ l6 V: a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
* y' E: p% N! A3 b: d$ c mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
: v2 U5 x$ i2 Z# x0 p while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );; a; H# a" S4 V% K
/ O3 x2 Q# q8 E mcasp->regs->XSTAT = 0x0000ffff;
4 }7 T7 h- z6 J9 ]: Z) r mcasp->regs->RSTAT = 0x0000ffff; + d* @" X7 V" D: X3 a
7 ?7 e& I5 }6 l$ f# `5 w
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 R$ b! u6 G+ i* a- ]
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, `8 ]% E C% v0 Z" u mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% K, x5 {! @0 \7 C) }$ s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
8 C" E" O g1 k. o% F/ y+ S8 |/ s
7 ?) }" q ]) w. ^6 I /* Write a 0, so that no underrun occurs after releasing the state machine */4 b6 M" i. ?! ~$ K8 U
mcasp->regs->XBUF5 = 0;7 \' W j% A5 d, r9 @% X! M; k( }
mcasp->regs->RBUF0 = 0;' m1 Y! ]1 U& F E! x
0 ^5 N2 C6 @2 |8 A& @: M mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ^3 n d9 d8 b" x2 a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* j: L( ~ D" l0 n9 l+ {- g# @ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
. @( W2 D& b5 @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 u# N% F$ Z8 Q# _8 m" I6 y
% q8 |4 y* Y6 T1 {' v* u mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
( V6 J3 k6 ]6 k: W# E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. \8 p1 d( }# c- o0 J. {6 I
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 0 |) g& U3 s* M/ S7 U6 r+ M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
' A2 x" D. g9 k, [, J# k/ E/ k( C3 D1 b. |* i' S
CSR = 0x0000;' f6 w- P n/ M
INTC_INTMUX1 = 0x3d;
+ Y) m- E5 \% D* q8 y, \* T ISTP = (unsigned int)vectors;, B1 U$ g; E5 B5 d
ICR = 0xFFF0; 8 t9 A* | x8 b4 A
IER |= 0x12; / w3 F* j* _4 N7 _
CSR |= 0x01;
* Y; [0 V! |$ l7 Z, L. @2 z
. R8 W* j" W6 l( |( C9 g8 H2 C0 A# H1 n0 }' B' A6 k4 _
( L+ T! o# Q) O2 C% d0 S. r) P3 \$ J
还有就是两个输入输出函数:1 m1 B6 U' O, j/ u$ I. L1 b0 [
void output_sample(Int32 out_data)
% i5 n0 a# ]; `" R$ U( `{
& {; \' U/ M$ ~" {. T AIC31_data.uint = out_data; + l$ {4 Q7 m9 C
MCASP1_XBUF5_32BIT = AIC31_data.uint;; C6 D& D! V1 N& G
}
& H% }; k/ w1 F! g9 e1 b. y }6 V4 D( e T3 `2 |; |6 S
Int32 input_sample(void)
3 P! u/ k/ l$ a# f4 {5 T{
+ O! E8 D5 P3 j3 [4 a AIC31_data.uint = MCASP1_RBUF0_32BIT;2 e. X: n& M! v4 a
return (AIC31_data.uint);+ K" V0 G3 e7 J0 f0 E+ `. D7 b2 e' B
}
7 Q1 y/ ?7 W4 Q0 [* X% b K
9 ^" A1 z! q( w2 u& t |
|