|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
- E% G; h. K1 rmain文件:( J9 o4 K' Y+ Q }/ K( W
interrupt void interrupt4(void)
/ R, R2 E- \. m; E3 I* E \{
. b) t. n( B" E1 R Uint32 sample;( T7 Y9 l9 l$ b
* `; M7 I) w" K" f5 v4 U ^0 c; X0 `
sample = input_sample(); // read L + R samples from ADC: B5 U# q$ X- ]$ X5 ~
output_sample(sample); // write L + R samples to DAC 7 {+ g7 ^- ]0 }; z- q
return;+ s6 l3 }. b" M
}
' u" ~+ p; \4 V9 U, Z X! `8 n4 ]' m, ~' R4 [0 ^$ C7 W
int main( void )
; i/ Y) n6 D$ X. Q1 z{
; U# ^! W P2 _7 N, E
# f9 @* m2 z! T% ~+ O8 C0 k /* Initialize BSL */6 W6 r3 E: l/ k" v- u9 I R1 s( c
EVMC6747_init( );5 V9 q: Q/ k/ A: o
/* Call evmc6747_intr function */& k) e4 o2 w' x' y7 A6 b; y
aic3106_init( );
5 N0 h% X8 `7 l/ u E while(1);
9 K/ H6 Q1 f% @$ X+ {}
" s# v% s- \4 E# Z4 B
7 P& _1 k [2 @ ]0 d2 S$ l9 s% E w
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- f+ i$ F* F' k* y- f( M; x# r
/* Initialize MCASP1 */0 I* e3 e" o* T$ d! n
mcasp = &MCASP_MODULE_1; N: I4 S1 {! ]
mcasp->regs->GBLCTL = 0; // Reset
% B' P" ?* E$ P( h |& y9 U4 m mcasp->regs->RGBLCTL = 0; // Reset RX/ R, B& g) u6 w- e' ~, h; y
mcasp->regs->XGBLCTL = 0; // Reset TX2 o' x: |6 [! A, o8 o
mcasp->regs->PWRDEMU = 1; // Free-running6 E3 D% C* t: z6 |- d% c# @
// configure McASP0 receive registers, T9 S, d/ b+ d8 f$ r& v( u: [) i
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used' |6 S9 C( h" I- o+ O$ C
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 C6 }0 o4 M+ ~# e
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% O. r- z* ^; ?- p1 L5 ^ mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side): O: }3 H9 U- | t) }
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)5 e% c$ k/ Z2 H$ v! o( A8 A
mcasp->regs->RTDM = 0x00000003; // Slots 0,1 H. o; c2 C6 d( O
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ C* A) |* ~+ Q$ @ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2565 s8 c. C0 V1 D& q9 ~
& R+ i1 y1 W8 _( L& k' _
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used7 i! |# M. F9 J2 F: d) E* o7 g- x
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 @* Z* s2 I. ]# J0 Y1 p3 r- N' U
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* U; [+ R4 ?$ F, G
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
. i/ e' W t4 L3 g% { mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
3 G" \. C( a2 a! E3 Y/ L mcasp->regs->XTDM = 0x00000003; // Slots 0,1 k: M1 D! {7 {% z. [0 y
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit! v7 J" E- ^& t- A2 T2 Z8 y) V
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: h8 C* R8 @2 q- C, x7 U
7 k, @0 |1 }8 V mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 p+ E+ I7 b/ D" J0 l$ W( M4 [( N mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT& F Q1 L i8 M! }4 j; S) L7 c7 Q' T
mcasp->regs->PFUNC = 0; // All MCASPs
5 L! \1 N% K/ ^" R mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
0 F8 L9 s" ]6 b) I& c$ b
: O# O& L7 X+ y& ^ mcasp->regs->DITCTL = 0x00000000; // Not used
) L. B/ ?0 l2 {0 _! h, V mcasp->regs->DLBCTL = 0x00000000; // Not used
$ D! `7 H3 l' r) ?# g, C mcasp->regs->AMUTE = 0x00000000; // Not used. V9 |2 p2 Q8 k6 ~. B* E7 y
9 q% d! w& w% X' E8 S& }$ q/ t# D- a
/* Starting sections of the McASP*/0 I% z* n: ^! P# i6 J; L+ x
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 m3 G) _/ T. F/ Z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); % C) s; i5 n$ z# c; o+ m2 a
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 J# x! X8 _% J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );% F4 q# [4 q2 |
+ R* E/ R) b3 T6 R
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 0 r! f# T; L2 J1 [. z2 w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 Q q+ Q9 m0 Y7 B+ i
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 2 _2 B7 F, {4 m7 x3 e4 s% w% o
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
/ U* V6 g8 B! w, u6 W& f9 M: L/ r! U' Y- ~4 O
mcasp->regs->XSTAT = 0x0000ffff;
4 ?! z0 `9 ~& n" ~( h7 l1 { mcasp->regs->RSTAT = 0x0000ffff; # p/ A% ~9 \& S) Y
" W4 V7 L+ ^3 z* f2 i
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! s. B- }3 o* X9 e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
" r, e. P, m" I5 n) a, C mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ' ?0 ~$ q; c% w. J
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );1 e* ?: A' _. e) M$ Y) O: b6 r4 i
8 T% Z! @& ?% ^- ?) N5 e
/* Write a 0, so that no underrun occurs after releasing the state machine */
: k5 w: c$ }; i% {2 Y/ I mcasp->regs->XBUF5 = 0;0 w; h4 D" G6 B# A0 R/ E' ?' z, D. C
mcasp->regs->RBUF0 = 0;: s6 \" K5 g9 p4 m, d4 `+ G+ n
+ f7 M2 [; H7 ]9 J( q2 o+ z
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 z6 X' F) R5 K, M7 f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );: d7 `0 i: n% `, L/ ^. y
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 Q2 `6 u9 l, a4 v+ t while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); v- |: p* N* d' s
* q' W4 U! s/ {
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, O& @+ U. \0 a9 X6 A8 H. R8 n7 f& g9 p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );9 a3 h) o" y0 L
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; & |2 Q! ?0 F* G% x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );5 x# w& A( |1 T; p: N
/ w1 O S' b% V$ H9 Q CSR = 0x0000;
+ c2 z# B7 @3 i INTC_INTMUX1 = 0x3d;8 g8 C: P) _ `& A5 `
ISTP = (unsigned int)vectors;: V# ]! R% }" c* ^; ]
ICR = 0xFFF0;
3 p8 t6 x; H H' Q: M* d IER |= 0x12; & S- t7 ?& e6 V; v% O$ g
CSR |= 0x01; 8 A1 l5 n) i! z
5 ^# p- r" B8 n* N# i1 z8 t; v4 I5 v! }' e
{1 Q5 j- [% \2 i7 Y' j
还有就是两个输入输出函数:
$ L( e! j7 Y' M( m/ {7 C5 J" Q" v2 Fvoid output_sample(Int32 out_data)
6 H# [5 X" i4 B( p; b{
" c% N/ Q2 n* J$ x: K# V AIC31_data.uint = out_data;
: r5 _2 y3 L, z MCASP1_XBUF5_32BIT = AIC31_data.uint;2 J) _# P( K% q7 `8 x$ l8 ~1 G" n
}5 s' }) u0 S& p9 d$ n! V
3 I! i( D& m2 M# h& z
Int32 input_sample(void)4 A& b+ {1 R) G7 C- D4 E; b
{ A; n9 W: R3 \ V
AIC31_data.uint = MCASP1_RBUF0_32BIT;3 g* P; ^. w: h- k$ g1 L/ o5 V) D
return (AIC31_data.uint); x: L3 c# y' |5 W: a, k: q( U
}& [7 X) Z4 g& y* Q u* ? N2 `7 P( Z( A
9 {7 g, B' v$ W3 g7 @5 u# }
|
|