嵌入式开发者社区

标题: edma3中断只能进去一次 [打印本页]

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( F( o2 S5 i' D" o8 s! o* |#define  PING_PONG_ACNT          13 j# @8 E6 V7 z( J0 \8 H+ ]* Z
#define  PING_PONG_BCNT          8*32*40
5 z& ^1 @0 f. h//#define  PING_PONG_BCNT       1 0 \. J+ k( {" w" v
#define  PING_PONG_CCNT          1
+ o9 _1 L9 @$ Y( Z0 `1 G#define  MCASP_BASEADDR          0x01D00000$ d1 p; O+ G$ k( W) r: Z7 W( L8 `
#define  Mcasp_RXEVENTQUE        (0u)
6 a% G* U) |1 l) J1 q; _: _4 p# I0 _$ e$ e
/* OPT Field specific defines */
$ k$ M# ^9 Q, C#define OPT_SYNCDIM_SHIFT                   (0x00000002u)$ x1 ]0 P* s* W; c  P/ \0 h/ Z: z: f, w
#define OPT_TCC_MASK                        (0x0003F000u): w  O& Z5 L+ T5 k
#define OPT_TCC_SHIFT                       (0x0000000Cu)
( D1 P% L+ l4 o  F. _#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
" l# N" M) \2 i; g, L* b9 |4 L: s#define OPT_TCINTEN_SHIFT                   (0x00000014u)9 Z8 m5 D: j4 B5 q

  e, _6 _( v5 p: e& H8 Z0 M6 W: P0 Fchar ping_buffer[PING_PONG_BCNT];, y9 q- [5 I, r! V6 t
char pong_buffer[PING_PONG_BCNT];% V0 V4 z3 \# E& E# v$ e
% f: d# E  e# b% N

) @# j$ F1 M: d. S; C, q% _% s2 e* A

- S+ ]1 v& j! s1 O. Vstatic void ys_edma3_init(); o; L7 j+ M& i; l, e2 P" K+ C
{
$ v' g, ~0 h- Q% t7 V        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' f5 Y$ S  H* a+ c
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ E* t  O3 B' ]$ I        EDMA3_DRV_Handle hEdma;& F$ o6 l: M* C2 o3 E2 J
    uint32_t chId   = 0;# u! K6 Z# v3 }+ ^+ _: a
    uint32_t tcc    = 0;' l) \) R8 W8 U1 U8 G  `

2 Y) o: @+ r. r  E    print2arm("edma3 driver init...",0);3 e9 S& Z' `4 m) g

8 P0 ?5 G! ?- Z! M        hEdma = edma3init(0,&result);5 |$ J! J# [& a' u5 v# f4 C3 v
        if(hEdma). \' @* }* z' Z
        {8 S) W) B9 o! d7 W2 f& T, X- j
                print2arm("edma3init() Passed.",0);( J) J6 C- U: S9 R+ I& J8 I
        }
; q7 I  t1 t+ n9 D6 p- T* N        else) D3 `* h- a; [* v# J
        {
; R# @" m6 W$ {! a  f" ~& l                print2arm("edma3init() Failed.",0);5 m3 N$ ~7 t' E3 w, A$ @
        }
# o; n3 z2 T; o  t+ |       
- t" g8 {9 }# P5 s  e* f, R3 ]' K        if (result == EDMA3_DRV_SOK)5 Q) J1 F& |' c6 j) Y9 q
    {( e3 {9 |+ ^1 @% Z  C8 w
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& ^) i. F  E0 y( d& e2 K                                                       (EDMA3_RM_EventQueue)0,
$ Z5 m! K1 B8 v: T8 S* ~                                                            &edma3_isr, NULL);
- G+ J: w# _9 h0 b2 `+ {    }
2 e  T: X! y& W$ H. N       
& l, ^0 u1 p. @! d! O  d        if(result == EDMA3_DRV_SOK)
% z+ V9 U# ^1 Y        {
; N6 l0 Z7 ^; Q& I/ {6 _% x. A                paramSet.srcBIdx    = 0;
8 C) s* N# J6 A) H: N  `- y( B                paramSet.destBIdx   = 1;
* g* J3 N2 M) q6 ~# u  y                paramSet.srcCIdx    = 0;* s, A$ v. X! M" m! _; l7 F
                paramSet.destCIdx   = 0;& P4 ?2 R9 Z9 g* v
                paramSet.aCnt       = PING_PONG_ACNT;
