|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:% {8 h1 }. M' u& F2 F
main文件:4 `8 E W4 ?+ R# u: k( H
interrupt void interrupt4(void)
& T/ ^' C4 h# K$ j! O, [: o{
& C8 y# o! Z+ L- M' w! V- @3 B Uint32 sample;
2 M* p7 w, B7 |; l# _0 j
; t0 C U, A) Z7 i! \8 y8 E3 E* n sample = input_sample(); // read L + R samples from ADC
% b( F$ x! U: G! }: S4 K output_sample(sample); // write L + R samples to DAC
: G* n t( X/ [, D/ P" A return;7 e; ^ H! C4 m* j
}
9 G, G& L( x* v, P+ J. z$ Q( x \" a( ?& }' C; l: U' a
int main( void )
" W7 y( l D: I, l- i{ M: A5 V7 K& K( ]- t: H
9 }! i7 n p7 W /* Initialize BSL */% l' z" m9 G' J- }% ?; t
EVMC6747_init( );5 M; O6 w8 z& o5 u1 B9 O' ^) {
/* Call evmc6747_intr function */& I- M3 H+ d5 s1 I
aic3106_init( );, G% L2 p2 T$ E- k% I
while(1);
) {. {6 v; n6 w% K8 w. k}
; L# V, A6 l( S) B- T. F% _" ? [# |0 G/ D7 i5 ]1 i$ @
7 ~" g/ ]' N% L( `& _# w7 b* \aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 J. j. Z$ H- X1 w& a) R& e/* Initialize MCASP1 */
' H4 k5 `5 z$ b) F% U mcasp = &MCASP_MODULE_1;6 t+ Q9 n& B, C& g. Q% C
mcasp->regs->GBLCTL = 0; // Reset' S* [ E _, H$ l: g% q; u
mcasp->regs->RGBLCTL = 0; // Reset RX- o6 [$ U! @( R5 W
mcasp->regs->XGBLCTL = 0; // Reset TX$ X7 g- T" L6 O3 S$ T
mcasp->regs->PWRDEMU = 1; // Free-running
8 @+ F0 h$ Q# q! t, J! _ // configure McASP0 receive registers
6 [. o6 b! D1 ?- b4 l mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used8 P3 H% }$ S; `0 Q5 c
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 ]( x( @7 a' b) \
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 d/ `. z% Y3 U' a' \! t( Z mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; S a9 R: o( t mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
2 `5 ?; j" a6 L! |$ ? mcasp->regs->RTDM = 0x00000003; // Slots 0,12 l8 h8 L6 W1 R' ^6 k! D+ D
mcasp->regs->RINTCTL = 0x00000000; // Not used
$ z; L( W2 q* C! M, [/ T mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- j* H# W4 N& M$ P' n8 Y, R* z
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used# Q0 N! o6 C$ _" b5 l! I* q! N
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( x F+ @, {0 @4 D# s
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
; h) x/ }) c8 j: n' f. C mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16* Z: H/ X8 B/ X1 L3 ?9 O. l
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK2 w4 ^3 k: k8 X! n+ q1 K4 ]
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
. U) g/ c2 |6 ~ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit: j: F% n0 B9 Z% o
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256* d' w& s$ e! ]. y; V7 w: ?6 B$ l
8 T' U* g8 ^0 M
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN* i1 ^. a* ]$ T# R8 z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 x$ x4 i) }8 G( P; }9 W! M& Q mcasp->regs->PFUNC = 0; // All MCASPs
# P; y( M3 s1 ? G$ O mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
$ @# d1 y; W$ A. m |) E. D' `9 B% K
mcasp->regs->DITCTL = 0x00000000; // Not used" p% i5 u7 ?7 {8 O# O/ z9 J( \% m
mcasp->regs->DLBCTL = 0x00000000; // Not used$ R# R& ~) k# | m
mcasp->regs->AMUTE = 0x00000000; // Not used
# o5 e. d6 r g
$ }; u3 ]3 { _0 r' M' @/* Starting sections of the McASP*/9 l# K& S3 M, i* k
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; " i/ J% U" U2 m0 A- H+ \: s) h
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 2 S, Y& n% S# M- [" }" A
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 4 d4 H+ I2 b5 I5 Q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );# ]% }1 z0 T* W6 `' m8 j5 u0 ^
; |$ ~& P5 m7 g& j
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; , @7 J$ j L' [
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); }4 R: Y; T# t6 Q+ k
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 J1 V2 W# d- M$ i: D1 ~
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );5 d+ _+ K1 T# p2 T: I
# j! Z- ?) C- T+ W! {+ r4 Q mcasp->regs->XSTAT = 0x0000ffff;
7 e7 K" }- j- }# n3 z6 y% k3 q mcasp->regs->RSTAT = 0x0000ffff;
9 d2 {& M, J0 q1 t# F( o. z: x# Q; u5 Q! x
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;2 Z+ ?$ ~ {. ?* }/ A4 j0 x0 O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
7 F1 R/ _; t, X# g# R mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 7 ]- u% q8 x+ W9 S6 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 V" g% M3 ]- L: F
5 q( j% j1 O g /* Write a 0, so that no underrun occurs after releasing the state machine */
# r. ]+ r, {9 h# Y* u9 J mcasp->regs->XBUF5 = 0;
2 b7 `& \7 [* r3 o mcasp->regs->RBUF0 = 0;) B. l1 _2 e5 [( \$ r ~# d; h v
! W' q# `" K/ S9 x
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 4 J/ T8 `8 G! \% S8 c" @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );( o2 v, M+ n1 A- x s" K K! k! u
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! J; J% P& i; q+ g8 E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );! w4 m/ p# ]4 t( H
- G! j/ E) V$ X3 G0 n mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
* }5 |% F5 t$ f3 S9 z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
: a6 \) p" M+ ?9 ~ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ; w$ F1 B, `7 J: G6 u) q: [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ I, t2 ?" ?3 |1 p4 M! a
' R i: \8 @: L7 h& ?
CSR = 0x0000;
( k9 _* Y' ? g* U4 P; E1 P INTC_INTMUX1 = 0x3d;, a! B4 Q# s% S% a; b0 |
ISTP = (unsigned int)vectors;2 Y2 J7 Q; p2 y$ b3 N9 U, }
ICR = 0xFFF0; 2 ^' z7 w N9 V, K5 w" X5 i
IER |= 0x12; 1 j- W5 U: e. H0 x- m7 D& {1 b
CSR |= 0x01;
1 T. Z# q% x3 q, p' X7 x) I3 y R& N' x3 P% Y0 V& B
R2 ?9 R2 W2 h2 {. Q
: U; o, E& t7 a* a0 P
还有就是两个输入输出函数:
( x* N& y3 z; `6 I7 @8 cvoid output_sample(Int32 out_data)/ g3 q& Z* X4 H8 a: B! `( N
{/ @8 ~; V6 x g, T$ h
AIC31_data.uint = out_data;
: l7 n5 w+ Z; s. z9 { MCASP1_XBUF5_32BIT = AIC31_data.uint;* |& T$ u3 L/ i9 d, K
}( V$ `/ _1 e2 ]8 S$ w* n
K% }* e1 B# X/ C
Int32 input_sample(void)/ u9 M( ]! e5 n" D; s! l
{
8 w& K5 J3 Q& F7 C3 _ AIC31_data.uint = MCASP1_RBUF0_32BIT;
8 P0 R1 Y" D' d6 p# S return (AIC31_data.uint);
o! z/ G& D- U% A5 s( Q7 J5 K6 I}. l/ Q; ^2 ~: S: s3 U/ o
) e# _+ ^5 o7 [) M& W# W0 i
|
|