|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 M& e. [# i) Q3 Vmain文件:
) V9 r$ {7 G/ e. a% xinterrupt void interrupt4(void) . k) Y7 V% j* f. X
{
& {! P' u- t9 n Uint32 sample;4 L' Y5 x M9 V( \$ E/ y( H
) e- P+ x. [5 N1 U4 G
sample = input_sample(); // read L + R samples from ADC) m) R- `1 C5 O) z; o3 Q
output_sample(sample); // write L + R samples to DAC 6 V( m# N5 m$ r. s
return;0 G- @0 O! k, s& p$ U$ B; v) s& Z. C
}
0 H( {. j( \( P: r G @; u; h1 Y' O' ]
int main( void )
/ d& d( f4 X( m, ?5 I{% k$ A6 _: g3 S7 f9 H2 O
S% Q0 Y& F4 ]
/* Initialize BSL */
7 J q+ ?/ l/ C2 k EVMC6747_init( );1 v3 Z$ Q$ C4 H5 I8 x: l4 T
/* Call evmc6747_intr function */
! z0 b# h# s! ~; S- {. e y aic3106_init( );8 Q% a6 U. T6 Q' w) ^
while(1);0 F) q# C, X5 n7 _; W+ |; x
}
, a& H; ^2 @. \ d/ K- R* v# X' r) [
; W/ r! ]7 ]: X+ j8 v9 paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题8 I4 v1 q2 _* r2 o& X8 |) f
/* Initialize MCASP1 *// Q& e# Q# v4 s2 d0 ]" h
mcasp = &MCASP_MODULE_1;! W. |" i! j! h+ e2 ?: P
mcasp->regs->GBLCTL = 0; // Reset' b1 t& h# ?; U Y6 _* ^3 W5 ~
mcasp->regs->RGBLCTL = 0; // Reset RX4 X& r6 }% ]/ {/ F6 y
mcasp->regs->XGBLCTL = 0; // Reset TX
( h9 g6 p. x) u3 {0 `9 W mcasp->regs->PWRDEMU = 1; // Free-running2 q( I, Q* v% ^' c
// configure McASP0 receive registers
9 P$ ^, P7 O8 U4 u% K7 ] mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used( l% p. X+ J+ M1 A
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 ~$ T8 Z( d. }3 b$ C2 S mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( ^! U- g0 X. Y8 r& \ mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* r9 B$ t& B, ?8 ]0 S0 j mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)8 A/ U/ g9 E! W# k! U( [
mcasp->regs->RTDM = 0x00000003; // Slots 0,1+ U" [& X- b I8 T' I+ Y& x
mcasp->regs->RINTCTL = 0x00000000; // Not used' X1 _$ J* x& k9 l$ U- B
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 }6 |1 H7 q$ I
& d. B) S: u, L% s2 d0 J mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used5 s y8 a7 t4 m( }/ c9 f
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( G- }! u7 z; t1 u* j, @1 a mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 ]& z+ K: z+ q- v% \
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
" |; w, d/ H8 S5 a, @( i# {) I# {- Z mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
* _) I' Z3 N: ]8 H( d2 U0 ~ mcasp->regs->XTDM = 0x00000003; // Slots 0,1+ ]4 ~; g6 }' @3 A
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
# o; }5 P% \8 j- l0 x; y* ?; D: B1 a: g4 L mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ E0 ?8 E6 _3 L) c
7 z. |, m, m! b- n/ Z4 E mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
3 j8 g# c* P0 d) e mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT* z2 e# N9 i' ?5 E7 |/ S0 Y
mcasp->regs->PFUNC = 0; // All MCASPs
5 d o% M9 j" \& F- ?! Q mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 N2 _/ ?: N/ U9 s Z
' @" ?! Q& ]$ U; }* _2 k4 H6 [ mcasp->regs->DITCTL = 0x00000000; // Not used' g( R' b& X& R' K/ W5 k
mcasp->regs->DLBCTL = 0x00000000; // Not used! l4 c4 R, u: ?+ z& E
mcasp->regs->AMUTE = 0x00000000; // Not used
4 G. x! v, r$ S- b
7 x, o$ I5 g$ ~9 C! R) z* h7 g* Q# t# e/* Starting sections of the McASP*/& a& J# x% ?0 j
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; # \. ]1 [& ?" w- f4 V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 9 w( L4 c! @2 P1 ]) G8 k+ o4 O
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; % @8 ^+ s. C* f( r( T
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
4 @ O Z" z9 C5 ~ a5 K9 ~( C, W" Q. K5 r! {6 |$ {
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . U: z. [& f6 A! Q
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
G! J- \5 W. c* u9 v mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 3 D* p( I' x. z7 \
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) v" K r9 T3 o% D; M2 B" i
2 o$ r! x" u! b% j mcasp->regs->XSTAT = 0x0000ffff; / p( f( D3 a0 ~
mcasp->regs->RSTAT = 0x0000ffff;
+ V1 B5 ]" e+ A" u6 ^3 r1 O6 r2 f6 F0 {5 s! z/ u0 d( w2 C
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;. M0 i- C7 Y7 C% _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 L: |/ {; }6 s2 t7 a1 r4 v" v' f
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; $ ]1 T3 M5 m! j% ?/ N, U
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
4 d2 U1 F( U1 d! _/ E p6 N1 w* @+ C7 \* J
/* Write a 0, so that no underrun occurs after releasing the state machine */
, h2 ]' R# Y/ C- Q/ u _: z mcasp->regs->XBUF5 = 0;
' A* Z- u% ^( ?7 _6 k( u mcasp->regs->RBUF0 = 0;2 l' }% `. [0 O3 e# }
' V# i4 [$ g% O mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
1 h3 E. V8 K5 s# O0 M, a* \* ] while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );8 u# l+ {$ c9 l+ ?
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: _: c) T A6 l1 W* k$ L- a, G& o: ~" ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
) N2 ~$ |1 W% ~5 K- A9 D* {0 \; ]& h8 B/ O+ o q7 i# v2 i9 ]
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 B: u- b2 P$ Z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- D& B. r1 B) {) U( z+ N
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 j# x. y3 A/ g$ D$ B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 L. m# @) I' e$ F' V! ]
% n7 L! K& d7 c- k) C3 v CSR = 0x0000;
. B9 f& F; y- E$ r5 e' V+ v8 F INTC_INTMUX1 = 0x3d;
7 w( ?7 j1 [# b6 _6 d! X ISTP = (unsigned int)vectors;" q0 c3 J: ]/ ]
ICR = 0xFFF0;
, W1 ]- G" n" I5 K; Q IER |= 0x12; + ^' k% p# w E
CSR |= 0x01;
- i( ]6 o/ @4 D3 p
0 o9 X8 ^# O1 s% i% L' ]9 o, ]# B# S) ^
- P& V: q7 ^' |) C5 Q/ D2 z还有就是两个输入输出函数:
5 e1 [/ Q# Y+ Z5 vvoid output_sample(Int32 out_data)/ x0 q' K9 X; n
{
" k: F" z2 W2 ? AIC31_data.uint = out_data; , w+ j7 J. C0 |1 Y! b0 @: q* Z
MCASP1_XBUF5_32BIT = AIC31_data.uint;
- [9 b" V$ `9 M+ ]* p}: B7 N% ` _/ y0 N
: F9 Q/ w7 K6 ?# K, h5 `5 x$ R( e: @0 K. LInt32 input_sample(void)( q: V& B9 e' \6 E, J# q! @; G+ V
{
" z. T& D: u4 _8 x3 L0 A AIC31_data.uint = MCASP1_RBUF0_32BIT;
) V" F8 e( x, |1 a. \, W0 h4 Y return (AIC31_data.uint);4 v$ f$ s( K/ S+ W8 x# G
}
2 N) |. d" d- c! o5 H4 s
' X2 P4 { l2 F; z- L2 e" V5 @ |
|