|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 S1 G" J# {6 T
main文件:: Y+ F5 D" N; \- W9 ~' D7 h3 V' A
interrupt void interrupt4(void) ' O8 w: j, P; V6 U! C3 H6 O
{8 l0 I/ ^/ S4 z$ A
Uint32 sample;6 K+ v2 x8 h# l5 @6 i
& T1 y& p, b0 X* X& ~: O+ ~- R2 c sample = input_sample(); // read L + R samples from ADC
& E8 B+ ~- A6 X0 Y output_sample(sample); // write L + R samples to DAC ' I' q( |# T3 G' i# T% P+ p5 h6 l
return;) @( s/ a3 C% ~
}! }7 U- R7 c& d9 |
9 P7 j% Q9 z4 Y7 c: i0 a1 Q
int main( void )
7 L' x2 X) c4 h% `+ Y{! C) C. M3 U( L; Y/ P$ ]3 \
P" O/ Q+ W5 p3 G; i! R /* Initialize BSL */
- W; I5 r5 K3 c6 Y9 ^4 g EVMC6747_init( );
2 Q! V5 z: K9 t /* Call evmc6747_intr function */
5 H+ u/ J: ]4 s0 h' j3 g, S2 p aic3106_init( );! C8 }- _0 }& _% @. T
while(1);
9 U: S/ P. R: l! h1 q}
9 G. a- E7 J: n0 b, `2 X0 W9 P
8 h! ~2 c3 |4 E5 I
0 s' P6 P F4 ^, vaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& ?( B% O5 z$ v: a/* Initialize MCASP1 */
0 w: H# P7 U' w4 D mcasp = &MCASP_MODULE_1;
8 X0 j' X* r {6 O% k mcasp->regs->GBLCTL = 0; // Reset
% l' s0 ?3 H* o9 b# X7 P- Y8 i mcasp->regs->RGBLCTL = 0; // Reset RX7 f- |, G5 l2 |* }- h0 e5 V, ^3 @
mcasp->regs->XGBLCTL = 0; // Reset TX# t2 Q! V" X' f6 F
mcasp->regs->PWRDEMU = 1; // Free-running
" K5 w+ [/ q* Z0 x; I; [5 f; l // configure McASP0 receive registers
( b7 F8 q6 x/ U mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
% C( T- b7 s% n9 k+ r, m- V/ }5 W mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 @3 Y6 k2 Z% u7 p mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word& K; A# k: }& F' x7 v
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)1 N+ x9 h- j1 U3 }1 j/ A5 L2 V
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
; m4 O, b0 n8 i3 z+ G Y mcasp->regs->RTDM = 0x00000003; // Slots 0,1
- t9 I9 b9 ]" `% y5 Y mcasp->regs->RINTCTL = 0x00000000; // Not used
$ C5 f! B' y. [, i% s mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% u" s5 s' V( o( f8 W
: Q" A2 P" Z3 I7 X mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
0 j* y7 C* _* g. J7 P, S mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. C% ^* O! o. n. f" [
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word0 y- E* a; _3 f- s) D# b
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! G* S" `1 _3 p4 h' y; }* Y
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
. t) k1 V1 S9 s' A7 @ mcasp->regs->XTDM = 0x00000003; // Slots 0,1+ S7 g5 N7 j+ q7 I( F' ^( g$ l
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit: @ {- ]' h9 ^* S' V
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256. M6 F+ H' | S/ V
2 [- g$ j' I! y# |2 h! s% k
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN9 B! F4 B8 f' |- ~5 ?( C
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
5 W% P3 G* L0 F3 c mcasp->regs->PFUNC = 0; // All MCASPs
2 w( `* |, ~. o mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1$ ?+ f# J: O& w& A' O
% d& K: ^: r: z8 }; j; O mcasp->regs->DITCTL = 0x00000000; // Not used
: x4 u/ X( A9 I# S- `7 ^ b mcasp->regs->DLBCTL = 0x00000000; // Not used
) Y+ ?) o0 ^! f7 w4 f. W. F: I- }4 g3 z4 H mcasp->regs->AMUTE = 0x00000000; // Not used
) V7 R) e! ?1 k0 s6 D" L) m, s; A0 b
/* Starting sections of the McASP*/$ v. i9 n5 b6 `$ b+ V* K
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; " v! t/ o2 w+ e8 _# }# _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
0 o$ t5 H5 w8 i2 r. ^6 k% r( e mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / L: w1 e3 r0 q
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" Y. J) Z k- g& X4 S
7 ^1 J/ D& X% S2 [; a$ t. p9 K1 ^ mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
' }" E1 X$ t/ e: p- M- C while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 U3 D% {! D% J+ W, J1 H mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
) v) w3 L3 }7 i) f* ?' r$ Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );& X" H: [* S) \. ]' k
$ V; o( M2 R x/ r( G/ e
mcasp->regs->XSTAT = 0x0000ffff;
8 q; O1 H" n& e% F6 c, @0 m! P mcasp->regs->RSTAT = 0x0000ffff; . R! \, C( g. ?1 k& i9 |
/ e; ^1 r( ^( B7 K$ g4 P& w mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 o2 W8 j0 d& E# V& l+ f
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
) n0 r2 V" ~8 d* B mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 r' H; ^8 A) W* M3 G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
% u) k0 J8 }! \* h& [( [$ j- [- L3 k
/* Write a 0, so that no underrun occurs after releasing the state machine */
+ K+ j* ~" K9 M mcasp->regs->XBUF5 = 0;
+ K$ J* `1 E0 @: b2 V$ n mcasp->regs->RBUF0 = 0;; ]# _$ X0 ?. z
2 A' I( r9 x# D3 J/ V
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- b) e+ c! [* j5 @+ z! m% k while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 y$ j: O j4 k3 q& c mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
* S% h, R) v6 _) O# m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 Q' _/ h, V _3 i$ u
1 s9 x! @# \- y! @* W! a
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; % @8 F3 ^" Y& _' u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
( i" Z( v$ g2 x+ K F mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ K0 z; I0 m# C, e4 s while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );# n2 O6 ~$ T' [) L
! h& O# q7 V' k- D! t, ?: v CSR = 0x0000;
- i' p, L, L6 }! z1 `, b! `$ F INTC_INTMUX1 = 0x3d;3 E2 b1 h0 ^$ e" [( E
ISTP = (unsigned int)vectors;
5 l c1 z' i! _* p5 \8 u ICR = 0xFFF0; " z9 i% f8 i/ L- v2 Q
IER |= 0x12;
& {3 |+ @6 P9 q7 A& ^; V0 g- W* g CSR |= 0x01;
7 G7 |' |2 p3 l' J! E' Z$ d, L" g4 [- |
. V+ O. ]: f* D) Y2 c& ~( s
* a6 `3 d! ]7 ?1 p
还有就是两个输入输出函数:
& \8 u( W8 u. n+ t3 i2 Tvoid output_sample(Int32 out_data)9 r/ Q6 v8 O% A+ J9 `* F
{' [ a/ d9 B( y5 ~
AIC31_data.uint = out_data;
/ L9 t, m' N: d7 b! r- J MCASP1_XBUF5_32BIT = AIC31_data.uint;5 L: w; z6 a# R" v% S' u3 J
}
! n: C$ u7 w6 E4 ~3 ^6 c* r. `
1 P; C( J8 @. y+ J- _7 n2 wInt32 input_sample(void)9 s; k$ V4 `- t5 s% K5 U
{
9 i6 ^3 V# q) W' ]* K# J AIC31_data.uint = MCASP1_RBUF0_32BIT;
& `9 g4 _2 W- {: ~ return (AIC31_data.uint);
& j7 F: M* _4 D3 ` T7 k}
; q& _" z O; Y4 F0 M$ X1 h$ X4 d9 c% ~' q+ s# p6 u' T
|
|