嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
) a* [5 h) z, K. g3 \# Z7 T# V
#define PING_PONG_ACNT 1
5 Z& G+ g% D4 u$ {4 D, y
#define PING_PONG_BCNT 8*32*40
7 @3 t" u. C t* b$ S3 }
//#define PING_PONG_BCNT 1
! ?+ H. r' s" a- L
#define PING_PONG_CCNT 1
; b3 K X$ l, x* @- I& f' C( ]
#define MCASP_BASEADDR 0x01D00000
! }0 O* F2 W7 E8 `8 v3 H( a
#define Mcasp_RXEVENTQUE (0u)
7 m2 D# X. V5 L- U8 e; |" b
) F; @/ H9 q5 ~1 G: c7 ~
/* OPT Field specific defines */
4 f3 H3 T0 H* e( S: q, O
#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 b: M% b1 S" a7 C; O/ M
#define OPT_TCC_MASK (0x0003F000u)
6 m! z, V( }1 U0 M0 O! k
#define OPT_TCC_SHIFT (0x0000000Cu)
: k6 A7 e' j/ {8 \5 V
#define OPT_ITCINTEN_SHIFT (0x00000015u)
4 i' |7 T' m; T! \; O8 k
#define OPT_TCINTEN_SHIFT (0x00000014u)
/ p+ V! I1 M# r' l. p
) _' a& j9 n1 ^6 {, p
char ping_buffer[PING_PONG_BCNT];
5 e1 g. {2 q1 H: |4 w
char pong_buffer[PING_PONG_BCNT];
4 N ]1 X* j! x
' \2 }9 }- m3 J/ r& @5 t
/ ~! `* e0 w4 }& d0 ?/ l
- I" X' V6 W$ u r
! B% t+ N+ f) Z/ }( ^1 R3 K
static void ys_edma3_init()
- N$ R% t' F, P0 V* t& I- I
{
4 c7 r3 H( v1 T' H% w& @
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ o1 k( R; P |! { z% r2 d; P
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; {4 p) n+ M# e8 F! q* K* m, L
EDMA3_DRV_Handle hEdma;
( f8 l2 a) O, x( Z
uint32_t chId = 0;
0 T, E4 m0 Z* K
uint32_t tcc = 0;
2 }. g/ K" H0 `' X5 Q) j/ t
* J1 h$ u x8 ]. O1 J: a. ^( `
print2arm("edma3 driver init...",0);
. r# I& P7 R: Q, s4 j
1 k0 W; t8 b) I- H, a [# _2 F
hEdma = edma3init(0,&result);
% v. }+ x$ c+ _9 W+ s0 D
if(hEdma)
6 K6 R/ f, I( d w
{
9 K/ J4 L% T# Z5 M7 A( c w. [
print2arm("edma3init() Passed.",0);
7 s9 Y b% ^# P! v4 T5 r: ]9 k
}
; R* P1 o+ b" u& H# f
else
/ ]3 i& T- Y# D5 P! S3 B
{
6 S( H) ~4 H# M# H, k( n
print2arm("edma3init() Failed.",0);
?+ L( g" y& Q' E7 l! g' G5 Z0 u T
}
7 A0 R' U2 p- |
( P# q6 V0 g0 b( X7 g/ R- C! P
if (result == EDMA3_DRV_SOK)
- O! \* a, W% e) I3 l* K, I
{
2 [: q- `3 a2 ~* T; L8 j, Y6 J
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) x2 U5 J$ o; B
(EDMA3_RM_EventQueue)0,
! w* Y! s* U+ h3 Z
&edma3_isr, NULL);
3 F( Q2 r2 f( S, s! ^# t7 Z7 B
}
" P2 H/ K3 X+ j1 V
% i, m# t7 d; l( B: b; I
if(result == EDMA3_DRV_SOK)
' I# a( m4 M4 c% W r$ P7 ?
{
5 O; R4 \1 y% ^
paramSet.srcBIdx = 0;
6 C6 y& w& f s$ ]% r9 c
paramSet.destBIdx = 1;
/ I2 D) s. c( m' U
paramSet.srcCIdx = 0;
' l8 R) E& X( n* z
paramSet.destCIdx = 0;
# O* v* s% B! b/ ^3 h
paramSet.aCnt = PING_PONG_ACNT;
/ ?' N3 q" j, s) I# X
paramSet.bCnt = PING_PONG_BCNT;
9 m: ]2 w# \) H6 B1 y) w( h
paramSet.cCnt = PING_PONG_CCNT;
& K/ T1 u. W) o' s# E& @
0 S2 R, X3 R1 j' q5 h
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 T" G$ i* g# N) `8 ~
paramSet.bCntReload = PING_PONG_BCNT;
[6 N9 k" \6 l: R
! F" U+ D7 Z4 f( p# c7 S, W8 e3 }
/* Src in constant mode Dest in INCR modes */
5 T% @$ M# \. s _: c- v; ?
paramSet.opt &= 0xFFFFFFFDu;
( \( U1 U7 J- N8 o U0 d- y6 \
//paramSet.opt &= 0xFFFFFFFCu;
9 H" m/ q% h& ]5 _6 ~: H. R
% W1 E) q" @4 u# E0 i4 t5 N9 j
/* Program the TCC */
2 u" R8 [0 t# p. J8 V) Z# L0 F9 }
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: H! o, e" k T! G: J1 `
{( b. H; R4 g* f
/* Enable Intermediate & Final transfer completion interrupt */
: `* D7 l% U: s+ c- B& ]# Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; t9 E1 _, d" @
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, P6 q) {8 I0 L7 ^* J
& x( y+ t7 o/ v8 u9 x$ T0 k
/* AB Sync Transfer Mode */
* z# H# H* ^% @/ a* ^/ d1 B
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ @# H0 G% F) v4 f6 [
8 K1 e# f* G; m% c" z
/* Program the source and dest addresses for master DMA channel */
4 g/ _0 O. Z2 c
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ q" `6 y1 h1 I% E: b
paramSet.destAddr = (uint32_t)(ping_buffer);
' y" Z. C. }# L
; x( O- [+ _/ R, ^( X6 l& |4 S7 J
/* Write to the master DMA channel first. */
( ]: Y4 P. W4 Q: y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ _& I0 q- Z+ R% ?0 A8 P1 c
}
0 i" a- L7 c" K9 j, p" I) J; S
" C, ~+ \2 Y+ o& @! e; c: m( A+ z
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# y& q8 U) I0 t
9 g! A' m9 p& o# v Y
if(result == EDMA3_DRV_SOK)
, Q! n* U* a5 ~5 D9 U. V8 p- G
{
+ H9 f8 E9 ?+ K9 x3 B
print2arm("edma3 driver init success.",0);
1 Z8 J5 B$ m$ ]
}
8 G2 K1 e+ n" L3 s
}
3 d4 L. [# W3 F7 h! O8 r
3 U# A. w$ U) r2 q
' }* k4 {- L6 g
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ ~. b) ?. l) Y- Z# Y# S
5 P7 X. F& q1 p. Q- R
6 N+ r1 t/ w7 u, H
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
3 J0 w5 v5 M8 g) @$ L; E
每次DMA传输完成后都要再次使能传输
* N0 w5 X8 |& x- g
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4