|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:9 o/ N4 M1 W' h5 J8 f7 N; I, Z9 x+ O
main文件:
' [/ }3 Y T/ a" L! x' a C" B. ^# `interrupt void interrupt4(void) . E! Z. W: w* P
{
, T$ l& j I1 k n Uint32 sample;6 }3 B9 o6 E; j
3 N$ Q7 \0 x0 V; g2 B
sample = input_sample(); // read L + R samples from ADC
. n' |: X" i4 _' M; _ output_sample(sample); // write L + R samples to DAC " W: \7 Q6 |! M0 Q9 B# o: [
return;. S( }2 f+ o0 J& d1 r
}
- b4 O4 D! H$ E2 t$ ^; Y4 O4 n7 r' E( t
int main( void )) |$ z% F! r6 X% H, |
{. b$ C1 a0 `8 z1 _
0 ^7 Z' L [1 C+ @- A: d. m1 z8 ?; m% u /* Initialize BSL */6 Z% r* O; D* d& ^
EVMC6747_init( );
* U9 K, w" A" \* x6 W1 r /* Call evmc6747_intr function */
" m+ w6 \/ R3 j0 S( {1 U9 Y) H aic3106_init( );
/ ^0 V+ y: Y7 J. ? t" U5 l/ z; R while(1);( ]; F x* @; R" }" `% ^
}) J& {. x$ Y) g% w; `5 F% S
! m l: m/ E8 y6 G( {& A1 c! K" A8 [) @ a7 ^7 B9 h! r2 Y, H
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# D! A, ~9 y- @8 @0 A6 f$ b8 v/* Initialize MCASP1 */
1 q+ L( C5 k& H' l8 C mcasp = &MCASP_MODULE_1;
) A: u: W9 O. h2 A' W% ?: s mcasp->regs->GBLCTL = 0; // Reset
$ G4 n. Z9 M4 e mcasp->regs->RGBLCTL = 0; // Reset RX. j; U8 |% v- N& ^ W& y
mcasp->regs->XGBLCTL = 0; // Reset TX
j$ [9 n' c. i% t( R mcasp->regs->PWRDEMU = 1; // Free-running% C# e* ]+ m" \( ]& X
// configure McASP0 receive registers
! L( c! |! e4 v- O+ R3 ]% g2 C' h mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used9 E0 C1 z V0 b" b
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& v% m) A' @1 Q mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
+ e- j5 A) D: L7 n; S0 T mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
$ J! P( O& N) \7 L7 L7 m mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
' A3 u1 {: [+ E& O1 p9 @; v% F mcasp->regs->RTDM = 0x00000003; // Slots 0,1! S7 c$ O# t) E- g9 F# \- U
mcasp->regs->RINTCTL = 0x00000000; // Not used
& `* `0 S/ [* G$ U( o mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ R& d% P& O0 f( z E" @# C9 S+ h8 `7 u+ n8 [
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
5 K: S5 J$ F; ^3 m; ~2 `: z2 { mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% V2 {- b) O7 p! Q. l0 H" o9 n; R: H
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word# G" D2 m( z6 S6 v" k K! P
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 ^ [: H/ r( R- t" w# ~. A mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK1 N n1 H* n+ n6 m
mcasp->regs->XTDM = 0x00000003; // Slots 0,1/ _$ Q. M& w$ c% d0 ~$ G6 f5 J. b
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
5 t8 z3 U4 c: y3 d5 s5 l- [* s% ^ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: M2 Z i7 p! T& v3 J3 o( W2 c, y5 X
4 K! d3 j" }1 k& X4 P) Z/ p* i mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 }0 m1 |. [# B, `- \7 z* p( A mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT: e2 t* l3 R/ F" w, u" A6 S6 C& I
mcasp->regs->PFUNC = 0; // All MCASPs
0 E/ v1 W! x3 C+ l- ~# N mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' B7 n) p. U' ^! w6 a, t7 J
! I. A6 X1 n. u- a2 k2 X8 q3 v mcasp->regs->DITCTL = 0x00000000; // Not used9 F3 P E% Z2 s$ j) `4 U* v
mcasp->regs->DLBCTL = 0x00000000; // Not used
0 r2 }3 {/ `: N4 f J" s! ^ mcasp->regs->AMUTE = 0x00000000; // Not used
% r& B* g3 ?5 S7 a2 v. O3 C. J1 g+ ^! ^, e5 e
/* Starting sections of the McASP*/
1 t0 Z" t$ _$ {! V mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; / j8 n% `4 d! h, I2 u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); " P# v. T+ f/ f- R8 j: V# J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 9 P7 z2 o: n& n, T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ o8 b* K2 K3 X# n
: B9 F% R8 ]/ k+ k0 S mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 Y% T- E' F; A; ^ Z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 s: O) o/ D, V6 ]! i9 z" u! q
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& U6 }+ y/ X1 I$ G8 p; i while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) d9 q& D, x1 R$ l
5 i$ o. F. V% ~/ f. E! w/ h' g& H. V mcasp->regs->XSTAT = 0x0000ffff; ! |4 n7 }! ^4 f8 `9 `. _
mcasp->regs->RSTAT = 0x0000ffff;
# |5 K/ h- H: K5 S* J
2 p5 O, b4 M Y+ U4 y# ^0 N6 J mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
! v! v! u7 a1 X4 Z2 S while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );8 c! e* ~; \, U" ] A" ^6 D! U
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; . k0 H' k0 V0 ]( h* d) Y% A4 P
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; f k+ z Z9 Z: i- d6 D
J2 g. H0 G! r9 N /* Write a 0, so that no underrun occurs after releasing the state machine */9 W4 E! E5 A) y, b' h
mcasp->regs->XBUF5 = 0;
* p% ~0 N( O. R1 M% Q# P7 v mcasp->regs->RBUF0 = 0;
# w% R: `: D, r6 D4 J% U. F8 v2 E
+ T& H- P( j( ~( c' h/ Y mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" r( y& z- ^: {8 W while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );4 ~# h$ y3 J, P% `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( s! o4 G, `2 C" v: J% N while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( H+ R, P' f4 M0 R$ f
) B5 W3 J5 g& }% z6 d1 m
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; Z' w; r" J/ D$ c
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );* M6 f* J1 |4 b M
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) Q& F% p# s$ r; g9 M8 X# g4 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );5 j5 e* w# P$ \* e! C( `
- e: E, a! I3 G7 @) X0 _# c CSR = 0x0000;
. v# W! a' {0 {. r; g+ Y8 u' a INTC_INTMUX1 = 0x3d;8 X0 T. ]' K% x0 ]2 V% }
ISTP = (unsigned int)vectors;
! z- }6 c1 p2 d; e' ^ ICR = 0xFFF0;
- u/ Z. d7 ^9 p ^! M IER |= 0x12;
; ~ |4 j5 n6 H7 F0 a/ n/ ^ CSR |= 0x01;
6 b0 C/ T* M- S( Y! i
% }6 d) p/ T; R) M: L8 A1 U! Y4 e6 o. j
& F0 U3 h$ F! u6 {8 _4 i还有就是两个输入输出函数:/ x5 T: a5 k1 F) f7 p! y
void output_sample(Int32 out_data)$ `6 G7 t8 l( }$ Y: P
{: H% h0 P5 B4 `, A
AIC31_data.uint = out_data; " ~. M% n# R1 o9 X
MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 r5 j0 c7 U% f: [4 d* G/ c}
% t' _3 }3 v* B2 \8 c
1 l% p! {5 [' h- ~$ ^( pInt32 input_sample(void)& i1 p# T; g7 z8 t
{ 5 O( ^8 M3 p& H6 K1 X9 i5 f/ R
AIC31_data.uint = MCASP1_RBUF0_32BIT;5 `5 r" Z" D1 C7 r \
return (AIC31_data.uint);
! c/ K# m& |: u1 q}
- s6 M( A- I# X) o. _& Q( h! j( }# z
|
|