|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:8 D& }5 J0 r) ^0 c( g
main文件:- y- J t, x( w. C/ b8 `
interrupt void interrupt4(void)
+ U/ C! o$ _2 c, ^" i{
, x2 \$ m. [9 C' G: s0 _. s# Y Uint32 sample;' ^3 r: @! W T0 ?
f; [8 e7 p- c1 q- Y& [5 }
sample = input_sample(); // read L + R samples from ADC, ~3 }* ]* N* ^: h4 s
output_sample(sample); // write L + R samples to DAC ] x2 W9 c2 u* T
return;
% S% F. _' k, y& x0 n}# R1 c3 m9 R! }$ m5 V' C
; R6 X, P9 l- i* K; L4 e( F3 zint main( void )
. T+ c. @' J, a{! J5 X) e1 j9 j# t% z3 n
4 z" ^' E3 D6 r4 S, ^" t
/* Initialize BSL */$ C3 f R" \7 a2 y L1 B$ c( y
EVMC6747_init( );
6 U0 J" f9 G+ k- p, r% v /* Call evmc6747_intr function */
7 A" o; \# v8 Y" o, h aic3106_init( );" r! l& a9 [, Y4 x9 X3 l
while(1);( K* `. R0 `4 C+ R9 b' j$ X n
}! @1 b- u* @3 {- r! J- ~# L7 w
5 R! l, A" ], V1 d& {
' I) V4 r2 t: K3 Y4 X4 o
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
: y; m, W* g% w" w* N7 t: _/* Initialize MCASP1 */4 F9 v6 \% s* ~! i
mcasp = &MCASP_MODULE_1;" q2 _7 ?0 @0 M& J2 {9 p
mcasp->regs->GBLCTL = 0; // Reset
" d. a4 u% y& S7 h. d3 S) p mcasp->regs->RGBLCTL = 0; // Reset RX- o1 l1 p! K% J2 Q
mcasp->regs->XGBLCTL = 0; // Reset TX, }& \7 k6 [/ M* z B: O
mcasp->regs->PWRDEMU = 1; // Free-running- t* w. t* {' j. I& D7 r
// configure McASP0 receive registers
8 I" J; a2 b7 I% F* q7 c4 u1 q mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
6 [. w# _4 ]5 r8 m! k mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 h3 }6 }$ Q T
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ I* s$ w7 A5 G9 E mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 W" s, u& _$ j3 a$ A
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side): f% D) P: L p7 ]
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
4 {4 c6 @" j% k4 ] mcasp->regs->RINTCTL = 0x00000000; // Not used# N M, V# L1 O0 ]6 E! x
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256' N0 \4 V& {% s. ^
7 Y+ M4 P8 {+ D mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used7 C" ]/ N& e9 G+ V4 B
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus$ s# _% O1 x( n+ @9 i
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word! z# X6 y* Z7 P7 k6 G
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16; K' V$ {5 v7 _
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK9 `0 K3 ]9 q" e( ^+ T0 d1 Z9 k
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
/ I3 D- f5 d: z0 J mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit1 x0 l' Q3 `+ H8 S* e! q
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
; L/ H. |$ z" o8 M
4 j5 V) Z' z0 w! G: v. \" i mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
! b9 w) R3 m! N- {. B! Y mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
. j! }" x0 B' K6 T$ A: g" m$ b7 l mcasp->regs->PFUNC = 0; // All MCASPs
) T6 j, V3 W" M7 f) o8 d9 R mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
7 t) d1 L7 R$ n% q0 x& |2 w: A% g) ^6 c6 w8 {4 C4 n( F6 N
mcasp->regs->DITCTL = 0x00000000; // Not used9 M5 J# i0 ?3 n6 e, e# T
mcasp->regs->DLBCTL = 0x00000000; // Not used
: f, f' X) a8 C5 Y5 D1 _ mcasp->regs->AMUTE = 0x00000000; // Not used
2 g3 |' Q5 q2 j3 i6 U/ Y; c% @ H# Q
F# T6 z1 L! S& I5 |3 |/* Starting sections of the McASP*/
$ |% T6 }+ n0 s2 t3 ] C' I mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; " W |1 @4 x3 B3 b( F) }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
9 p! d3 Q/ R( N- ?, ~ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
" s# n# q* P$ N% y. F3 Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
; p0 ?5 v6 K- }' `/ }: O0 ?2 G$ H& T" A. v
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
: V3 K" h6 z" a# g6 a: D9 F* Z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 Y5 t( z) d; u% C% r, v
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
3 C) a7 N0 M) I5 B3 h2 g/ }! s9 A% M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 \3 ^- ^1 i7 q6 n9 l/ C
' Z, x" B3 G' K" ]! R& q: t mcasp->regs->XSTAT = 0x0000ffff;
3 t! ? }9 O% F7 a0 h1 s mcasp->regs->RSTAT = 0x0000ffff;
* b' H$ O9 b U8 @- @
9 k* v0 M6 G6 }; ^ mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' a1 H% c) w# ~- X8 m0 r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
& T# y$ D, A4 ~9 ]& b mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
# l) q2 N7 w H5 \2 L) Q2 u2 ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
5 O5 C) h9 D. z/ X* K4 K" }! q, v Y+ ~0 ]& u B1 `" i, H
/* Write a 0, so that no underrun occurs after releasing the state machine */& U2 A; c& b! U" R% |. ~
mcasp->regs->XBUF5 = 0;$ R- l0 H/ R% V* ^
mcasp->regs->RBUF0 = 0;4 N2 j' k5 m" L
) J/ \8 r4 o( r3 ]0 H$ ?
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " P7 Y1 Q# c$ d6 g8 n, D+ e' b
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
. v) u( T7 k# m- F, c mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; - x9 ^) l2 w& \: q7 A. Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' f8 `% M) p) U1 w9 T$ Q$ ]2 E. w. i' _: y: X2 ^0 Q5 o4 M- N
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 9 [) f2 X* J" \* G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );; f# T- A( ^& k8 S$ l
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
# z/ d* r/ I3 n2 _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ N' b- W# f8 V) ^1 Q9 R! l
: P. S$ m" U( U* j* |/ ^ CSR = 0x0000;1 ]& @! j2 _9 p8 [0 Y/ |. s0 Z9 ^
INTC_INTMUX1 = 0x3d;' O8 B; ]' }0 w0 G1 p
ISTP = (unsigned int)vectors;
* ?# J% F, l/ L% w$ l+ H ICR = 0xFFF0; , K$ ]- \, p4 d' |
IER |= 0x12; ! ~- }5 V& J$ G* D/ H7 f, M
CSR |= 0x01;
' q) f8 p7 L8 D/ `8 ~$ ] z* b4 Q0 s
) Y4 z, O5 Y+ O* t% q+ ?# c3 q
) f2 E! B' e$ n% ^& ^
还有就是两个输入输出函数:7 b1 k/ m& s$ e. L
void output_sample(Int32 out_data)" n6 O* a" g, S
{
* D9 Z4 z. Z1 u' i2 o AIC31_data.uint = out_data;
- b, ^) J! x. v/ Z+ C$ ` Z MCASP1_XBUF5_32BIT = AIC31_data.uint;
) r2 p2 q$ C5 t* o}2 T a# X1 U+ [% I
% P+ S8 I2 H" h; v. M% b/ u. DInt32 input_sample(void)
1 |# d4 Y7 r/ |, r' C9 j{ $ X' F; b; W4 N/ V# {' d
AIC31_data.uint = MCASP1_RBUF0_32BIT;
- [2 \$ W' N* l @ n, x7 f return (AIC31_data.uint);
$ _* s5 o0 z+ z3 Z( Q}1 c& p: w# \5 b& ^. c
3 U" [& a6 I; m9 _) q+ n: U3 l6 [
|
|