|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
]. `4 I% G; i0 y8 C/ r; i* vmain文件:
* o1 I7 p1 ~3 `6 Sinterrupt void interrupt4(void) $ @! V' H0 b$ G0 [; J
{
* e9 ~$ u* J8 P Uint32 sample;& a$ U1 V& v6 e8 o- N% g
{0 p) O/ a5 X! x sample = input_sample(); // read L + R samples from ADC
^) l- d/ X/ {$ L) } R output_sample(sample); // write L + R samples to DAC ( }4 ]7 }! s' P- I7 q' ?
return;
6 E8 y0 D% ^( u}
; g$ z) |8 S2 O
; \" W3 X' j# c( qint main( void ): i0 I2 T: m H7 n7 Q
{
) h2 E' x# A* V1 g) g5 L {
! h; |, B4 q$ O/ H9 e5 { /* Initialize BSL */5 f. ]4 T+ [. {- [1 t' x
EVMC6747_init( );
; r7 V0 A, H2 |; M; B9 P- @ /* Call evmc6747_intr function */' c. x1 h: W; b+ w+ u( G7 s
aic3106_init( );
" D3 [# _- [: J* Y. B/ M) p# k while(1);& z4 l4 L1 b+ {* [7 s
}
% F% T- I- Q1 ]1 G* y8 H( M5 r
7 h W/ F9 z/ g( }& i& O7 K, y+ F& `
+ t. |* v; I5 W4 A# l; G7 |6 Gaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" W; p$ q$ g. B$ P
/* Initialize MCASP1 */
( F' l9 _- k" }- n9 q6 \ mcasp = &MCASP_MODULE_1;9 T) ~; n& @) d* n' o
mcasp->regs->GBLCTL = 0; // Reset6 r; s$ i7 m. h3 U2 }- x
mcasp->regs->RGBLCTL = 0; // Reset RX
' z, n% m4 R3 Q$ @6 B7 [ mcasp->regs->XGBLCTL = 0; // Reset TX
u+ B4 q0 A' f: ~3 Q mcasp->regs->PWRDEMU = 1; // Free-running. a3 Y& M; S0 p8 W
// configure McASP0 receive registers# S' K; X4 c. a! D0 b& j7 W. Z
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used1 ]& Z- I& |: q! @( y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) {( {% R6 W+ n0 R
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word* ]) t8 |3 z- M/ h+ U
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 C# \3 L! V# S9 Y
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 n- G5 @4 Y, H mcasp->regs->RTDM = 0x00000003; // Slots 0,10 B7 E6 u6 c8 h4 b7 W+ d+ u- Z& f# J- x
mcasp->regs->RINTCTL = 0x00000000; // Not used
2 A' F s8 C7 I/ ~ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ \# O* ]! A* l* o" Z
4 X9 _8 j! m( _$ w& z' | mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
4 \3 L x5 Z2 `# V' e2 k9 l mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 E0 y' b+ u" b. ?: i) D mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% R+ \# l4 \# M) w0 R% D8 m mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16' ^5 j$ m/ B3 Y# M
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK3 S; \& X' j' C. @. U
mcasp->regs->XTDM = 0x00000003; // Slots 0,1+ R b1 B: [" d" q/ p) j
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
% N% c, `: b K. P7 ? mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# F8 a7 G4 |5 j. M2 M* C/ ^
4 B0 V. l: h" m! s4 M mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN1 D( J" v5 z. ]- t8 Z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 D2 s: v9 z' W$ Z+ Y7 h( m9 ]1 v mcasp->regs->PFUNC = 0; // All MCASPs+ B8 H/ A: |! z; j) d
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX11 f0 r# j* m T" _+ ~' x2 y( Y( u
. K3 _' v f$ F$ \, A* E mcasp->regs->DITCTL = 0x00000000; // Not used$ ]9 n+ j; S8 d$ G* }9 d$ C
mcasp->regs->DLBCTL = 0x00000000; // Not used' n! E I$ V- b8 s
mcasp->regs->AMUTE = 0x00000000; // Not used7 s; T) c7 w" C: F1 t
* t- ^. F5 R0 ?- W- I
/* Starting sections of the McASP*/2 J3 T9 |3 b* S m6 ?
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; * l+ `3 v+ |( y0 a
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: H) I/ f4 s: l- ^, h9 ^$ s mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( a. ~( i3 R* c3 J0 M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );, i6 x" g2 z" u5 r' C5 i
# V% p6 |4 G; }! S+ g
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
$ k f- r( v/ T) \; @ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );6 S) O/ L; b6 ~$ M0 [, H4 ~( \9 `3 a
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
. m7 R, k) p& R8 X; n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );, Z0 d, B/ H8 _4 R0 v
( f* i- Q1 D3 f
mcasp->regs->XSTAT = 0x0000ffff; 5 e. r% z# m7 _ R; f( i
mcasp->regs->RSTAT = 0x0000ffff; 2 z) X+ p e; n6 {+ e- g* C
0 J+ {4 W+ {- N9 X mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ _* A3 G# G8 z; G' x: ]6 H: h while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );+ Q C7 r# I/ g8 K: ~/ E
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; . _: v2 ~/ s$ H/ m, Z( `1 B4 E
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
; c0 ?* c+ I% Y/ e5 U4 B2 n) |: A5 Y+ u) r* m
/* Write a 0, so that no underrun occurs after releasing the state machine */
- Y6 ^+ d% R" R6 ~) r- U) {& Q" M$ R mcasp->regs->XBUF5 = 0;+ \6 ^3 {- j* @
mcasp->regs->RBUF0 = 0;' b6 i% ^. ~' w5 q7 k
/ m8 @1 c) M) c/ c- u# `/ p* B
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ( d7 t. f. j) E+ W' {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- H% @+ i% M' h4 V/ O# C& R( L mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
m( J7 k! E4 w9 a" [ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
8 y/ j! T' \5 k# Y# e4 n% j$ K
3 T$ w; w' B3 U% L3 s mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; + i$ z' p, V) Y3 g
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. A) w1 C" m* f% W6 m mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % h Z$ x8 ]+ U8 a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
0 ` _+ n3 T" C( W0 I# l- t/ v9 r$ ]! }% ~% i; P& y
CSR = 0x0000;
' c8 Z' S+ X7 }/ z INTC_INTMUX1 = 0x3d;
7 r) ]) z/ S7 m# A! s ISTP = (unsigned int)vectors;
) o% b4 V0 F, l) b) B8 E4 m ICR = 0xFFF0;
/ e' ^4 H3 }& X( Q4 |" \0 Y5 ^' \ IER |= 0x12;
: ]3 Q& K9 g- \4 A! E9 P% K CSR |= 0x01;
4 U6 `, A. y2 Y4 q% ]& p6 ^1 F) ?$ _0 \; q; V
% W h3 i. z5 ?' \! @
/ s& a1 h; P/ ~& l' z% s还有就是两个输入输出函数:
1 b/ S8 S& B2 [4 ]void output_sample(Int32 out_data)
# R1 Y( L3 `7 c2 @{, K/ V3 f" i+ B$ b
AIC31_data.uint = out_data;
& q6 ]+ R. y8 |7 a3 ?/ `+ A( v MCASP1_XBUF5_32BIT = AIC31_data.uint;
9 Q! G" C5 Q* v. s}& _: r, X$ ]5 o% ]( U! j
; n. A2 w; Y4 L, cInt32 input_sample(void)
! g/ F# V7 {: ~0 U$ `+ y{
, v2 z/ V( B/ R( i AIC31_data.uint = MCASP1_RBUF0_32BIT;, O0 F. r7 B l% u. l0 S9 e- | u, q
return (AIC31_data.uint);! d; X: P2 i) _/ j8 e, }* c6 B% p
}/ W. `6 U- Z! w% ]6 O+ c ]2 R* }
1 x% {# I5 g: e# Q- v1 S |
|