|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 h' r3 g% t5 ?) b5 cmain文件:2 z I$ L0 O9 P7 R
interrupt void interrupt4(void)
2 Q3 @& O. F9 X. Z{
7 K9 J/ \! {( ~+ Z6 ?: F7 T8 P- E( K Uint32 sample;- F8 y4 z# h/ x1 Z: M( U" d8 n
. Y: L. e: v4 ~
sample = input_sample(); // read L + R samples from ADC. Q4 M7 ^- Z" `0 R* _
output_sample(sample); // write L + R samples to DAC 8 P5 p& y0 v H, q4 `
return;9 U: Q5 Z! c$ x5 U( q
}0 ^# w* O6 \; g0 M
1 N, I& \9 D' n! lint main( void )6 o$ ~/ ^ e/ r: f1 a ?. g' ~) s
{
* e+ f; O& ^% q1 b8 H# `
: j" a$ K9 ^3 G! O, {& k$ ^ /* Initialize BSL */
; H& J% o: `1 G- ?( \ EVMC6747_init( );$ t( C( T" M6 ^
/* Call evmc6747_intr function */
5 j7 i: Y* ~1 C: O, l, s aic3106_init( );
3 e! M' b1 L' q2 v5 a1 j while(1);
& A" G# X( I7 k0 L}/ `: B( _: H! s/ y& p7 b
, u R; w9 k9 k; h @+ {" l4 m# W q6 D
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- n6 u Q$ F' Q. z& N2 c+ w1 q" b
/* Initialize MCASP1 */6 z* T' e4 W! W! s0 a3 d" ^2 f# ]
mcasp = &MCASP_MODULE_1;' j$ E0 N- B) Z) Z
mcasp->regs->GBLCTL = 0; // Reset
! m7 c; K0 S& }7 U7 Q. ~: B mcasp->regs->RGBLCTL = 0; // Reset RX
) {5 x/ U" q& D% T2 V8 x" O2 X mcasp->regs->XGBLCTL = 0; // Reset TX+ U, m8 {+ Y+ c r0 P/ z& ?
mcasp->regs->PWRDEMU = 1; // Free-running) b7 B% V* ~$ L' M% q, g# ~6 \
// configure McASP0 receive registers
3 y- b% ? I) _5 {3 `% l mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
4 W$ w$ ]7 L: j( t( E6 X2 M) ?8 W mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
' E7 D1 V1 @2 e6 j mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
0 ^1 |* t( y; [, q mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
6 \5 R) F8 v% j& P9 z mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
& v( ^, J( a0 O( I mcasp->regs->RTDM = 0x00000003; // Slots 0,1
8 h: v9 D2 v; e/ }7 \ \/ w" v mcasp->regs->RINTCTL = 0x00000000; // Not used& V+ z9 e+ l; F7 g
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: h/ n: l- p# a8 {' |
/ X+ B! g: I' a2 ~- v0 | mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used7 f7 K" w' P- F5 Y& y
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) C( L0 G; T2 C9 P# B3 A
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word) i7 [5 x* F u R% _
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16+ O3 c" E; i6 [ j
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK; K2 j9 t' d/ I, ?. X4 T
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
# K, d: [! w/ T7 R- b% a7 ^, Z. G! J mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
# p: ~/ }+ M0 S' J% X/ B mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ v' F1 l# t* A9 I7 G8 k5 E" n! n
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
* {9 s/ ?, Z: `/ h/ m7 l mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT) i) V& b% d/ @, ?. O& d3 u
mcasp->regs->PFUNC = 0; // All MCASPs
, w2 P+ Z; |" C0 r mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
, m. f5 h2 {- q O5 \ ~
, A) C0 F7 ~! b9 c+ ?9 N mcasp->regs->DITCTL = 0x00000000; // Not used$ o. d+ B0 v7 C
mcasp->regs->DLBCTL = 0x00000000; // Not used/ Q w) n4 o0 d9 ?7 y
mcasp->regs->AMUTE = 0x00000000; // Not used6 G+ o) D; ~( C7 L# W; V! Q- `
! T6 ]( \( F" C; D4 n$ W
/* Starting sections of the McASP*/
: X1 e( s( F8 [2 |; W mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" A* I" H/ } c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 9 |- r' y( G2 a" U8 a8 a: w
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
% Q7 Z2 J/ |# \' } while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );: ~" ~, q! A8 E) g& ~4 e
" {9 F- w6 ?' P( D* J8 _ mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
" _) E g5 V& m: I8 r" J while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
, m) B$ E; @, a) w8 q mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; / \3 m6 e: ]1 n2 e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 k- y) |9 z3 H& [8 j0 u7 @, X$ o: t# M
' z* P Z% Q. O! M mcasp->regs->XSTAT = 0x0000ffff;
! m+ |- B3 ]( ^& @ Z mcasp->regs->RSTAT = 0x0000ffff; + U' O3 n4 L8 D6 j& I0 r
' l2 ]* V! K9 W7 ]
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ s. I: A0 j1 D8 F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- o, v T" H( @2 U }/ p5 M1 I
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
P- f( P* r g: I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
3 ?8 P3 e _2 D9 ]' {4 L( _
% t' W' t v# ]8 r! u0 \+ ~ /* Write a 0, so that no underrun occurs after releasing the state machine */: B5 }/ C7 a+ v' P, ?
mcasp->regs->XBUF5 = 0;
% R: c1 a T# n5 e6 V2 a mcasp->regs->RBUF0 = 0;
8 I8 t0 [& }6 K% _; l" K9 U+ O% k! K9 U, D# f
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 |% c, u+ @; l! s1 q% E1 V
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! X# S# Y' L* e& A6 x, b mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
- ~" y! X6 d: [& i* I while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
2 b5 e6 Q& P4 c5 Z' q- X6 J# ]1 Q. o; [: P0 l4 P- A
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
8 ~; n+ z8 C& i( F while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 ]! A8 u( @$ k mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 6 g- r7 T1 H, w6 E: g- u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
W. O4 v0 [4 r# Z4 `0 W0 i7 z9 e$ q! p
CSR = 0x0000;; x, [) k# V7 J% @
INTC_INTMUX1 = 0x3d;
) P$ c' F# \ F$ }: u$ I* i$ H ISTP = (unsigned int)vectors;: ]6 ^- s0 o+ J- H- s
ICR = 0xFFF0;
I0 a. x) V! c: s! I: e$ b* V IER |= 0x12; ' ^0 V4 y0 S4 H5 i
CSR |= 0x01;
7 ^7 {# O, K. @$ T
" r( H! \% E0 [# M, Z7 H7 |% {0 K. u7 ~, n0 n1 W# {: [
3 ?7 P& I8 j- H3 F: D; s4 a还有就是两个输入输出函数:
/ F |$ f, o( P2 Gvoid output_sample(Int32 out_data)
) l4 {4 H% E- _. ? C& r{
5 d& }9 Y8 R. y+ i9 ] AIC31_data.uint = out_data; 7 Z+ v2 Z9 J4 z* t3 U, Q. e. _
MCASP1_XBUF5_32BIT = AIC31_data.uint;
( x, Y6 @. y3 L2 a- X( |$ d+ |. W2 f}, r2 @) |3 v9 W4 C
+ w* F% N2 o" _- b1 t0 KInt32 input_sample(void)
1 P* y4 e1 u; ~9 L$ v8 H+ V{ 2 G5 t8 E7 K, ]8 G" L
AIC31_data.uint = MCASP1_RBUF0_32BIT;
+ e2 H! ~7 `& d; u& {" s( v. m( l: N return (AIC31_data.uint);
+ v- w0 {( Z, P} B& J4 Y; z+ D$ h
: P& v/ f" U2 v9 L! e; K
|
|