|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:9 T- b J) E7 y- k$ X3 p5 x1 |
main文件:& N" {9 _* G# l) }2 e- f0 t6 [
interrupt void interrupt4(void) 5 z; F/ s$ B- ]' L& w2 h
{
9 ~* c* _" G: M$ W1 P Uint32 sample;8 A' f4 c, D3 I
6 S5 ^8 l6 e' }: x$ r# ~ sample = input_sample(); // read L + R samples from ADC$ K4 B$ _5 s- V" H
output_sample(sample); // write L + R samples to DAC
) E+ @2 |4 Y( E. B8 ~7 p return;+ e6 x4 Y$ B7 X A5 f7 f1 B9 ~
}
i1 f1 R1 p& T' j% n/ G
% b2 t3 F# ~4 |/ ^3 Zint main( void )" S- G4 [0 M8 W' `
{1 @! \/ M0 f( n# B7 w- W& U
( N% Z+ q2 S2 @9 h5 a U. @# ?1 p
/* Initialize BSL */
: E% ~9 {9 u* K* P7 C. g- G) V2 S EVMC6747_init( );+ s! R9 H- M& L j
/* Call evmc6747_intr function */
" M$ B" b$ M8 d* z1 k aic3106_init( );
. T3 e& Q) J3 O while(1);
- S# h3 U8 w; Q2 T. d}" m/ a4 t7 }( j# f7 x5 s
3 q# q% L5 h ?' }* R M" }. g- q. K
1 n* [* l3 n5 H$ y N' taic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# G6 Q; p# O' {' _, k: c/* Initialize MCASP1 */
$ m! k% `/ G$ N+ ? mcasp = &MCASP_MODULE_1;
6 g) `3 ~+ B+ h/ ?3 I* q- O2 W mcasp->regs->GBLCTL = 0; // Reset9 F( I4 A" _# V$ p6 { `6 i' M
mcasp->regs->RGBLCTL = 0; // Reset RX P& e. R) `: K# ~5 L, s
mcasp->regs->XGBLCTL = 0; // Reset TX
2 \. ]9 u$ V, h& G$ [$ C mcasp->regs->PWRDEMU = 1; // Free-running* T2 z; ]6 ]% w3 ^6 V) Q' N0 ]
// configure McASP0 receive registers
+ l% d$ j; _# A1 N1 G mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used3 K/ {+ d1 K' R; T" A, ?
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% h% J& N8 @( u' m3 E mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word7 Z0 O7 F1 Y8 B f1 E `: z
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ l# [1 K3 e- c" P2 @/ x% a' Z. S# S
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)/ H; ]7 W( ~$ \
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
; o; z. N# ^5 X; ^ C mcasp->regs->RINTCTL = 0x00000000; // Not used6 `+ a3 f b9 n1 R
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
- O) p9 A# K& y6 ?6 X; Y$ { g. T7 D4 F$ x! u2 N
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used9 x" z' }9 w2 z9 N+ J2 O
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" U5 ~3 j5 R. S( V' C mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ y: ?' [: x. C$ P G mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# D' p. S( j+ ]4 w2 ]% g8 o mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
, V8 u" `! d8 ^- D0 r mcasp->regs->XTDM = 0x00000003; // Slots 0,1
) o0 k, @6 d* S$ K/ E mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ M K; ^& y$ i. A# A
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( J7 F. N% A, K% D7 V4 K; ~5 y
' |) x! r" y: o) V: J* Z4 F mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN4 g' @8 d6 ~. s
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
& x8 c! B- q4 o4 f& d mcasp->regs->PFUNC = 0; // All MCASPs3 X1 l8 R5 a4 y: t/ E& G( p$ p. l& o$ i
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: A `7 F( b$ P- V) H
w( o$ T$ g9 B# I, W: l mcasp->regs->DITCTL = 0x00000000; // Not used
6 r \; W$ t1 p8 y6 S$ b9 N mcasp->regs->DLBCTL = 0x00000000; // Not used
5 `/ ]4 o2 w: X7 N5 D mcasp->regs->AMUTE = 0x00000000; // Not used( ?$ G# x' r" z
9 E6 w- U$ b3 c0 s
/* Starting sections of the McASP*/
/ e! X6 E- _* r- B; ^) s mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . J' s6 u4 X8 J, J+ ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); " \# R; U: v5 _% C: Q5 i- z
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ( r0 j @0 m* u" a5 w& Q5 w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); A" N* N# ^; F H- z8 l
# Q% ^) W& T$ L \% Q3 S+ A mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
V: ^7 u/ A$ c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );) O4 \- \5 |3 |5 z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
9 v: D! v6 X7 p. s+ _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );. ~9 i; W2 e) E& t5 m0 \+ w
( H# _; @8 ?9 W4 ^9 \ mcasp->regs->XSTAT = 0x0000ffff; 8 H. S' `/ L- B& x( I
mcasp->regs->RSTAT = 0x0000ffff;
# D* C; i4 ^) d$ V
$ c4 ]8 L$ G5 Y, N- w+ i mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. t; _- e1 p: ^4 y5 F: ?0 L+ v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );; |. x0 n( f5 P; ~$ {$ [$ I
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; , X# S) h" f, K2 I9 {0 y
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );) O& w) W% w" p/ X V" O
" p( f' x9 t) ^6 | /* Write a 0, so that no underrun occurs after releasing the state machine */1 B) y2 W; i# `
mcasp->regs->XBUF5 = 0;
' n7 A4 j8 |" @9 ~ s. Y mcasp->regs->RBUF0 = 0;# J0 e8 }! P, E6 I! q/ v
! N# G; X+ c E mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 v1 o, ?* Z4 x. T1 ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );* `0 i% }( D, Z0 |& M8 D, h
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 9 g& j" v- s' S( |) v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 P' M( i* u5 g0 o4 y
. ~2 @4 I) n. p2 K. _* H& c
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
" b6 ?2 d: q& ` while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
U2 U" g5 c; U* n& D: v6 r, M mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 m4 ]& J/ X; f& |* x | m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );, d" u9 Q+ D+ x% L
$ C; U1 m# i; k% n& i& F: m+ q
CSR = 0x0000;
! G6 u1 h4 Y) c% Z INTC_INTMUX1 = 0x3d;9 h8 P; o& j1 d4 U) r7 n) A
ISTP = (unsigned int)vectors;8 S) v! c: U* s9 s n
ICR = 0xFFF0; + p4 a7 `' P5 V( A
IER |= 0x12;
) V, h5 v& x7 { CSR |= 0x01; 6 w c' s+ M* q' ^- M
1 \/ C& n3 b9 W* v5 W- y0 [: @" o9 g) O* S* w
+ D7 ^) ^ I" B2 P* s还有就是两个输入输出函数:9 I5 J' ?: R' q8 y& _. [
void output_sample(Int32 out_data)
! r+ [7 f3 o8 c# k0 H{
* y, ~ s9 G2 @/ O6 C AIC31_data.uint = out_data;
2 x7 d" D8 o# @. F P1 i9 q) R MCASP1_XBUF5_32BIT = AIC31_data.uint;
# n3 N$ [! q4 u& ]. A9 y& N}, @# I# a) S% }- F" a
! E+ h3 G! Y% l2 }9 g+ e! l1 ^Int32 input_sample(void) Y4 ?1 H4 n4 \# a7 L. @* f! y
{
- N, U4 c |( {3 Q' D. B) v! G AIC31_data.uint = MCASP1_RBUF0_32BIT;7 i, {2 G5 e1 Q) _; e/ x% W
return (AIC31_data.uint);
- o5 H& U/ D0 N+ Y$ J+ C9 H! O}
, T8 ?! v# t' w! e8 h4 F+ t& @6 W- G/ u: r! W
|
|