|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 V1 ]6 l# R' o2 n& k$ W! umain文件:
) L. q2 i% l- s. \( _6 b6 zinterrupt void interrupt4(void) - Z- K* [' ]- u
{
' e+ S+ ]' T: i, d. m H3 p Uint32 sample;
& x" b$ N; v6 f6 V s, Y; i5 D- u( `2 @9 F/ z d
sample = input_sample(); // read L + R samples from ADC
8 i( F4 M O( d( x output_sample(sample); // write L + R samples to DAC
0 Y; x' l7 e- A2 U. r: m5 l return; f( k% v0 D* r
}% S( {- V; F7 ^; T
5 w& @% H' \3 N7 _7 [1 o4 _( d+ m' O pint main( void )) B0 ]$ v2 V! p* `4 C# z. A
{
. f) ^% g* t5 A. R8 J- Q5 q o; h0 R$ F V, X
/* Initialize BSL */
( U$ n5 f% }* U; s$ W6 J; ? EVMC6747_init( );8 p$ W c& b; x/ z, {$ U2 |% L
/* Call evmc6747_intr function */; n* e5 {9 f, x+ N1 Q
aic3106_init( );
; J1 W( e$ i" k while(1);
, m! h4 }/ i1 d9 q& \3 `0 j1 t# P& @}) A( G2 P! U# ^% I8 {! s2 j: p, R
" l' K0 _4 @% p4 E- [6 M; N! A
$ g! K! N& ]( k3 ~: v; j
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
0 b: u/ T+ ?/ Q1 n' N. V/* Initialize MCASP1 */
% R1 c# x* d: ~# E9 _$ J mcasp = &MCASP_MODULE_1;
) e+ q C6 u7 ]) Y+ G. v& p8 m mcasp->regs->GBLCTL = 0; // Reset
1 Q0 S. m6 \1 O+ S4 @% d" ?/ x! F8 O mcasp->regs->RGBLCTL = 0; // Reset RX
& W- x' z$ q8 k7 C8 n mcasp->regs->XGBLCTL = 0; // Reset TX; D; L/ T: a% o( A
mcasp->regs->PWRDEMU = 1; // Free-running% }" G( h; v; F4 q, v% S4 e
// configure McASP0 receive registers
9 I- E) g: `# W mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used4 F& h" {: F" d* ~$ i0 @" T
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: B; e9 Y( r: J7 D+ R& d6 a
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, c6 l$ L8 s& V+ k" j0 M mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 J& z( u! @: K2 o; p
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
9 ]# u. [+ z9 Z- ]% c M1 I$ I mcasp->regs->RTDM = 0x00000003; // Slots 0,1% S& n# j6 ?0 k {7 b
mcasp->regs->RINTCTL = 0x00000000; // Not used
4 s/ \" C6 n( b9 n! D mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: Q" L3 S" K8 ^/ n! q6 T2 b
: Q5 Y& Q3 P- @9 K/ w! L mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used5 R& E2 v6 e7 P! Y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) \1 o7 E9 Q9 W& z8 r
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
. u0 Q1 M3 m3 D: [$ K mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 b- q0 ^+ Q) w. ]' U$ K! x mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK# q% R! b h( `" f5 P
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
( ?, G. v" M3 l5 C, w( x' b mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit4 s% G" [* c& }0 ?& C: |
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 ^9 V2 q/ H! ], r% W# \: q
1 \' g# s7 Z9 V. f8 I1 i5 ` mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 u" q: [ t6 N7 `- @ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
, n( j/ l7 y9 b) B3 U- z5 h mcasp->regs->PFUNC = 0; // All MCASPs
( Y2 W7 p& S* w" t mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1, F4 e6 M5 H/ g0 u" q5 Z
9 r& _5 U# o- P* C. R mcasp->regs->DITCTL = 0x00000000; // Not used
+ L. G+ m3 t. `6 V/ y mcasp->regs->DLBCTL = 0x00000000; // Not used6 i$ ^% b& e9 n9 x& @ X
mcasp->regs->AMUTE = 0x00000000; // Not used' Y" i _: ]; Z1 v+ R+ v
9 w w s/ [. i$ E5 W/* Starting sections of the McASP*/5 A- d5 [" z. _2 G% I# }
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: S$ S: D8 }/ ?( K4 a6 M while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); . h# ^# V2 b! O0 L
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 0 f+ y4 Z2 ]- }6 \5 ]
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );0 H _7 x% L, x" _$ v3 g
8 m( n/ p& v! f. `8 i# B
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) u! s% {+ _+ @4 C2 g1 e+ a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
0 A7 l: A6 M0 i mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* |; K! L9 f! ^' U' f! h2 m# x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
7 d' T8 E4 w) A5 G% }$ W: X9 v4 Y
mcasp->regs->XSTAT = 0x0000ffff; ' |! t# m; X5 w
mcasp->regs->RSTAT = 0x0000ffff;
* O; |6 R- r9 P- D6 L6 J4 G3 {
" @- \& G* `6 K% p. B/ I% R mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;; W" `; E4 R( M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );, H( e9 h+ { i
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; : E- i1 |4 i& o# @4 u) y# X5 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 k' @4 K6 b% @, [6 I; f) y' E D
' N1 X9 S# r& p' H% n; M7 O# n
/* Write a 0, so that no underrun occurs after releasing the state machine */
( _3 C' |) n( y# r& V mcasp->regs->XBUF5 = 0;7 w' Z9 H& ?1 [# G! H
mcasp->regs->RBUF0 = 0;
" S) w1 n0 T( K/ A, T) c
% b0 S, S7 U+ W: K. x8 E mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; / I' R! U* I/ i5 q) \$ W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );% \% w! R8 a* v% r! M
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ( ^# ]3 ?" r. S* j, I9 k6 `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );; O. E8 S, E( v. r( |/ Q% A, D
, Y: v" y4 p: z7 x4 O9 i& M% _0 Y mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; + w% y& F; A. L6 Y' T+ \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
9 x0 M$ k2 N3 g3 p9 S3 a mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 g( b" M/ k4 C9 Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! {% C5 k3 C9 l% [2 I2 @$ P, h" }( d1 F2 G3 j
CSR = 0x0000;
( d( I+ e4 D0 W+ y$ R6 P: J c INTC_INTMUX1 = 0x3d;! g$ j/ Y* ~8 O6 h( L
ISTP = (unsigned int)vectors;) v6 \ m# Y4 M. _
ICR = 0xFFF0; % L/ L& h/ }& L" f
IER |= 0x12; 7 a" ?1 c$ J( A; ~4 J$ q
CSR |= 0x01;
: `" D( t3 q2 U/ h1 z$ } z3 r4 }
9 |+ U) p6 i5 p! ]
6 I9 f, b# f9 c4 v0 `1 \% ]9 N& G; ?" i% T" J: K
还有就是两个输入输出函数:
( J$ g% B3 k3 x& g9 B% Jvoid output_sample(Int32 out_data)
+ d8 w0 L' T3 F4 G7 a{0 E) e0 g( i& Y. i
AIC31_data.uint = out_data; . m* M1 C1 i) Q+ g: v3 h
MCASP1_XBUF5_32BIT = AIC31_data.uint;
( a! r, R% y/ W* T; V}, h( E1 [; Y- s2 [4 ?
" Z4 s* z# Z* gInt32 input_sample(void)9 f+ V) \- {2 V# ~1 S* E8 M
{ 6 u1 {1 d9 b3 m6 S; t
AIC31_data.uint = MCASP1_RBUF0_32BIT;
; Q; J: z$ ?7 ]9 ]# G( u7 G return (AIC31_data.uint);
- X- D+ `( V7 i1 }( @" N}& P8 q8 S7 J& f5 Z: R; N. `
7 t3 f) ~; q2 M2 k- j a. K |
|