|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:1 ?: H% D* I, @2 Y- ]
main文件:
1 Y# ~0 @; D c4 U; }, F) y7 |6 Rinterrupt void interrupt4(void) ) B% |$ T6 ^- n( i4 n. q1 l& U+ K( y$ @5 K
{
3 X; T b' G) v Uint32 sample;
, x: ]( h x/ `6 x7 ^3 t4 \5 y) c M7 m: N! M, O: D8 t3 H( J/ f
sample = input_sample(); // read L + R samples from ADC
, f* T$ j* h% F. P3 ^; u output_sample(sample); // write L + R samples to DAC
i; Q4 }/ j3 z return;) P2 g1 R8 w: |! R' |% g
}7 N6 \% d' ~- S
0 y4 g- {$ N0 r) x* p6 d
int main( void )& o1 h& \0 a. L* m- i) ?. R
{
2 }. S. |; l. p& x! U
# g! F! D! [1 G, y6 O+ d8 t /* Initialize BSL */
. r+ g8 k4 Q+ Q# |: f. M EVMC6747_init( );
! X+ e' x" _$ e2 K' k4 Y$ H* E; _9 f /* Call evmc6747_intr function */
2 j: c7 ]+ m) F aic3106_init( );
4 H4 W* Y# M/ r5 [3 @) } while(1);# p% j4 p6 h8 B: w4 E3 U8 L8 x7 J
}
8 G0 n9 |: I" @2 j& M9 \
! h) Y( r& a9 _3 {+ f m5 @+ n5 [: c6 A
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) V$ K* L0 V; [) B- F0 [2 c/* Initialize MCASP1 */
$ [2 L& l: z. v- K% }# V% _8 y1 H mcasp = &MCASP_MODULE_1;
& r( H* e; z6 r mcasp->regs->GBLCTL = 0; // Reset c- \ [. m [5 Y, a
mcasp->regs->RGBLCTL = 0; // Reset RX
4 i# m7 i3 G- G# u mcasp->regs->XGBLCTL = 0; // Reset TX
5 w( E- T% u8 M. A. m mcasp->regs->PWRDEMU = 1; // Free-running; P+ v4 D! o7 \) l6 c1 E
// configure McASP0 receive registers; c& m/ g5 z# Q; w$ I! n! k
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
0 t; B( W: d+ z8 `/ \! n9 C mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: I, V! X" |9 Y1 O mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 K0 k; e8 x3 g. e
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, N6 M" K: |1 X# a: X( A/ R mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)4 `, j( H4 e" d: y4 L+ v9 c
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
; A! Y5 g2 Z8 l' c/ i9 l mcasp->regs->RINTCTL = 0x00000000; // Not used
' ~# _+ O& P( J2 V+ V1 w. [ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2564 w# ]4 e* g$ R# \! ^! K/ Y
2 ]8 y/ B% V2 g3 C) O mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used7 m. n0 N9 w2 K
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" |+ T9 _1 p5 p1 j8 Z
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
/ V s, o8 @. ~. u# ]" c mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; y K! R, f1 V: V4 e0 T8 F mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
4 q; a0 v1 x4 p; y mcasp->regs->XTDM = 0x00000003; // Slots 0,1
$ t& J5 [9 ] I4 a mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ {/ p4 t+ `6 d( H1 s/ H3 _* Z* O% g
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 w( w# ~+ h; b7 E2 x0 v4 j/ n5 x1 ^4 E2 E1 ]9 b
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
' b9 L2 t# b$ {" w% T: m: a mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT+ x* B5 t, W9 b
mcasp->regs->PFUNC = 0; // All MCASPs
- r( C# v, Q. o6 w+ V Z mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
' j- t9 q: O' P& s; {
. s) E5 e# p1 S2 m8 [0 @* D mcasp->regs->DITCTL = 0x00000000; // Not used2 Z* Q) Y+ f0 C% v
mcasp->regs->DLBCTL = 0x00000000; // Not used
' J- @/ z/ ?/ F: U* p2 o mcasp->regs->AMUTE = 0x00000000; // Not used
" f6 _8 r( M0 E8 Y* s
+ U9 A5 t8 j: R8 Q4 O* w/* Starting sections of the McASP*/. t3 }/ D, m; E: E( |, ?2 A, |4 C
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , Q7 D; z/ N- Q; t8 O$ e
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); . G( W; Y3 e2 t. X- N
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
: C3 Q4 z5 E; N4 }2 R/ N) ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
) z! U4 Z' J5 z/ I; b' [ X! `
) X# `4 Z4 J. \- T mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
& S: S! O5 ^& E. ?% e5 | while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
1 k. i' D3 t1 h4 T6 I mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* q' M& ~, l- d5 i" x while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );+ f: F; Z: C, Q# S, }- ^
* f \( D% _$ U1 q+ I. ]# m mcasp->regs->XSTAT = 0x0000ffff; ' }; ^7 [! X' S# w) z
mcasp->regs->RSTAT = 0x0000ffff;
, Z4 ]5 c' L0 ~% l; D5 ^% o4 |9 o% R( E9 T0 D2 a
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
8 \: y$ L' F I. r% @! P5 @ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );5 z5 H# w# x2 @+ s
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) x% o: S% S7 t0 ~, @: A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; C0 K, R- ^+ }& H6 @" z, _
, I0 e" w# d+ ]0 Y7 F1 u /* Write a 0, so that no underrun occurs after releasing the state machine */- K9 T5 q8 q* j4 T3 K3 x
mcasp->regs->XBUF5 = 0;
6 H/ a8 ]1 L4 ~9 k6 P( h, P mcasp->regs->RBUF0 = 0;# t; G8 @' ^: `: i, w7 M
8 F" k4 S) x0 n
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 a# b/ |7 U) ?4 C4 u8 r3 E
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, z+ Q' Z x/ x n+ j mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! D- J, b4 U. O" J V: @ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );" X4 m( L/ E4 _8 {
u; O/ D# y8 z+ Y, @ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' |/ ]; o4 N$ H4 X) c/ V# u% R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 a# V" L5 V- t- G8 F$ V mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! a- F5 x, o; `6 X. I7 l while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );' R$ |; a$ v; J
7 p" R, u Z. |7 o" k CSR = 0x0000;
' N; u) o& W* a) x5 M0 U INTC_INTMUX1 = 0x3d;
0 p# l2 u. }7 D3 t' h" @ L/ m ISTP = (unsigned int)vectors;
( {9 b3 J1 B* k! s0 b ICR = 0xFFF0; 4 n; G1 a- F8 o
IER |= 0x12;
+ P# L! D( k `4 c, u9 w4 _ CSR |= 0x01;
. M6 g8 n$ Y: R& N$ O5 k
; ^( V& u+ d! W/ r, A3 ?
: `: E+ p: J% w, ^3 c' C: U7 C0 w9 y1 u6 {; m
还有就是两个输入输出函数: H8 j! v1 [& c- b- ?
void output_sample(Int32 out_data)2 c% I$ ^0 x& s" I& E
{! _0 i. `1 G; {
AIC31_data.uint = out_data; # C, ]9 p/ ~5 L5 X! f. L) t% o
MCASP1_XBUF5_32BIT = AIC31_data.uint;; |/ \7 x6 ]) `: a, t7 c5 ?- U* z
}
% n1 P, b" Z0 f; Q8 C& z1 U( u9 [ \4 K
Int32 input_sample(void)
! S Q0 O' x p/ O: i; P{
( A9 @$ K% J1 E N8 m AIC31_data.uint = MCASP1_RBUF0_32BIT;* a, ]. P7 r5 w. l1 Q ?5 J& d
return (AIC31_data.uint);
! U# O! h8 {# d1 F& N; Y* b}
2 M& N {# k* L# m* m8 t
- K" X) g+ l" G( j7 b8 r$ G0 j. ^ |
|