|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, f4 w# B" O g8 q$ _4 gmain文件:
( A) W* Y7 v6 i! p6 Vinterrupt void interrupt4(void)
& u5 j0 E& \) N l7 i1 y; E$ k{
( N( R1 U8 S* L, Z( R Uint32 sample;4 o) ~ W# x4 V8 T
% X1 h% b. Y0 k4 }# p sample = input_sample(); // read L + R samples from ADC% J& F. M) S y2 N
output_sample(sample); // write L + R samples to DAC 3 q% B+ q) R/ [5 `
return;
8 _9 w, v! |$ v8 ^* p}' _) `8 S: P" S0 c( S
- o6 d, o& @% oint main( void )% A8 C( X0 l: q
{
) g) a# N- q. d3 q7 C
) a# O# z4 B' ~ /* Initialize BSL */7 k8 `2 }0 t$ F: Z( n) K
EVMC6747_init( );+ l/ P5 E; G0 d! d' Y! ]
/* Call evmc6747_intr function */
- e0 p. G6 c4 W2 p aic3106_init( );/ i1 Z9 |+ J6 F- [( U/ S. A
while(1);
( b0 k' g$ ?) D! I/ K; z}' k6 X+ }3 N% m$ o9 K
$ e: A$ x5 {8 F' D2 V$ i; m: K C% L
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
) C4 M9 l5 e% n* T0 @2 Y/* Initialize MCASP1 */+ o" D; B9 Y1 l. E& _9 j
mcasp = &MCASP_MODULE_1;
! F; p# Q" B5 A4 C4 c0 ^8 Z mcasp->regs->GBLCTL = 0; // Reset
. X, W* f0 a- V" P/ u: _ mcasp->regs->RGBLCTL = 0; // Reset RX
, ^( g3 @) C- f! K' s) L mcasp->regs->XGBLCTL = 0; // Reset TX. l, J0 D2 S0 z3 l* b/ n
mcasp->regs->PWRDEMU = 1; // Free-running# P* O& m4 a) i1 s& e8 y7 f6 @: Y
// configure McASP0 receive registers
2 ?7 d& M+ M- l mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
) Y2 `) U# ~) r2 z2 C/ X mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus3 c2 q6 b! z: i1 ]+ U
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word1 d; k+ I4 z9 z* b
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)/ P; T/ w' I& o0 t3 c: ~
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
w/ b: P5 E* o5 `, S; i) X mcasp->regs->RTDM = 0x00000003; // Slots 0,18 o! S$ s; d" C- J
mcasp->regs->RINTCTL = 0x00000000; // Not used* O. a) x6 @' B# o. Z7 M5 E
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 `+ l1 @: c$ G
! u# d, O7 l+ @ G- N mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used X2 h& F, M8 @, y$ C+ V. t
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus2 ?$ S1 U! o9 ]- b
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word- p0 [9 R8 v$ o2 r5 C
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16! Z; y* [# s( C0 ?# I( _- k: l. c$ H
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK9 ^/ H% M$ ? |* n" y R) @! k
mcasp->regs->XTDM = 0x00000003; // Slots 0,1) U) N3 f! r" J+ o# T
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
* \! P# N8 t" L' s3 E+ [# {# A( ` mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. y; L5 J: W; x" j' ]- d5 }1 ~: L6 g: h B
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
1 j! j9 }) w8 l mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
( ~( Y# T$ P% u p6 e% p+ k3 ?, L mcasp->regs->PFUNC = 0; // All MCASPs
7 R8 d/ X6 l0 Q5 N6 S& b7 R! h2 n mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1& {1 D& F, l4 j
' O1 ~( Y, E+ R* E# j
mcasp->regs->DITCTL = 0x00000000; // Not used# @* Z! v# {3 V& g
mcasp->regs->DLBCTL = 0x00000000; // Not used. m# v3 O2 Z, x4 x% Q
mcasp->regs->AMUTE = 0x00000000; // Not used' Z5 w9 t$ l$ S. F
8 D( |3 x7 [" k" r% M6 t/* Starting sections of the McASP*/5 x. A' @+ |1 F- d
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
0 ]$ L# O+ W) k& {3 N) A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
; V. N/ f1 y1 V% Z8 h3 x mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 H; P5 S: ^8 S w9 \ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );% v v( T J7 r6 U
" K/ o' F8 M1 C/ q6 \5 S; b mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 U* W8 F- `* T4 s: Z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); j1 s8 |( s; u, U% ]+ A- c
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 {9 o+ |8 r1 A* S% p
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );2 Q( n6 j p2 b4 d& n. R
: e4 Y( ^! n1 D4 @
mcasp->regs->XSTAT = 0x0000ffff; 7 d, Z3 u. O* w
mcasp->regs->RSTAT = 0x0000ffff;
1 ^; Z: q7 _0 J4 z" G
, ^" I' [2 ], x mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
9 }/ W: F5 l O" O( W. p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- Y' F/ B. x# [4 p% O* L$ X
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& w+ r9 \, d' b4 P! R while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; L2 f, W0 f+ ^7 d( D$ Y# W
5 z4 o# [! ]0 z, c% V/ N /* Write a 0, so that no underrun occurs after releasing the state machine */% e! c5 ~5 c1 ?1 c
mcasp->regs->XBUF5 = 0;, a4 E8 y! H7 J4 ]- h2 `9 Q f
mcasp->regs->RBUF0 = 0;8 u: U. H& L7 b
& y9 \) i' n9 i) Z- F. G' [ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; * b a$ }5 n; M
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );$ q( i! `' Q! b- N# H6 m
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
$ L) J. c/ b7 G( ~ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); `$ W! a, I3 z3 h, X# x- I$ x2 t
* O E! D0 M5 O4 t' I
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
! v0 r& i5 m& r3 i. t+ X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 m) P; o8 t" O/ p6 ?9 `+ O7 [ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 4 G+ W8 P& Z- g( J' `; N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! t/ s$ E) K# h; W. K1 J+ z
" x% \$ ?+ M6 o- Y4 \ CSR = 0x0000;# K0 ~2 g% a1 [, F; {
INTC_INTMUX1 = 0x3d;- t7 T# G, [2 s- J/ W, N- O
ISTP = (unsigned int)vectors;
& _, q9 B, m' F6 C6 u0 @, j& ` ICR = 0xFFF0;
) q/ n7 ` J( m: Z9 V) X3 \: S IER |= 0x12;
/ h- b! Z' C4 C5 H8 k' P; T CSR |= 0x01;
; d$ p$ B) T: R! e) {* k2 i n- U _' B% V
2 c( |5 v8 Y; G( H8 _* e# {# _9 c4 }* t4 Y7 k
还有就是两个输入输出函数:
* v( W. p% u8 m! e- M+ Kvoid output_sample(Int32 out_data)
9 x( i! X! m, H5 _+ Z' @/ H% g{
) x8 `' Z& n2 a) J. Z9 N( l9 N0 Y AIC31_data.uint = out_data; ' R9 r- d8 B7 L2 J0 _
MCASP1_XBUF5_32BIT = AIC31_data.uint;
( U: g. z+ X. }+ T}- m# b! q$ A w0 \- ^
% w9 \3 o4 K* _9 l9 Q/ {+ V ?Int32 input_sample(void)7 s& H% ?/ Y% |& o+ ^
{ 9 ]' U% l0 l0 }
AIC31_data.uint = MCASP1_RBUF0_32BIT;7 y$ t# C( \. b. A, c
return (AIC31_data.uint);
7 S& H2 W( y/ r5 v}0 p! o& h) U. k, Y
7 H# m- C1 x8 C! M9 v0 R$ ~ |
|