$ \; W- ?4 e! k$ ^0 l& t' {4 E                paramSet.bCnt       = PING_PONG_BCNT;
! b6 x5 w: K# r5 {( O  W                paramSet.cCnt       = PING_PONG_CCNT;" {; r+ b5 F$ P/ m* J
               
- u6 |- u" a' y# D2 l                /* For AB-synchronized transfers, BCNTRLD is not used. */
/ W3 @, h( @+ s! ?                paramSet.bCntReload = PING_PONG_BCNT;
- e/ v! p! k- ]0 t4 ]7 m/ z- r% E4 n% h2 s( y9 h) Y
                /* Src in constant mode Dest in INCR modes */
1 M. V$ L+ \0 m8 ~) z+ P! `4 [                paramSet.opt &= 0xFFFFFFFDu;7 G9 {5 }; ]' R- M0 W
                //paramSet.opt &= 0xFFFFFFFCu;
+ d) ?0 s7 O) w. P4 R1 C% Q- L% [                9 ~6 F* {# [+ j, I
                /* Program the TCC */- k5 Z8 f; K" @1 B4 Q3 j
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 `7 }+ p: K/ G( y5 n
$ y, G  w$ ^1 i: ^- c- H                /* Enable Intermediate & Final transfer completion interrupt */- v- q1 T) O' R" T+ n. O
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);- A% K0 O# c; l7 j
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, g# G* b$ c5 G& g0 y# \3 ~" G9 c6 y; I& w: }4 X8 B; l
                /* AB Sync Transfer Mode */: ^4 W5 v# m, u& h
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);  J# g1 v& \: r
                9 H6 B9 J. u! N, I- \% Q) Q) y
                /* Program the source and dest addresses for master DMA channel */
9 Y+ N: f  Q2 [/ Q$ Y                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);" {7 M, ^0 c9 g/ r% N& A2 w/ N
                paramSet.destAddr   = (uint32_t)(ping_buffer);  o! L# J; d, b. [+ a, P
! c6 Q5 q3 y4 A$ O! u( L
                /* Write to the master DMA channel first. */
/ \, \: R8 Q; U( o0 r! l                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
" K- ?# I* e* v1 K+ d9 d2 j8 e    }       $ |: P4 s3 _) r" G( y8 \# e
% K6 Q; n! K7 a
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);1 r0 _2 n6 ]$ M0 N7 i3 S, Y+ I+ _, F
        4 I# T. f* \- c: R
    if(result == EDMA3_DRV_SOK)
1 z8 [! d4 F6 J' W/ {% n    {
1 D. ?( u& J: ?- e" V            print2arm("edma3 driver init success.",0);
4 a) w) n* o8 d/ f/ d; T# `2 \    }
+ X5 T6 X! @0 J' q}7 e& K! d1 K( e  v. z+ r, k4 a/ O4 w
+ W9 |7 w9 f5 h0 W, Y3 n$ j

' m1 j0 X  [+ @* d; {& \2 s1 OEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 y/ n, V% k! d) O. q5 X. c
: N* w: \0 p* ?/ X7 J5 f0 W

$ j2 }4 D1 _) s" S5 Q/ P- r
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
4 J8 Z( {- u' \$ o每次DMA传输完成后都要再次使能传输
2 |, H/ |, T/ C8 |# p
原来是这样,我明天去试试,谢谢了!




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4