|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 Y$ a. Y& s7 d: |* Umain文件:# \) G8 W" e# G2 e+ ] {
interrupt void interrupt4(void)
" P2 P3 W! p' T0 e+ H: L{8 i# t2 j+ R4 ~ ^# b1 g
Uint32 sample;
6 V& O/ F, Q2 G- B ^# W& m+ D0 d- a5 j* S, M
sample = input_sample(); // read L + R samples from ADC
8 a& I' C$ O a ]1 u; V4 | ~ output_sample(sample); // write L + R samples to DAC . z! p7 }& \ p5 t% z" W
return;0 o1 M+ w" a+ i
}5 r0 }8 u: L* \- @
$ Z# w0 f( L" e1 [0 A% d8 uint main( void )) T0 g$ _* c7 u
{
+ _6 J9 O) H0 Y y/ T# l0 J6 M; L7 _3 C
/* Initialize BSL */, Y/ N) {. y6 \: ]/ B2 g2 B
EVMC6747_init( );0 C ?( O, v B
/* Call evmc6747_intr function */
4 N4 T; z p) V3 \9 a4 _ aic3106_init( );
# X4 B$ b$ W3 H: I% } while(1);: @, Q1 q/ c7 P+ L$ _# o' ^
}
( z: ^7 l2 U$ [) ~" }0 k0 j; f2 K
4 b- r9 d4 K# M& b$ g& k$ f u9 T" d: V, m
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
# \; y; C& T2 m2 \/* Initialize MCASP1 */* S' N; s" h4 o+ Z7 I
mcasp = &MCASP_MODULE_1;& F+ J, I; [, h& [* g" t
mcasp->regs->GBLCTL = 0; // Reset7 }4 C% j4 p Z) z* y, I. D
mcasp->regs->RGBLCTL = 0; // Reset RX
# [/ n( s, E( G) h( T+ H; e mcasp->regs->XGBLCTL = 0; // Reset TX
% U( v$ V2 ]% \; s mcasp->regs->PWRDEMU = 1; // Free-running$ X& I$ e! u, T6 i% `7 u2 O' }
// configure McASP0 receive registers
* [1 \: @! M G mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used" [, ]; L+ l5 D6 D
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus# r) w0 r! w3 e! \- p5 a# G- \1 c
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' M- X" @1 ]' U4 a mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side): S3 B z6 }- J/ k* ?
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)) Y+ o, c# y9 s/ J& V7 h: E
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
' ]: f+ e. k1 F X, e: }# e mcasp->regs->RINTCTL = 0x00000000; // Not used
( h! U- `9 n; Y" H- x9 D mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
# t4 ]! ]/ `2 k% `$ Z+ ~- _4 m$ c* \8 G: V4 `2 `# s" s
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
. W+ T2 l) z% d, Z& o) u mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; Q& Y8 R D. f& a/ J# i mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word9 t% V" Y f* C( }% B$ K. k
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-167 S: ^- z3 x6 h& h) i3 w. d) k
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
# \! U" j3 ]/ K7 Z) i2 @ mcasp->regs->XTDM = 0x00000003; // Slots 0,1
5 @" C& S' B7 [0 I( L# [ mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
8 |, _. c v7 x& U" Y0 o- g" W mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 {+ F( ]+ `% u6 |2 S' v7 [ l3 A
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN7 a5 y- v; W) `& Z
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT' O- ]# y- y: u2 k. v
mcasp->regs->PFUNC = 0; // All MCASPs
- C* i; e$ r; @; c! W4 { mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: V/ f0 W2 J' w ]! \/ R
6 W* x) m/ T- y0 H7 o mcasp->regs->DITCTL = 0x00000000; // Not used& Y% O2 \: A: \% N
mcasp->regs->DLBCTL = 0x00000000; // Not used
! V$ W J9 t" @1 R' N mcasp->regs->AMUTE = 0x00000000; // Not used2 w- `2 W( k# F$ X
( `( s9 z0 p1 `) e, X* U+ S& o
/* Starting sections of the McASP*/5 G2 s7 R6 r1 L6 a7 D
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! ]/ X+ M7 V5 v( ^# a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); " v9 U1 _4 f- Y
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; * |0 ~: ]6 A& K) A% u
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
( _9 _! L; F$ ~0 k2 Z3 u, b
! N4 U' u# @8 V6 [, o4 F6 y mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& L5 R; D' q/ s/ U, f/ b# _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& k- ^0 M4 D* p- g+ C; m mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; - w, G0 [+ s/ [4 Z
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
( c5 e4 z0 n* A- y
$ U A3 N6 B+ M J mcasp->regs->XSTAT = 0x0000ffff;
9 f4 Z6 C2 d) F, c" \! Z4 ?$ g, o mcasp->regs->RSTAT = 0x0000ffff; 9 @* k) I, H5 [9 g9 S
$ K6 U z2 F+ k; f mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! z7 R9 L& W, P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );" p9 E) U) D" h) h
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; G3 `' ?1 r# u1 S8 P; V, M; U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 j- ?; i/ U+ W: H
5 h2 M% \6 |$ I
/* Write a 0, so that no underrun occurs after releasing the state machine */
7 S* r7 b2 i1 K1 e2 u- V/ f mcasp->regs->XBUF5 = 0;0 X0 I8 y0 j; E1 w5 G: ]
mcasp->regs->RBUF0 = 0;( ?+ `8 w# x, o- f
: n2 X% b; u6 ?2 \9 ?1 B0 Q mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 q% }; F% L& B* V while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
; G$ I' I: D' N% E, b- s- E mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; / W6 s# B5 F( B7 A% S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# x, \3 l/ J9 \* }# e! w
6 N# }, u; f6 f& K, p" R mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 9 S* B& E! E$ O5 B- D" l" j& P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
& ]' L4 `: j3 e N1 u mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
4 N) l5 ?2 x0 c1 u# `1 m2 M5 h' T% Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
* Z: z6 v7 t0 [9 T. E+ T. j4 P
$ ~! `0 O" g W4 P CSR = 0x0000;$ k' W1 `: F9 D7 U3 N, @
INTC_INTMUX1 = 0x3d;
2 t: ?( k [, i: B# Q6 b ISTP = (unsigned int)vectors;
2 B3 C: C3 O; v) l x0 D ICR = 0xFFF0;
4 [: ]: C+ @% D8 u; e IER |= 0x12;
* Q6 Z0 P& K& A7 w# x CSR |= 0x01;
9 b1 j- b2 |2 x. P6 t U, D2 `( J
; w( W" Q7 P" i# f+ M% ?( ]4 A/ z
9 _: T4 D b! o3 x. q0 m, ~- u8 L
还有就是两个输入输出函数:
1 Z* h, k7 w. Ivoid output_sample(Int32 out_data)
4 b; Q d1 O$ j$ _1 M3 M- e9 [{
( D+ P9 a! G% ^7 _2 G: j AIC31_data.uint = out_data; ; f& q+ o7 f& W% ^
MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ s4 c9 r& e: P, h" P, `* ]2 h: g}
) e0 S) A0 m1 P6 j) M
$ O) @' Q3 F" t8 U) H9 d$ l1 }' ~# MInt32 input_sample(void)
$ w0 t! ^6 d; N& r# i{
& Q8 N$ m4 }. O! s O: c% Y AIC31_data.uint = MCASP1_RBUF0_32BIT;7 v/ a7 | z- [( D; f9 m
return (AIC31_data.uint);7 L5 v8 N' r$ }* @3 x6 |' L* Y
}8 k& o7 y- c9 z# G: Q* ]. h
+ X4 v C! M0 K |
|