|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 n; K0 l# b0 Y' M- {$ W$ imain文件:: B# l( }" X: |1 `$ d }
interrupt void interrupt4(void) 3 O. j7 f [* J7 ]" B! @! O2 G7 O
{
' H3 F2 R2 l( P0 Z% E% m Uint32 sample;
. R" D$ W2 _; E9 c4 s
$ O9 z# B3 m! c+ ^5 T sample = input_sample(); // read L + R samples from ADC) P7 p2 o' j% O A) e6 h/ m
output_sample(sample); // write L + R samples to DAC ( ^' g7 e1 c( a& u+ U
return;# r% k z+ x0 w* _
}2 ^9 E8 i1 d& j; k, M! E! f
' Z& Q2 f% o. V' h6 N5 c" G" s
int main( void )
5 R( e$ z- C& V8 E2 ^7 Z% z{
- n. d! V4 I5 K5 g
3 ^' @+ N' e0 {0 V$ f* v H2 R$ J /* Initialize BSL */
" G% V5 g' m8 C" M, {0 K8 d8 g EVMC6747_init( );. b& Z' o" F0 y- E0 ?) i6 v5 F
/* Call evmc6747_intr function */* T* p, A0 I4 t* J4 m
aic3106_init( );0 D* ]* N0 N& l% Z8 I# A
while(1);
) n: y9 ?+ K5 ?- Z}
7 z# U+ y, q% q3 I% Q7 E: k5 d
/ |+ _# I( {0 g6 o5 y
3 [5 F; K: |; [4 y+ E8 gaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
9 O. A; S" G% p% T' ^/* Initialize MCASP1 */% q' a' ~5 p4 W: X
mcasp = &MCASP_MODULE_1;
9 X" y. `7 S) r( L0 u mcasp->regs->GBLCTL = 0; // Reset
3 D( X2 C+ Z0 R mcasp->regs->RGBLCTL = 0; // Reset RX
, {5 [% a- |9 I; u mcasp->regs->XGBLCTL = 0; // Reset TX/ B8 Y$ Y" l( L y7 d9 j0 D3 s
mcasp->regs->PWRDEMU = 1; // Free-running! Y+ A. U4 O$ j: |
// configure McASP0 receive registers
4 F7 p; V) I. C mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used* f' G$ \# D1 B) c% R
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus9 G. |" R1 x& @/ T, s5 F! I7 [ |
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" c- w6 Q0 c j" U4 d( |9 ]. [+ |' b mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
+ E) `' m9 _. k3 G3 f$ Y+ H; U mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)+ o" ^ q2 }" M; h, x" j, S
mcasp->regs->RTDM = 0x00000003; // Slots 0,10 h0 B) A9 I/ T/ {
mcasp->regs->RINTCTL = 0x00000000; // Not used
- e- q2 P/ X! |2 L8 X- v- o mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 F( D4 a" _$ ~
8 p3 D* B8 P+ s Q1 C; a% F) _" I
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used' H1 Q M% b6 k4 a8 a6 @
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 [) S7 I, T% W3 W mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* R7 V6 u$ H- x7 K4 G( w& ~
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16: Q* O! \8 a3 n1 m3 {8 [$ P
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
! \1 C& G. w1 d" S# g8 a8 B mcasp->regs->XTDM = 0x00000003; // Slots 0,1& n9 _. x1 ?; d
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
8 P/ b) v, _/ U. K mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 ^$ @; ^4 g/ W* r; T
, b. \* K' h* W; [+ _, u/ T7 t mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: i9 N/ J& ^) w3 u: d mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
' S$ F6 j% M# c mcasp->regs->PFUNC = 0; // All MCASPs
9 _, `$ h7 F* L& m+ R mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1' u8 S$ `4 \9 V8 s0 B
" G) |5 I( R* [
mcasp->regs->DITCTL = 0x00000000; // Not used
" z" X# u( z# C+ |2 l! z, l mcasp->regs->DLBCTL = 0x00000000; // Not used. {' o3 i5 o+ X' t7 g; y+ J7 E; G
mcasp->regs->AMUTE = 0x00000000; // Not used
, M9 K, Q6 t7 |$ W: |4 G6 K5 S6 B' o u/ z6 K% w* z
/* Starting sections of the McASP*// {; U8 N( |& h, [
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! h4 c# \4 G3 |0 y# } while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 8 j7 M8 ]2 O1 V* ]) n' b+ ]! x
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 p0 ~2 c. A Y( E( U% `8 \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" x m5 a$ I& x( y9 H) Q9 t- G5 Y
7 F( X" K9 K4 K) R mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 Q9 i; v% S5 l5 l while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 A8 H9 \9 R" M0 r
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 V3 p- y2 S# ]1 o2 Y! b* Q, Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 Q( L* `8 w' W r% P6 `
/ J+ D3 u; ~! Z, _. R mcasp->regs->XSTAT = 0x0000ffff; 3 ]- b" y, D: Q V8 j* g$ n2 t7 ~
mcasp->regs->RSTAT = 0x0000ffff; ; W+ o. }2 h3 Y4 w5 Y9 M8 }
) m1 o. {- U2 s) h0 u
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- |! C. b( y, v) H8 e1 `) L, I; d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ E% Y: y4 c( t; z$ V/ k
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* P& F7 U3 f$ k7 r9 Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
( R+ s; f! y! B/ K( \. s) D k# I% q- x* w) W: } x/ W
/* Write a 0, so that no underrun occurs after releasing the state machine */
2 Y+ ?7 J. t! |$ I4 ~ mcasp->regs->XBUF5 = 0;
; K7 d7 S& ^- ` mcasp->regs->RBUF0 = 0;
f9 g4 {& K/ F& }: c2 _, `4 ^) Y
2 [# Z+ Z9 o0 g2 `, ?! p3 ] mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 2 t0 C( V1 O' T) {
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' S& i6 X/ e4 D4 M, E& r* l$ Q" X mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 A$ M" J/ W3 n+ r) } while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
4 M, _9 i1 T0 a4 {' b" `+ m& X* g% r e- W& ?. @
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
; v8 K1 ?& o& d" A4 a: e while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );9 {; \5 x4 b( E$ I& a2 P' ^
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; $ H; Y9 G X5 q% x
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );) q1 T- u4 G. b- ^! w
: f/ j/ c3 B( V0 ] CSR = 0x0000;
" u: `+ F+ l6 O& a% S* ] INTC_INTMUX1 = 0x3d;
- S" Y* u- g$ t ISTP = (unsigned int)vectors;
1 `2 ?' Y5 b; X' X* b; F0 `1 D: W) _ ICR = 0xFFF0; 0 j/ P9 f3 K, \$ s
IER |= 0x12;
/ U/ Q: H9 z( | g CSR |= 0x01; - i0 [; f" G) {6 s% L
5 T3 `+ }2 {2 i: W& C3 x# ^
, C0 N5 V& n% _- |5 `
0 ?8 E0 B3 o5 m$ |, v" e5 k还有就是两个输入输出函数:
, Y S( z" V& J# r' Pvoid output_sample(Int32 out_data)
; q% ~7 z2 I+ O, ~' ~0 K4 T6 I{0 l ?# y! u8 ?8 h4 F- E
AIC31_data.uint = out_data;
. I6 P" z0 f% e# M2 k MCASP1_XBUF5_32BIT = AIC31_data.uint;- ?+ @3 y7 D5 z* s! B: k1 H
}) G8 ~* r! h: D6 {& ?+ o
* `- ~7 d- ^# M" z( e
Int32 input_sample(void)) z3 j/ p+ c2 {" A! ^2 ]4 L# C
{
* U9 C6 u- u0 P- p AIC31_data.uint = MCASP1_RBUF0_32BIT;
( ?/ x3 m$ K' ~) m9 z* [ return (AIC31_data.uint);! ^" _6 s" Z1 V5 n( z8 f" N7 Z7 {
}
" c- O# p* k6 `, ^) J. s0 H3 p+ W* K, n* O! T, f+ \
|
|