|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
0 F3 o( |7 e# N3 Gmain文件:
6 w& Y- G) s4 v# y' J: h$ S9 g* b% xinterrupt void interrupt4(void)
/ t$ P; n2 H/ z; u{
* E8 k1 w( I7 w- N Uint32 sample;" Q5 t9 y9 R3 C& a! c2 V
" L8 u% ^% D6 E7 T9 t- c4 x sample = input_sample(); // read L + R samples from ADC: D: ~. i, p+ p
output_sample(sample); // write L + R samples to DAC
+ C0 S7 o- v0 B( n+ b, R& q return;5 ]' U, O, W% f/ E& m
}% d2 ], k$ P9 `: F' B
: D- _6 y; Q; [: a% ~1 W% S7 N3 }' q5 Y
int main( void )
( q5 H5 g! Q( d{
. R. z" w* X ]: h# E5 s+ i) U7 D
/* Initialize BSL */# _/ ^! w1 q$ i R' b4 L
EVMC6747_init( );
" c9 j4 t, a: C% }8 z3 e9 Z5 Y /* Call evmc6747_intr function */$ c9 `' Y5 A/ P- z1 d! q1 i# Z
aic3106_init( );
& x( V& p3 i9 Q) I" N9 d+ n while(1);2 ?* j. g$ C7 {+ ~1 f) a
}
0 k y. w [7 r0 ?) l7 Y. L9 B9 h \5 z( P
~6 @9 O6 ^$ u& f4 z2 d* i" m
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题* X: i: T6 s- H
/* Initialize MCASP1 */$ g: X- }& L; E# _0 \
mcasp = &MCASP_MODULE_1;0 W! G( }# K z# Y
mcasp->regs->GBLCTL = 0; // Reset
& V) I& a4 |( q, F: l( `; ~* U mcasp->regs->RGBLCTL = 0; // Reset RX% [& d* \ e+ E3 j' w# ?
mcasp->regs->XGBLCTL = 0; // Reset TX
0 a4 `# g4 R# o2 v" `# ~9 ] mcasp->regs->PWRDEMU = 1; // Free-running
6 x0 M! j8 L! a // configure McASP0 receive registers
4 s! l: A2 f" F- O [) \! H$ J mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used! n; \) P4 R6 ?+ L( \( L) Q
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- I+ t! U) M7 {
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word; N" E* J3 O. m
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 `+ c; q) m, ?0 v5 W mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)3 y) y0 h- m* W' l4 U
mcasp->regs->RTDM = 0x00000003; // Slots 0,1( b* D/ D2 _0 \# X! H& w
mcasp->regs->RINTCTL = 0x00000000; // Not used( m+ g9 `2 _1 y6 V0 a
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: c: b3 S( O. `; n9 y- T+ @4 h
% V% z4 ]* i/ u mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
7 ]+ |$ \; q% i5 j9 | D mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) W3 S* o% G5 D9 i% |2 Q0 { mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
0 H* S- g5 A: m+ j( b$ |/ _) e: {/ Y mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
+ q$ Y4 p f V# _8 R mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK9 N) X: L. N( u2 b0 j( g) L
mcasp->regs->XTDM = 0x00000003; // Slots 0,1, o- q. b9 {3 i; F3 v, K
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
2 m5 W* s9 d) f( }! d' @# L mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. D9 n/ K; L: j) a
. {2 Z' F# R" b3 f+ p
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
( |% q, d5 E, B$ s9 N' n mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT6 N0 e5 p5 u o& x; V
mcasp->regs->PFUNC = 0; // All MCASPs( D$ `2 k$ H2 a+ z% C
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1# V/ v a8 U2 ^7 R$ q5 b
$ ~: f2 L& m+ E, f
mcasp->regs->DITCTL = 0x00000000; // Not used
. U- U% s/ p+ t" O5 ^ mcasp->regs->DLBCTL = 0x00000000; // Not used5 D+ P+ a5 W7 \& Y( S/ g$ j7 J
mcasp->regs->AMUTE = 0x00000000; // Not used) j& }. V7 v7 v1 o# l, R
5 R# b5 I- {" q5 W
/* Starting sections of the McASP*/
# z2 K! M# C' `% K" | mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
7 ]& c% R( v# ]5 O1 M& [ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
: x% q. K( ~6 }& j mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 h8 _2 `: {$ B; ^( n( H while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ x* E4 u! K2 _% a6 a
4 {; N) R: m) d1 ]# A mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 4 v, G% w1 A! B5 B1 N& C3 \
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 |* T! `$ W, B$ J$ s mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" [0 D! ]7 z" ]) I' C" N8 s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& s0 l6 J1 V9 Q( ^ B+ Q
) o' L) i6 z4 J5 @8 l mcasp->regs->XSTAT = 0x0000ffff; " s# B: T- n. R. t* E
mcasp->regs->RSTAT = 0x0000ffff;
& I/ U- D- j& ]! v% e4 Y
t$ |: _) @% g! \! W* | mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ J& |1 v8 {$ r. E while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
$ Q# s' J) a" A3 s0 J/ D0 ~* t mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: o: X, H1 V1 l" f while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );! g, e5 j9 j9 O5 Y1 ~, r! B' B
& a" ]4 X: z7 K8 R9 ]) t /* Write a 0, so that no underrun occurs after releasing the state machine */
) E9 R, q9 y- ^' O5 T( z' ?$ U6 t mcasp->regs->XBUF5 = 0;
/ j" ?" y$ L; L, ~9 _0 u( e- v' e mcasp->regs->RBUF0 = 0;8 A% {' ~1 [( }' }2 }# t7 k5 d
0 X* s6 \5 k" C; N9 X- E mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
3 r2 \+ L+ s8 r' q while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, s& d3 S) g* w: Q3 c mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! w+ |0 ^8 n& P2 T, I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );% |5 D9 V: @# V; H# Z+ w8 K \, f
" Z5 v3 ?/ R; y a4 @6 d
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 N5 k1 i9 \' b% J) q/ ^
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
) r' I2 H* e# X% l mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 A6 b1 `/ ?$ z0 @1 h$ [ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ v; b, L9 X4 K0 N5 E
: Q( _$ k4 q5 k t9 ^
CSR = 0x0000;2 j5 Y8 X: ~9 w+ W, m, W
INTC_INTMUX1 = 0x3d;: G) ?5 `; ~: r/ q" B$ k
ISTP = (unsigned int)vectors;
k( F {' w4 _6 E ICR = 0xFFF0; - P1 O3 s, K* c; G
IER |= 0x12;
0 B, N/ Q0 A* p# p3 D, @ CSR |= 0x01;
$ k. m9 R- \$ I+ Q2 H/ C1 K: g8 S( p; i" F! @) z
1 H( ]' x' G$ n( H: O2 j( }4 R8 z/ F# ?+ |. k
还有就是两个输入输出函数:
, f- H6 B3 ~; }void output_sample(Int32 out_data)
- x# S/ y6 F+ t) C{
, H7 W( k/ q4 [ y4 V( r% Y/ s AIC31_data.uint = out_data;
2 F5 w/ p! G) l9 t MCASP1_XBUF5_32BIT = AIC31_data.uint;
* Z z0 a" t6 f/ E) y. K9 V9 W}
+ h) @, @ Z3 l) P! g r P4 D' W7 A- L. I( {
Int32 input_sample(void)
$ ?8 c6 m" s% U% S6 ?& T4 S' f{ & p) D% O0 F7 s
AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 s! n! a& g/ J* m" I return (AIC31_data.uint);
# Q& V7 L9 Q' i7 r}
5 K1 u, f; [7 T) g4 k9 X
/ S& L9 F% S3 q6 [& _7 I/ H |
|