嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ E# L: {0 C0 V6 m8 W( E#define  PING_PONG_ACNT          1. F! Z, m6 `3 o+ z6 h4 H
#define  PING_PONG_BCNT          8*32*40 1 q5 B7 J# E8 J1 p
//#define  PING_PONG_BCNT       1
% l5 Y& y2 k( ^#define  PING_PONG_CCNT          13 I3 x1 @3 L" z4 f1 u/ }4 t7 T
#define  MCASP_BASEADDR          0x01D00000
6 Z& A0 W5 h) Y: q9 |, x#define  Mcasp_RXEVENTQUE        (0u)
; m6 Y1 A$ f- C6 v+ A* U3 D# Z) p; F0 k
/* OPT Field specific defines */
5 S! |% a/ K6 T8 @#define OPT_SYNCDIM_SHIFT                   (0x00000002u)# K# ]( J: p) o/ H. N/ E
#define OPT_TCC_MASK                        (0x0003F000u)
+ f8 p& [0 j2 n4 R#define OPT_TCC_SHIFT                       (0x0000000Cu)- X# @3 F  |5 b; x, l: x
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
" j, N% d3 O+ ]$ d2 ?& s% m0 x8 Z#define OPT_TCINTEN_SHIFT                   (0x00000014u)
& a2 W8 W1 T! v7 a- t
2 Q6 J6 e- P6 ]5 Uchar ping_buffer[PING_PONG_BCNT];
2 T. H8 R& s( d( x7 g8 Q6 Kchar pong_buffer[PING_PONG_BCNT];: ^% h, q% V! `. I  n
% m% q, e* z. Q6 F% @/ P& v
2 p# T* O1 p  z2 x+ [0 K

7 t- e( Z: Y& t' s* V3 h
" a+ S. C) k- N7 A, Mstatic void ys_edma3_init()7 u# B: M! j  f9 ?6 X  N
{0 ]$ c( C, N# e* O
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};8 m4 o" g( Y1 W- X2 w, s
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 I5 P' V/ }4 ^9 Y+ z  b        EDMA3_DRV_Handle hEdma;7 [) t& ~; D4 S& A' h9 E' I- A6 @
    uint32_t chId   = 0;$ H1 R8 J3 `( L5 ]
    uint32_t tcc    = 0;
1 j$ k& ]2 @0 d0 {/ M3 [
/ T5 a# I' |* F7 h- v/ |5 R3 U    print2arm("edma3 driver init...",0);# C2 L/ h; Z) F; X; e
- G- P: W, ^* {7 p9 a, R
        hEdma = edma3init(0,&result);! p( ^  N/ D' C; W+ l% f: q
        if(hEdma)3 \2 v5 h' {  x4 s
        {; U/ W1 T( \7 U
                print2arm("edma3init() Passed.",0);7 U! B) M6 ?, F6 m5 f8 r) x
        }
* W$ y1 E/ L+ l! O4 t9 d9 a3 ~        else+ h/ t5 a4 \' N: b1 [5 z  Z
        {
; i: R- E" w# g8 p                print2arm("edma3init() Failed.",0);
* {) ?% {4 ^8 g/ ~$ h6 [        }
1 F- ~+ S* y. L5 ]" |8 H. `; H        ' A0 {9 N& k* P2 ^
        if (result == EDMA3_DRV_SOK)
# `* t  H& D, Q    {! ~" }' v- l5 F% M
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; S3 w9 [  U3 l2 r                                                       (EDMA3_RM_EventQueue)0,, [. ?+ g+ t2 S) U+ ?) o
                                                            &edma3_isr, NULL);/ h2 M$ C$ q' a1 z# s& I
    }
0 S, T2 B! S4 z. b, d        & ]4 F- ?* b$ R! O* p3 U' W
        if(result == EDMA3_DRV_SOK)4 T, w( U& g( M; l- v- P- H+ I
        {
( V5 _( x' m  v. P1 K7 ^% g                paramSet.srcBIdx    = 0;, o$ `# k  n- {: \3 n
                paramSet.destBIdx   = 1;
" O2 w' }, |: _4 F  B+ _                paramSet.srcCIdx    = 0;; p+ u. Z# Q! E! l" S' B
                paramSet.destCIdx   = 0;8 H2 F" T. Q; P
                paramSet.aCnt       = PING_PONG_ACNT;* ?6 j- l; R' N: ?" j6 [. B6 B
                paramSet.bCnt       = PING_PONG_BCNT;
& i% D! K; {- G0 j; t1 K: M3 x                paramSet.cCnt       = PING_PONG_CCNT;  a( e6 ]; s" ?
                / i% J' l7 c: l' @: B1 j0 x3 t+ G
                /* For AB-synchronized transfers, BCNTRLD is not used. */1 t$ Y* t, y& D$ }/ I  {( I
                paramSet.bCntReload = PING_PONG_BCNT;9 T- W* T1 m  v! v# d2 g
5 e" p: ]! D' K" R  ~
                /* Src in constant mode Dest in INCR modes */
( Z9 Q" Q! f" r) I                paramSet.opt &= 0xFFFFFFFDu;
5 J7 S. s; K3 r6 C/ p; c. P                //paramSet.opt &= 0xFFFFFFFCu;
7 {- \. B( c* m               
) v$ U7 f( m& S+ y$ @1 O- j! M+ i                /* Program the TCC */! W( ?" ^) N7 h  k6 X9 u1 T
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 k; ~6 H6 c, C: M: \9 C; ^# H% X( G9 \7 \/ H3 d: B
                /* Enable Intermediate & Final transfer completion interrupt */7 I: \9 E& @. b( H7 I8 T' k+ i% b0 U
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, T0 B5 n6 S8 u1 ]
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);% L, Q4 ^* V5 o% g

( K; x" D0 T" S                /* AB Sync Transfer Mode */
. l* ?4 L5 j- t/ K) a3 J                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* n5 T2 C$ H' @! y
                * q& q- C* g! M$ v, t# O
                /* Program the source and dest addresses for master DMA channel */
; H; ~2 b2 j2 F: U0 \                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
7 x$ m$ q- X% X4 r, j* b                paramSet.destAddr   = (uint32_t)(ping_buffer);, P) _' \  d8 M7 _* B2 P
, p6 E! d/ i& M, ^& X
                /* Write to the master DMA channel first. */
8 y2 x$ C$ P+ T6 T* H                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 X7 e& I; \9 m, P6 p# M
    }      
7 g  U7 [; x/ ]7 Q9 r
4 }* F  D, ^$ Y% ~& I2 y9 l1 }9 ]        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 @  y" \3 j5 z$ q( E2 S
        - }, d( D# s: w  m5 E
    if(result == EDMA3_DRV_SOK) % A/ C' }/ @7 }
    {$ Y+ Q( o% x. ^4 S/ t4 @- `; [
            print2arm("edma3 driver init success.",0);
$ s- v  m- |, [, M    } ! h# u- n" ^+ M' u. d& Y) W7 S
}
4 I' I& T/ u6 ~, {; G! u: [' Q. h  x4 l
: j  H( z/ R1 o. c0 E
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ L5 i1 b1 w0 Z3 J1 u% p4 A
! Q! X8 G8 N: h* D( T" ~( B- S
8 G9 _4 p* j9 q7 v" M
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:472 o* c& K+ R, Q9 d: O* S  y3 D
每次DMA传输完成后都要再次使能传输

0 }1 y. V7 p0 _1 Q+ X9 X1 O原来是这样,我明天去试试,谢谢了!




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