|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:2 n8 |( d. u D7 G/ t8 Z# E
main文件:
4 I; O8 r2 k( r: _% {/ iinterrupt void interrupt4(void)
# ]% F F0 X% K9 N" i& j" M: D{
9 I' M d4 [1 v% g5 l Uint32 sample;
$ e6 {9 q: V M; f
* V% q$ h+ t$ | sample = input_sample(); // read L + R samples from ADC
$ l+ ^6 w- w9 s F output_sample(sample); // write L + R samples to DAC : W% ~ L* t( {7 C3 O( T
return;' k G7 t2 S7 b, d8 R9 J# G! @' ?/ A
}
7 ]( H, k1 M& y, N, I# z" [" ]! K: U
int main( void )
0 H* E' Y; \" {9 t+ W1 _2 i{2 _! T% R" j, D# T
8 v1 x* B$ k' V, K" L
/* Initialize BSL */
+ p5 w5 e3 b) x' u EVMC6747_init( );5 \1 t6 s: r3 V+ H% I
/* Call evmc6747_intr function */
2 e4 \% g; u$ s5 V `; Z) Z w1 N# r aic3106_init( );
# t# F8 |" [ k2 g; b. \" K$ l) G while(1);
+ }. G9 x8 o$ v}" Q) i5 `! w7 f. \" e. l
1 N7 h0 \$ `+ A. v
* }' @4 }* n. V; r1 Z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& ]' J6 i! M0 H" c- H/* Initialize MCASP1 */7 E& Z) q. L0 O" ?; \3 v- s7 m
mcasp = &MCASP_MODULE_1;
' f! S# z+ Z$ i/ E$ o+ ? mcasp->regs->GBLCTL = 0; // Reset
$ }5 D! E2 T1 Y. T mcasp->regs->RGBLCTL = 0; // Reset RX
( y @9 b: Z+ q mcasp->regs->XGBLCTL = 0; // Reset TX
" k# C0 ?1 c& ^ E% [1 a mcasp->regs->PWRDEMU = 1; // Free-running
- @/ h" \" C# h$ D' m3 X4 Q" l // configure McASP0 receive registers
' a& N: B9 }2 t( |; N' [" y mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
: l; ?6 }* l8 c! |( `+ V mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
B4 S: \3 i8 v/ A% r9 s mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word/ i! d5 [ t: e/ T4 g8 z
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)- d6 u3 ?1 U" l( F' r
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
! y# D: x2 r6 s$ E" G' ^! ? mcasp->regs->RTDM = 0x00000003; // Slots 0,1) {; Y" r( K" D
mcasp->regs->RINTCTL = 0x00000000; // Not used
; P4 t& Y$ k9 [0 t3 C7 c, Q mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 d% W# j5 {* s- n8 r7 o* y
2 E& w0 }" s: M9 G, T7 m mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used7 z3 | K7 V7 b
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& A' G" m' `/ z! C- p' \! u3 @ mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& I5 E1 ]3 z+ [* b7 P+ I/ W1 r2 s" P
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
N, d, v) A3 q2 u' b* d mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK% [ U/ _5 j3 O% x5 B( g
mcasp->regs->XTDM = 0x00000003; // Slots 0,11 r+ S% j/ D6 A$ M2 \' B1 v, n! ]( w
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
( P" g; V0 x. h5 d9 O9 z mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 c! Z- `. j6 c& S+ f8 I
1 U3 e7 u( |$ n8 T mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
9 o- t8 \4 c5 _6 M mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT; [ l' @# N' R! l, S
mcasp->regs->PFUNC = 0; // All MCASPs
4 c, H/ G T+ E1 k8 t. {( _% R; u mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' T& I; W& p; k' T4 F' c: |6 P; v7 q" O! _
mcasp->regs->DITCTL = 0x00000000; // Not used
$ h3 y# N- g( b0 b: w/ S4 t9 Y mcasp->regs->DLBCTL = 0x00000000; // Not used- L. a/ v" o& A* H% g) E4 G
mcasp->regs->AMUTE = 0x00000000; // Not used: g0 ]2 W B4 G* \; L- q
' ~; ^) _1 Q/ f2 u' g/ g
/* Starting sections of the McASP*/
( f" }& a9 Z0 |) c6 r, h& V mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 o: W' k. ~- ?8 U1 O) b5 L
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
" c3 o6 g' U8 M% T mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
0 y+ a- N# B+ I; u' j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );. z) G. k6 C8 B9 } }2 a' @+ f
7 _* L7 h. u3 x0 s* e
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
3 @! a0 u5 g2 ~5 `( J% g while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& @, p9 p ~, m- T* a
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 3 i2 s3 J% ]9 O2 t2 ]0 n f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* B! J8 ~7 z8 s8 C U" y& |% ~
9 G+ F2 r# a/ v: G+ X4 _6 p mcasp->regs->XSTAT = 0x0000ffff; 7 ?; x$ l) N2 x; X4 {3 ]
mcasp->regs->RSTAT = 0x0000ffff; 3 S5 E0 _5 r) `( X4 o
, F* `! u, Y$ d% Q( t
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 M9 _4 J. P! L2 Y while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
: k- B7 e; W, X6 Z' X+ U, t mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
% ~, M- M* W+ `9 k! U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
s4 _5 j. ?+ l/ Y! r: |$ ?* o- X; a, F: q, O/ A, T! B# R, m
/* Write a 0, so that no underrun occurs after releasing the state machine */, S: y' [: }" X5 M( @1 {$ n: H" k, x
mcasp->regs->XBUF5 = 0;+ Q6 n! v# h0 h2 c- D+ A$ l
mcasp->regs->RBUF0 = 0;
5 X4 [3 u% ?+ J! @; ^& L
* b! B" A: Z! J5 h) m U mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; & Y7 U" r7 F* ]9 z: s; ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );1 P/ P5 ?" K$ m, f# z
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 9 V. T, X1 [6 }( V5 ?7 s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );, ]/ v9 b& W. v: D- }/ u
! `+ J' r- Z- e. [8 m% P' a; P! ^ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; + O1 w% e h9 {0 E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );6 \. f! w% D5 y
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 h4 m* c9 ^' V5 g% p while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% m, v: g3 [/ P7 W$ W
- e0 {# x1 O7 q- ]! z
CSR = 0x0000;8 T. E5 k; ~' P, b1 X* r7 X3 I
INTC_INTMUX1 = 0x3d;- P1 t! h, k; o8 V6 g1 k
ISTP = (unsigned int)vectors;
2 e2 t8 r# Q: F" L6 m6 i3 J ICR = 0xFFF0;
& k* J# }& B _7 y `3 k( t4 _ IER |= 0x12; & {. b f8 @! f! e8 v7 \
CSR |= 0x01;
" k2 D: ` r% x. a" y9 m' j# b, {! a" q; u% N( d' `
4 l) c: H( \2 ]! t
5 w6 A. ~0 y! y+ j还有就是两个输入输出函数:- x) N& L7 k, U z# B& u9 O$ x: ~
void output_sample(Int32 out_data)
t) j, f6 j9 h4 C; E7 l2 ^{; ^: w6 _* h! H* |1 i$ ?( z
AIC31_data.uint = out_data; & K. S% k! H: q% Z4 @
MCASP1_XBUF5_32BIT = AIC31_data.uint;
' G9 K' J) k9 c2 a1 }! n) Q% @}
: w. F- o3 c! t6 k" d$ B) H, F. d9 m- f, I, A8 Y- o9 s
Int32 input_sample(void)
# m7 x4 O" u* g7 v2 v{
! r; f% X: a& g4 m$ i- i- m AIC31_data.uint = MCASP1_RBUF0_32BIT;
m0 v2 q4 ]2 I, e5 `1 o9 S/ ] return (AIC31_data.uint);
! X/ u2 l, J/ X2 s0 \# M4 ~5 x}) N* w% N' G+ V& Q/ U
1 k- e8 k) [& L1 [
|
|