|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
) E# q6 r& V; ~/ }8 v* Z% U7 Xmain文件:' T- u& Z" V% W& B+ d
interrupt void interrupt4(void)
( M; m# s' \) t7 L( R' n# X{4 M" f2 c3 m4 d+ }! t
Uint32 sample;, K7 [/ A$ [, O/ U1 ?
, g: U' J% r7 R sample = input_sample(); // read L + R samples from ADC
, q6 E) H8 C8 Y5 q3 u* X output_sample(sample); // write L + R samples to DAC 5 l U4 ~# o5 k! y' U
return;, x2 X) t" E2 E3 S/ p3 V
}
d' [5 ]( q. @3 {) [
6 h. w) y4 s* O( |int main( void )9 e& s# U v) A, V1 {, J6 }
{
' S2 k$ P- o) \( s. j3 }2 n
5 {* M/ \( W/ _* I) f* Z* n /* Initialize BSL */
& x: B6 Q% ~9 y' T, ]+ @% i EVMC6747_init( );/ u' g' [0 H! p9 H8 E( l
/* Call evmc6747_intr function */; E- T/ O! u2 g% \2 O4 U
aic3106_init( );
o4 q9 f- P2 M" u$ }+ l while(1);
* c3 C5 _, _+ w* s4 W' P}! j' q. }. z( j" ]5 X
9 w+ l- Q- f/ S* b
3 q& P- d! `' T; [0 i; X# o) z- kaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 S0 O9 [$ y# l) q7 k+ h3 M
/* Initialize MCASP1 */
5 P) K% s2 ?2 {) a* X mcasp = &MCASP_MODULE_1;
) x* g% a1 o9 S* z8 A# ]; k/ E mcasp->regs->GBLCTL = 0; // Reset
5 c4 ]5 @0 f& E5 B mcasp->regs->RGBLCTL = 0; // Reset RX
$ I8 G( W2 K# x8 B! i mcasp->regs->XGBLCTL = 0; // Reset TX
* L$ W9 _2 s7 i mcasp->regs->PWRDEMU = 1; // Free-running- ^% @: T, j: [8 k1 |" H
// configure McASP0 receive registers6 _- y5 Z8 M E* ]3 }$ j, z9 l! z( O0 e1 T
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% b, f) Y- \6 } mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 m4 a- H- k+ C9 O* N. C4 y4 T mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word7 U, z/ q" M# B! y7 d
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. m# U2 e; Z0 N5 N mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 V* Y7 p; U( j: m: G% s" y mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' Z+ }: o! q5 X' W' L. g9 F& s mcasp->regs->RINTCTL = 0x00000000; // Not used
P7 c) M% \3 `& N; M+ e mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( \7 @5 P4 Z8 D7 i: s
& H0 p* U' J3 q, S" D* c' D mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
; _7 o# B% v2 b( V mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: E' S- v) E) j- V) a& W mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& }0 t1 x) L: E4 q* }; |4 Q
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
5 R: A4 o3 \- K8 A1 I mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK1 ]. S& r; K; O' S C- u4 t
mcasp->regs->XTDM = 0x00000003; // Slots 0,1! [, Z& {8 I0 J
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 t# ?# S4 Y C* q mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 N# l: r/ L; \2 y
! k4 Q/ H% E2 U+ }6 A0 u
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN# J( ~; q, U' A1 G3 V( i7 V* |; D
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT! _1 v/ i5 l0 m8 D
mcasp->regs->PFUNC = 0; // All MCASPs: M$ |' {" x8 j0 h
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1* K. U" ~9 b' M$ V
0 u0 ^7 W: @0 t mcasp->regs->DITCTL = 0x00000000; // Not used5 e7 Q) V) u" }, T/ Y
mcasp->regs->DLBCTL = 0x00000000; // Not used
2 T0 _9 {- s# Y; r M5 F, D mcasp->regs->AMUTE = 0x00000000; // Not used
9 ^1 S; W# |. t) A7 |3 {
! f3 Z9 y+ h4 f6 z; d/* Starting sections of the McASP*/
& r. i4 w- v& ]! Z2 X8 N mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 E# \: e% m$ V6 u7 ?/ M1 A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
$ C% M& `% g+ V( ]+ Q: T mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / t) e4 V& d; f: L- w& k6 |- L* }: ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( q- i, A" i) m$ {: b
' N* H3 ?: g1 E+ X* E mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 Z+ H# w" ]- V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );; p8 |7 L7 X. C
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( t$ T7 c) y& ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
" `- Z( _5 o2 U4 a
0 x) b0 s# N$ u% i( R mcasp->regs->XSTAT = 0x0000ffff; 2 w6 D5 j- q; N: g; R* q* x/ l, Z
mcasp->regs->RSTAT = 0x0000ffff;
! m E6 _9 s# C1 v; J" K5 J* C/ n
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;$ y+ ~$ d( ?. x$ Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) S3 @" i9 U5 {
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; - P7 ?* }$ p3 U' _# Y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
g) z/ R" |: F; i# i m
# w2 M3 @7 M: O' V! l /* Write a 0, so that no underrun occurs after releasing the state machine */9 z% U9 h! I! v9 ^& z) D! N( h. C1 q2 E
mcasp->regs->XBUF5 = 0;
7 M; y5 M( N! W' n; e' Z! c4 g mcasp->regs->RBUF0 = 0;( @4 H' C6 J# W8 g% }6 q
6 g" {" L2 ^ V& }2 @0 E# c1 L* X
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ; X; k/ w" [, `, ^! A
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* S8 |2 x/ Z- |, q7 F$ d/ f mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 4 @: o8 [$ o; l/ n
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
% U3 V- G6 b8 n; z0 d# L* @" k% d4 t0 t2 n) t
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& ^7 B' i" M2 i e* `; y$ t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! P! F% [5 j+ R G& y mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
7 |) p# o9 N+ V8 ^' r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, R0 \+ T! b+ [! C
8 x/ d4 V: d* z9 q( m CSR = 0x0000;, q9 L- I: [7 Z: s$ o3 n
INTC_INTMUX1 = 0x3d;
3 {/ w. j0 n& @: G `! | ISTP = (unsigned int)vectors;
7 J4 f# y" A& H/ q6 V ICR = 0xFFF0;
2 F) D- u6 u% v$ ^ IER |= 0x12;
" v3 H$ |5 J1 j) S CSR |= 0x01;
7 P" Y1 d: q6 R2 R$ S. D8 `4 A2 |
2 K& ?! P& c2 x% H3 R
+ U# ^/ q3 l; q( k c9 m7 W$ e/ h/ b) z
还有就是两个输入输出函数:
9 y V4 O3 V1 {8 J ivoid output_sample(Int32 out_data): h% Z4 O1 ^' x- r" l
{
4 z# n8 U3 x* F8 n3 k AIC31_data.uint = out_data;
9 t, x) B# \2 ~3 U0 Q! r MCASP1_XBUF5_32BIT = AIC31_data.uint;3 P( B: y; o9 ^( E
}
% b8 Z2 _9 t: ~$ T
9 p0 A0 ^7 x" G" m3 \; H% mInt32 input_sample(void)
7 k# L$ i$ W) b& d1 K{
& H0 K+ C) J( Q, e( I4 H8 p7 s9 P AIC31_data.uint = MCASP1_RBUF0_32BIT;
. U: M0 t# n" a8 c% q& v return (AIC31_data.uint);
p+ T, R3 w, b& x% b}1 I) w1 Q2 _- F3 F2 q
- m' c* F, F0 u1 U2 `
|
|