|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
( {+ P: o1 w" Smain文件:
h, H7 W% T/ J V1 I! linterrupt void interrupt4(void) 6 P' G6 c1 P% c+ C' r* R
{2 }0 L. P. V1 Z7 X( K- I
Uint32 sample;
" U" S; f! K& b# `, h7 z0 n' s/ i) D! j4 e0 l2 u. R+ {: g) D. l
sample = input_sample(); // read L + R samples from ADC
' c! S; ^8 m2 i! }- p8 B output_sample(sample); // write L + R samples to DAC $ H* }" L* [' \6 ]; U
return;& g9 v# x, P6 h) o9 i
}- c5 B" S* J6 ^+ j5 q: _( i/ `0 c
: T5 m2 |. `; u& `6 c+ rint main( void )5 n$ j) d5 M$ x5 s2 I n
{
' T9 c J3 @% z( j0 D% i4 V% B
2 A; N8 n& [$ D; B Q F* a /* Initialize BSL */! C& g c: ?1 M& ^" \* a
EVMC6747_init( );$ b" x7 e# L% B6 a+ n
/* Call evmc6747_intr function */% X# [: _/ V2 b
aic3106_init( );
- v- {$ A- n: V* r% `& p while(1);6 O' \4 z4 X5 C9 I% x
}
# y) F: q- w! P! T& Y, a. k% E, {1 Y6 K: S& Z! {$ @
8 \. E0 e! T7 Z8 E( N% v, \3 X, L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题+ T5 J1 f, o" n) L) c# ?
/* Initialize MCASP1 */
% z8 y' w: x/ ?: Q/ L1 K9 U. | mcasp = &MCASP_MODULE_1;. E% N: m9 u4 f+ K& l
mcasp->regs->GBLCTL = 0; // Reset$ K4 ?9 u% U# y; c% O& G. P
mcasp->regs->RGBLCTL = 0; // Reset RX
6 \; j2 ?4 r8 [" t2 w mcasp->regs->XGBLCTL = 0; // Reset TX4 y4 z6 W4 q. }- x
mcasp->regs->PWRDEMU = 1; // Free-running3 e9 }7 _4 @- J. n/ }8 P) S
// configure McASP0 receive registers
/ G! N% S4 l. Q2 N& C' H mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
* X1 Y D: E% M _. G8 g: O3 g mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 E& T* X, r! h% c1 B4 s {: n
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 v5 D' e7 A1 B
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 }- Q6 L7 B z2 p2 m mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)2 T% I. t9 ]2 r
mcasp->regs->RTDM = 0x00000003; // Slots 0,1- y3 A0 q' {1 y* I; A
mcasp->regs->RINTCTL = 0x00000000; // Not used8 O' [4 n' U# ]' D4 O, ]
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256+ ?( z, w, P. x) }" c4 _
: D5 C( d" ~/ L& H
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
7 V! X4 W- Q7 N; }8 J4 P- G mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
8 ?/ h& m: w0 U* A V mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word, }% ], t. \; m7 e& R4 E
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
. b7 c4 I% `4 @+ f J% ]( z. n mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) i# s3 w: |$ q5 F4 q mcasp->regs->XTDM = 0x00000003; // Slots 0,1* u3 |* E: N% l3 R" Y0 I$ w
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit5 e* ]! p" `+ a( z! M" W
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 B/ F9 L( s! o+ ~
: J! G- M) U0 r" {% i1 t mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
% H. L' n' C4 Q# b P# ]' Z mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT4 \: u$ h5 L5 ~
mcasp->regs->PFUNC = 0; // All MCASPs
/ X/ [ d; m5 w0 | mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1! G+ |+ G/ r* q% l- a
% Y, a5 X$ F$ v# p7 l" |9 X6 | mcasp->regs->DITCTL = 0x00000000; // Not used
9 [* v* F8 t' q4 A$ f mcasp->regs->DLBCTL = 0x00000000; // Not used
/ J$ L- R0 e1 P, {5 `8 O mcasp->regs->AMUTE = 0x00000000; // Not used
4 L" i4 k5 Q0 e7 h+ d9 L5 ^0 ]: @# q, I# H4 [% k6 R4 `7 m
/* Starting sections of the McASP*/
. s2 u/ r- U0 E6 @) C mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
. @2 B5 A% l6 [' {4 y while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 7 r& k' h- ]# u; E, E: h
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
& U4 [4 l3 ]# ?* K9 Z( s4 k% x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );& X2 y4 Z) c6 n8 v: C8 v f
0 t7 P; I. H% v4 w# L% M2 o mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
; q2 I- ?5 z, B u X" ^6 q1 Q: p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );' n! b- a% L: V4 X, i) q8 [
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
h6 q. V# H( h" _. j; k while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( n) L3 ~; u: h0 @% L/ n$ \, t' ~- }7 m' P! J4 @9 w. E. a
mcasp->regs->XSTAT = 0x0000ffff; 4 N2 l: @& v1 ^0 J! A
mcasp->regs->RSTAT = 0x0000ffff;
& m- K [: G7 k$ `$ t% j) Y9 k( q. m$ G+ ]& y' \0 p0 L
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;0 a( o) p+ i' z+ {. A8 c% R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );( f2 Y( O& s) z% r7 B
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
6 L' d. W* K6 U, y+ F- l0 L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );& ]* N$ f8 a1 S, I" ^' ^8 F% s' v
1 R7 ]( M: v: z7 f) l9 D+ H /* Write a 0, so that no underrun occurs after releasing the state machine */
, E3 Y6 K4 m# n mcasp->regs->XBUF5 = 0;7 f$ [. e$ u% T q1 r. Z7 F
mcasp->regs->RBUF0 = 0;' q# o. X+ g( E. @
$ p1 E# W8 b: ]( N mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 [% L: j7 V5 D& J; W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 O5 Q3 Z" w8 h1 U) Y2 P mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 l( P% C# ]" b9 L* ~ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );* \9 Q! @) P/ g4 x3 c
# r6 U4 L8 l* v- B/ W m& q
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ) ^* O/ I- z1 \9 G, [. |0 s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );& B# O4 y2 s; B
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
' h# V$ x% G6 f3 u while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* q& |2 M$ k o( J
# ^0 ?/ M7 W+ ~4 q" {/ c CSR = 0x0000;
# _; }( S0 j8 s; S; M INTC_INTMUX1 = 0x3d;' Y) g: x" s" i: N! n# z- u* C" F
ISTP = (unsigned int)vectors;4 r0 g. a5 c* [4 `+ W% j: j- M) H
ICR = 0xFFF0;
; J( T: H9 u: U/ ~( z IER |= 0x12;
: K2 a: S! w5 Y6 K8 i4 A; t CSR |= 0x01; " s* B- E/ G3 q7 {; Q
5 {. X( X5 ~& c' |) [, M! h* k, B; R, k" |
3 F) [4 o' F/ D4 S" C5 F还有就是两个输入输出函数:' A6 a5 F& J3 t( E
void output_sample(Int32 out_data); W2 h/ b' U5 O. P t$ w
{
# R0 p0 D8 C, t$ S: n# _ AIC31_data.uint = out_data;
8 h1 K) b* L7 Y4 [# x MCASP1_XBUF5_32BIT = AIC31_data.uint;- w) x" w) I/ C3 @, n+ Y
}& Q. e: m" U' W3 S: _
) X; F9 U% |3 R
Int32 input_sample(void)% k3 d: Q, h6 j' b4 [* Y9 e
{ + J5 Z. J8 }( \6 g: Y3 [8 J7 }
AIC31_data.uint = MCASP1_RBUF0_32BIT;
/ a, l) U! O$ o9 F+ } return (AIC31_data.uint);/ Q' s( V5 p7 d5 Q/ M W' a' w
}
e6 E% F$ m5 Y9 l k% Q/ j' A' H- _$ d% f2 o9 z
|
|