|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
; t% ]5 O5 p, I% R2 Cmain文件:
/ M8 A3 J# h9 t( S( i+ Zinterrupt void interrupt4(void)
6 u; ]6 J: p% y- Q6 W# l- @1 @3 ~{
k4 r0 e6 |8 }7 n8 g! J Uint32 sample;
" _) B" o6 H' A
2 z/ l/ u5 W) O; _: i, H0 V/ ` sample = input_sample(); // read L + R samples from ADC0 x* T A( {( X$ Z& H3 Z) w+ r
output_sample(sample); // write L + R samples to DAC ! k9 ?: S! m% O) M3 F
return;
, O. z- y) L: |5 W# g, k3 o) _( S}1 ^# \. L: f% M% t) K. ]2 K
" ?1 ]3 u- r& e" o/ w8 f( P, c/ K- ]
int main( void ). d+ l3 F e1 _4 L
{
}6 A" ^/ S. h& A, Y
7 G- r0 l6 x$ h* r7 \4 R /* Initialize BSL */
( c3 m# g1 V; o8 V5 m EVMC6747_init( );
( b* m X1 u4 ^5 ^; h2 g5 k3 U /* Call evmc6747_intr function */
" S$ e/ X) [# X. {7 y% i6 k aic3106_init( );
# S: b8 @' C$ [& U5 Z$ S while(1);& A$ `8 A/ S: j
}
; i8 p9 H5 n9 r+ A, L3 @2 c5 R) i, G; Q6 O2 @9 ?& t
( g+ c1 |1 ~7 f3 }) x
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* G& M [$ j- ~; R/* Initialize MCASP1 */
0 e, p6 k }( |$ Q. r% E mcasp = &MCASP_MODULE_1;
# l" k2 |0 F8 z0 p8 z1 n: e mcasp->regs->GBLCTL = 0; // Reset
0 z- v! t% Q; H0 ~ mcasp->regs->RGBLCTL = 0; // Reset RX
: H& e% k4 k5 N! C* u: m% c mcasp->regs->XGBLCTL = 0; // Reset TX ]4 h3 V9 t9 \- [, P% j. ~
mcasp->regs->PWRDEMU = 1; // Free-running( Q, r& t7 B7 V$ \1 ^1 J8 l
// configure McASP0 receive registers
0 f5 `3 N) s4 Y( d* [( U" b3 \ mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
7 A6 k( @( d! ?! \) N mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- Y6 y1 E% k0 |0 D) L& ?7 a mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word, L/ e' P4 m& Q0 Y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)0 H( Y" f" X% ]
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) m/ t8 ?9 s/ x4 a3 `+ J# @
mcasp->regs->RTDM = 0x00000003; // Slots 0,1/ ~' Q+ p% t, }# n$ k; }
mcasp->regs->RINTCTL = 0x00000000; // Not used
* V/ k. r) c- T" p8 [1 | mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; G2 E; S! a' u# b
) o0 ^* F6 f$ x" p% Y/ e& ? mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
$ h) o! r& N( J# j! L( s y mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. D* T6 g/ @7 E% _9 G' S7 R
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word3 l8 j. C* l% f2 A6 s+ _
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: @- j& f+ y/ X0 @ G$ x3 o
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# R& F& b4 G9 u* h6 j mcasp->regs->XTDM = 0x00000003; // Slots 0,1; F: d& j. F; ~0 C% Z
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' b8 \( H- e) [- F& C0 R mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% _# m' K1 I) R& k! m( ? o
8 D( X0 \! S0 N mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
, {1 z9 N Y. Z2 J& R, J: v4 d- c7 K mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
: ]2 ?0 {3 ]3 p; L( X9 ^. p! Z* w( i mcasp->regs->PFUNC = 0; // All MCASPs+ {" A: C$ m, r& a/ Z& L; ^
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX13 L* j4 e1 C, l- b5 o
# E+ \ N; S+ f% i; p' A mcasp->regs->DITCTL = 0x00000000; // Not used! X" ^/ D! r( l* u3 G
mcasp->regs->DLBCTL = 0x00000000; // Not used' z& l4 j2 T- f& Q/ a9 D7 U9 K+ F
mcasp->regs->AMUTE = 0x00000000; // Not used$ ]' x8 L: i; }) f4 l
' m+ A6 I' h- @- v) X' S9 E
/* Starting sections of the McASP*/
+ M+ Q( l+ E+ W8 ?* a5 p mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 U, H* }( ~) r- {' l, J& r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
; ]+ ]% ^6 P% j t0 a! a mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
: Q6 ~' [( a& ^; Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 D3 n5 P2 X3 U1 Z% l
! i/ _" ~# T7 K5 U6 E" f; i) m
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& H( \. n+ m p: V1 G; p& E0 C5 q8 F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );! V+ R. d4 g. W4 m
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; : [) |/ m' ?: |) Z3 W- P; ~; K( [
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! ?; v1 ^. |+ k" n" A. _6 S7 A: t5 A/ l) N0 q4 e
mcasp->regs->XSTAT = 0x0000ffff;
! _$ s Z. g* ?) k2 M; m. s8 A mcasp->regs->RSTAT = 0x0000ffff; * a4 c) v4 C' y
/ p7 @- `6 _8 \, N% w# ? mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;" ], k% `& h, h% I9 [8 q$ p/ H5 [, I1 f( t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" h& a$ I1 d: s N- Q4 W. m mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
9 i# |0 K# S' U' s+ t7 q3 ^ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
/ C; e0 Z; ^" v( Q/ i, i0 K. o" h9 V0 i
/* Write a 0, so that no underrun occurs after releasing the state machine */& R6 h5 ~1 e) p" ~$ A+ c
mcasp->regs->XBUF5 = 0;
4 M2 H: t- K2 }- K mcasp->regs->RBUF0 = 0;
& g1 p" d0 C; H) c* ?
) `8 s' W) B3 F0 d) t mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + c) p) T/ n" D( P# }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
& w' m$ Y( X8 x! I+ E- d mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
3 ~2 z8 V. x3 A$ H* [9 d while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, o+ E, F7 U9 f4 S& ?; h+ @$ e) U
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - `+ I/ h! h" {, q& }/ W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );4 e G$ o4 z$ l) J3 X
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
5 W2 B1 e1 I @% A* ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" v" s, N1 a) C! f4 i: S4 k, s: m
CSR = 0x0000;' j1 l1 M; ?% y
INTC_INTMUX1 = 0x3d;' O/ p5 {" [! X* q: m
ISTP = (unsigned int)vectors;) n. W/ a( I3 s$ _* {" ]
ICR = 0xFFF0;
, y" ~" R! P- a- c, | IER |= 0x12;
$ @5 o) ^/ R1 a- a" k CSR |= 0x01; 2 L% H6 `% P8 L) J0 Y8 o5 E
2 L! F' u; a1 ^" u
! h1 t1 ^$ S1 }; n
4 M @, r4 D n# F0 E还有就是两个输入输出函数:3 Q% k& M/ h& G4 n4 l+ H
void output_sample(Int32 out_data)
+ j( y6 K( {5 N1 }' I{
! a/ t' v! B k& i+ u1 _: I- O# \3 @ AIC31_data.uint = out_data;
5 H1 T# @( h7 n; n# p9 s MCASP1_XBUF5_32BIT = AIC31_data.uint;4 x' T+ q( L1 L- b% E0 B
}0 w; |0 H% v. X& V- |
- p1 b! `; I7 y5 I# D7 z
Int32 input_sample(void)
7 c- B. f+ O/ I7 o; ]% F{ : x, Z8 |, v. i3 H7 @6 ` b9 D
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* [/ L$ V& u8 Q; V return (AIC31_data.uint);! S5 g# d5 u1 R' J; C6 f
}
4 s; t, X! q0 Q5 s& f) t7 C7 D8 C6 O6 d! W) m8 u2 R
|
|