|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 j2 D$ ~2 R I' t( ]* Ymain文件:
2 L, F4 j: d* X O& e3 Jinterrupt void interrupt4(void) 0 u; e+ E# n t2 Q9 ^$ Q4 _6 w
{( d+ j: k1 v2 ?; W
Uint32 sample;% M9 A2 N2 e/ h- e) K% f. _$ D# q
" h( Q0 ~7 ]" V7 I# _! L7 x
sample = input_sample(); // read L + R samples from ADC0 g3 Y& I6 r4 V: a! Q8 s( _- _
output_sample(sample); // write L + R samples to DAC . m1 }/ G8 _. j3 I* n. s' k- t
return;8 m% j+ f' V& \! ?# d
}
; n- W/ h1 s( F4 ? _ A$ y k6 K: A9 q% }- y; S9 j" ?9 V3 |( H
int main( void )8 c- P. ?$ Y, k
{* M) j" G7 l& H
' `9 r7 ~. P/ I; {5 o$ N3 H: y8 ^
/* Initialize BSL */, m9 n" W) z C/ t: Q8 U' j
EVMC6747_init( );1 I2 g/ r6 D4 g0 E+ X( [ R0 q
/* Call evmc6747_intr function */6 g1 [: N& l8 i
aic3106_init( );$ U" H- H+ `$ o
while(1);+ z3 T' |7 `8 y0 e: r5 s4 L
}
( F$ q, }# S' [
, M1 Q( n# N; M C$ s7 r1 Z" w+ @
" B' [9 ]& ^, @1 Eaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题* [6 `9 u4 u' x
/* Initialize MCASP1 */
7 M/ T0 R/ n7 T3 e! r5 m+ h5 F mcasp = &MCASP_MODULE_1;
( u6 o8 M9 f0 g/ L3 n1 z5 |' v mcasp->regs->GBLCTL = 0; // Reset
/ o) y# `+ T0 ?4 | mcasp->regs->RGBLCTL = 0; // Reset RX
. L8 e2 P S" n) ]: E. Y- K! H mcasp->regs->XGBLCTL = 0; // Reset TX) L: m3 l$ L6 ~3 }/ Q
mcasp->regs->PWRDEMU = 1; // Free-running8 |* s6 [. x. U) l9 F7 q
// configure McASP0 receive registers8 c- v4 I" N8 i ^+ X! s
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
7 O6 R4 x, z$ l7 G! P* e/ W) b; q mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 y# M1 m. t+ t% Q# V! t5 m$ B mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word; e0 R" M1 T, t6 f) K
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 O _+ {. z) U, e3 l
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)& N6 ]. q+ I- F; u. _9 f
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' R3 n9 g+ ~ }. b mcasp->regs->RINTCTL = 0x00000000; // Not used
' A0 Q. F" r/ d5 B% W mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 N# G; X, J" S$ G9 @1 ^# ?$ u6 U: ?" E" c, x
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used# F# E/ b* d2 a4 d$ y1 x
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- t' c9 A2 f" S* D0 ^ mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
2 R1 d7 i! a* Z mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
, E! F% \5 u0 S1 [: x; k mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
( Y* B; w8 a* S* J$ b9 m* e; B7 Y* [& D mcasp->regs->XTDM = 0x00000003; // Slots 0,1( C8 U# H( x. l- {! f8 U0 c
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
( k8 B2 Z, |3 Z" c mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ S# T- e0 k! w0 S
6 l" a, b' h6 D1 C, N7 g
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) Y2 I- ?( l$ J U0 Q3 T3 a mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT/ R4 n N; J+ {7 P
mcasp->regs->PFUNC = 0; // All MCASPs; A* ]" B. x6 d- U
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1" N( O) l' i" {* ~4 Z- ]
! F' B. ^2 J8 \ mcasp->regs->DITCTL = 0x00000000; // Not used
5 U; r5 A# g+ K% q j- h mcasp->regs->DLBCTL = 0x00000000; // Not used
1 F! e9 T* l2 j0 \9 k% o- t) K! j: I. D' ` mcasp->regs->AMUTE = 0x00000000; // Not used
% t& O5 M. p y! _. h+ _4 ~
- ?7 k, Q4 h; o! Q! _$ [8 k/* Starting sections of the McASP*/
6 Q& a6 J& R( t: V0 J, ] mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 5 U3 ^; b" o# s5 a W) t+ V3 M# N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 7 w5 D0 k) ]# C5 n% P1 h, `
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
0 d3 @! t3 ^6 z" E0 I9 L2 B( V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) R: y! b# X4 H5 A
4 D. s2 P8 [6 ]1 L3 h mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, k/ w V. |7 X7 @( D* Y. n- W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );- u2 c9 y3 L/ S* X0 x. o, Y% P- p
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; , G7 \6 K+ @) m1 b# L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; t g- d7 `* g4 j
" U3 F( B$ l& U3 C mcasp->regs->XSTAT = 0x0000ffff;
4 y0 _9 c+ @ g1 t0 x/ d mcasp->regs->RSTAT = 0x0000ffff;
- j. s( M& o& U# B5 {0 F' D
' [# S: W& |: m mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
5 W X f+ p% r- \' V' s while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" `0 k/ v- R, { u- M+ i: M8 ~ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 2 L `3 j0 q R6 ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 `( S9 q1 l# `* W8 |0 P
! h9 T5 n% y1 N+ y. j
/* Write a 0, so that no underrun occurs after releasing the state machine */8 a7 Q/ T' o$ q F+ H ^
mcasp->regs->XBUF5 = 0;
1 a, A* D7 o) I5 ~5 r& k mcasp->regs->RBUF0 = 0;
9 y/ V% t5 }7 P! p- D" a6 ]1 S/ k$ [% H8 U3 A2 W# t7 ?; {5 N# v* z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
/ G# K9 e% I* D8 C; @' |7 f9 r% p9 j while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );# ?( P: l+ @$ e0 z }/ r( k$ o; ~
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 0 S* s# J2 ^( @8 S4 {
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" s4 c$ _& q1 s: U
, h9 k! G7 \! R: X" A
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; * r F \) P* {0 s: K0 K
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );. _) q. U0 K2 l$ U2 x0 @& O
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; - a4 |! O& a* ]$ L+ `9 y4 _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- m" d3 k; b1 o. y/ S; I# F2 h* {4 S! F- M" U2 L
CSR = 0x0000;: n6 P$ ?( i! R. ?/ \' B" c9 }0 |
INTC_INTMUX1 = 0x3d;' y) L, e4 d* X. L3 F3 I) U
ISTP = (unsigned int)vectors;9 n7 Z5 _( p7 X7 c9 s/ `& c
ICR = 0xFFF0; 7 ~0 {+ M/ D9 x& `0 K; M8 j P
IER |= 0x12;
( ~% U! N% ^1 c8 I9 g; W W" k CSR |= 0x01; - G, ]3 O5 s( I
2 p) I4 H# Q& H5 X- m
) s. t$ r( C7 L7 X, V `2 H o
7 s( ?- C+ F% l1 A# Y5 X/ k
还有就是两个输入输出函数:
4 r1 i7 N$ o. _% O* svoid output_sample(Int32 out_data)
# C! w& r2 s. O2 R" `, C{0 X% z' h) B% q6 m" }% s
AIC31_data.uint = out_data;
$ A- o% b1 g& s9 S6 B" ^ MCASP1_XBUF5_32BIT = AIC31_data.uint;
: a( z7 R- L: h}
3 O) |$ r% Z7 w1 X. |! n& d. K; ]. I6 ?: R$ \6 o) ~2 d2 A3 y
Int32 input_sample(void)
" E: Z/ e% I3 d8 ?2 c+ Z{
4 a# {/ m( x4 Y AIC31_data.uint = MCASP1_RBUF0_32BIT;5 Y+ z% b, C: w7 g
return (AIC31_data.uint);# _* x) a$ p+ ~% w. m/ o) J. K
}
1 l$ t3 z7 e1 c+ [; O8 d
' N9 U M; E, E$ k8 @$ f1 f/ H* O/ u |
|