嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( G4 F9 j$ I% y0 H3 @
#define PING_PONG_ACNT 1
8 Z2 H- s1 K) H
#define PING_PONG_BCNT 8*32*40
8 s/ t6 r V; U3 h8 z- U e+ k$ U
//#define PING_PONG_BCNT 1
2 |7 t/ s: K; e3 Q4 X
#define PING_PONG_CCNT 1
1 f) N0 X6 {9 C9 X1 u' S) L( d
#define MCASP_BASEADDR 0x01D00000
4 a$ D$ `+ y ?7 k7 d5 d
#define Mcasp_RXEVENTQUE (0u)
& q$ ]& h1 f8 {
S+ K7 T$ p$ }. u4 ?$ P
/* OPT Field specific defines */
; B/ e. T1 O# x- A; w
#define OPT_SYNCDIM_SHIFT (0x00000002u)
. h, U/ B _7 Z) b( N% _/ N& k
#define OPT_TCC_MASK (0x0003F000u)
* W. C( d' c& }' v% a+ _
#define OPT_TCC_SHIFT (0x0000000Cu)
9 c8 W+ Y) L: C% S
#define OPT_ITCINTEN_SHIFT (0x00000015u)
5 G$ \# J5 I# C1 l6 w& b2 [ x
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 _& h9 I! o4 Z/ s V+ q5 m
1 f. o3 H' n3 G$ ]" ^$ J, A1 V
char ping_buffer[PING_PONG_BCNT];
$ _9 J- v& U" Z1 J k
char pong_buffer[PING_PONG_BCNT];
# e. L% B4 u$ S/ _& {+ J2 t6 M
3 J3 H1 V8 ~! f6 c* q; b! z c
5 }* [1 A' O1 Y( v8 C X' H' k
6 B2 V$ V( {8 _
9 W/ T U: R$ C/ {( W" _
static void ys_edma3_init()
0 h5 Y% F, T/ }
{
$ e: o3 @4 w ?4 N1 d0 w
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& s2 {- s8 x. z# K/ ^- I
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- ~4 C1 E; @9 W
EDMA3_DRV_Handle hEdma;
3 v1 g9 e, J9 q! o+ o! a
uint32_t chId = 0;
( ^ a _" J5 r U7 v8 a
uint32_t tcc = 0;
$ m: k; z* _) K( d
9 O$ ~+ E% Y/ F, {4 ]
print2arm("edma3 driver init...",0);
! b$ E/ o+ g6 T
# j! f; x1 \. j1 T4 O3 U+ I$ H
hEdma = edma3init(0,&result);
' }8 B7 o, r e2 H
if(hEdma)
4 @: b" R5 _/ Y+ z; J5 u) }
{
8 [, ^% m2 \, a
print2arm("edma3init() Passed.",0);
$ A: D1 n2 Q8 A& ~9 {: A
}
/ {# `; @3 O) g* [- A
else
/ \# P. \3 v* A: B v
{
/ n! k" E/ q2 F0 p, W
print2arm("edma3init() Failed.",0);
" L6 T' c) d* L! c
}
* M: k0 J6 \. D+ _( a
* R% d8 p% w1 m ?3 m
if (result == EDMA3_DRV_SOK)
( w2 l8 L5 c5 P9 m1 U0 q
{
, {$ x5 J( V4 ^7 j3 Z$ S ]0 I
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 }8 k- H+ ]5 A% U. j2 M
(EDMA3_RM_EventQueue)0,
7 l* K2 |% D. t& R
&edma3_isr, NULL);
9 C }9 a. N& b' t# Z3 v+ h8 ^
}
3 {/ i- \$ f% l5 h, O2 W
" _3 ~. q- u# v9 k; l
if(result == EDMA3_DRV_SOK)
# r1 n0 ^) W0 G
{
& X0 Q. o# i6 }' F
paramSet.srcBIdx = 0;
& H8 [6 z3 u$ T
paramSet.destBIdx = 1;
; F7 p Y; {; D+ w" r
paramSet.srcCIdx = 0;
9 v8 w- }' N8 `( D* z$ w7 D
paramSet.destCIdx = 0;
* c- x8 i5 o2 Z$ u
paramSet.aCnt = PING_PONG_ACNT;
8 k- K& S8 p: v. [ O
paramSet.bCnt = PING_PONG_BCNT;
; p- ~; }: O4 {
paramSet.cCnt = PING_PONG_CCNT;
1 m% D6 I3 U' f- }! k
; X1 w) @( r- F. O
/* For AB-synchronized transfers, BCNTRLD is not used. */
& F! V \) s& |* d0 d8 z& r
paramSet.bCntReload = PING_PONG_BCNT;
5 |; K7 Q; t- p' j" D) C
/ v2 Q6 r1 L9 J' O: [. Q, R
/* Src in constant mode Dest in INCR modes */
+ }+ f. T5 y* d! f; p1 M, O
paramSet.opt &= 0xFFFFFFFDu;
' q' {: H1 E' Y) A
//paramSet.opt &= 0xFFFFFFFCu;
" c0 i. v+ ~% q. G9 i
/ k) Q) T, ]( a* g1 }
/* Program the TCC */
% {# D2 Z/ R7 g5 g" T) ~
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( P( a, f u4 W( Q) i! i. w
5 t& Q4 Q8 y' }7 X
/* Enable Intermediate & Final transfer completion interrupt */
; A. H! @' k5 t. n0 y2 ~
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 u* }; ] @; ^0 D {
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- H7 A/ C; M7 K/ [+ ^
: R" s3 a' N/ |, ]! y+ \* k; d5 }
/* AB Sync Transfer Mode */
: \' @) i5 N# {
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ N/ N) x' w2 S5 }: w& [& D
; [7 o4 ^% Q* O
/* Program the source and dest addresses for master DMA channel */
+ @. q! S9 H% c$ {2 l9 L9 j
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
" G) r2 P" y- a q
paramSet.destAddr = (uint32_t)(ping_buffer);
X# f, Z& I7 {( ~ I
# n9 Q& K1 B/ d' [
/* Write to the master DMA channel first. */
+ H" z9 Y v0 h% L$ Z9 N
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 G2 `2 ?' `- z9 j1 a( q
}
- K k! g4 ~0 v" z* \$ n
: B H* e P. S' j5 y; Z0 ?) \6 O
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' E$ p+ h( K1 J7 j' @) C2 r
, m* s/ w$ P" d
if(result == EDMA3_DRV_SOK)
6 J% _% b2 f& h
{
* _% E$ N4 H4 c9 J' J
print2arm("edma3 driver init success.",0);
; f V$ v8 l7 ]; s6 q/ {: j
}
0 y$ c/ j/ f5 z, G4 s
}
" \5 U: X; u6 k5 p
2 L0 F b# v: I7 G, i
( e: j' ?" a4 e. `3 ~& V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& R; J2 F# q6 {: h% X( d7 a9 f) H
- k9 d$ T7 `) X2 M, D2 c1 ]
! ^4 }% v" L2 U. f
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) `) A l" {% s
每次DMA传输完成后都要再次使能传输
* v2 ]% K7 B+ d
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4