嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ F, R- P) r* a  |  F# I1 v5 _5 p#define  PING_PONG_ACNT          1
6 Y; X3 _. T3 C  c  ~- d* t9 T9 L/ B* _#define  PING_PONG_BCNT          8*32*40
" H5 q* c5 V2 Q1 n! R//#define  PING_PONG_BCNT       1 5 c9 y* O: k/ N* I3 a* }
#define  PING_PONG_CCNT          1
, u: o5 t3 g# [5 L4 V: ?# b#define  MCASP_BASEADDR          0x01D00000# Z0 _4 Z, i9 {2 z3 `9 E
#define  Mcasp_RXEVENTQUE        (0u)- C% c: O8 f* \7 U+ Y" q! _3 `3 }
9 B- V+ ~5 ]! _7 e; ^# f, m( Q
/* OPT Field specific defines */
$ N+ U0 v# r6 @1 T5 s#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
/ ^) F( P1 l8 g" ?6 n( }$ N#define OPT_TCC_MASK                        (0x0003F000u)
- \& m( G# N4 x6 K" K#define OPT_TCC_SHIFT                       (0x0000000Cu)+ H" A5 \2 s, u2 z6 E2 a! u
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)7 ]# e7 C" O- S
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
3 F! c, f" n! l' X" O7 y* x9 Q% p6 o# e. Y2 S8 q' ?
char ping_buffer[PING_PONG_BCNT];* k% R. J- y" \" K0 g
char pong_buffer[PING_PONG_BCNT];0 z0 Z6 X* t% K" R2 O$ |' t3 F* h
/ J" ?' d& K2 x$ R  \

$ E: t0 O9 i4 o# `+ r; [& h0 B; i+ C; X: l6 ~* P" A

+ W# C' Y3 p4 E% [' y. Dstatic void ys_edma3_init()7 n4 C6 h1 _6 S" a: R- P
{, Z) w4 o, u. p6 v
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 v4 ?; d! n* X0 X        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. d! Y/ v3 T& J3 X        EDMA3_DRV_Handle hEdma;6 r+ a8 M( Y, O1 B9 y3 c; h: {' s
    uint32_t chId   = 0;8 P3 U8 \6 O; S* K9 p5 L0 S
    uint32_t tcc    = 0;, Q/ _/ R3 z; ?; f! C

6 G- v" q6 Z# h! ?2 \    print2arm("edma3 driver init...",0);
" D, U$ c: V$ ~
7 K: U- u! b% A) \+ S        hEdma = edma3init(0,&result);8 f. N4 p; U  D) F
        if(hEdma)1 _7 X7 O- }' ]) `- V! y5 A* O
        {
$ J; U( I! B1 d4 y2 Y; J9 Z9 R& q                print2arm("edma3init() Passed.",0);
3 j, y+ o) L+ q        }) a$ C6 w5 U5 E' n8 d$ S% |
        else& T3 M. d. c8 M' o: y
        {
  T. Z3 e$ B$ F: f3 M: I                print2arm("edma3init() Failed.",0);
+ d7 D) a9 H" ?# Z* n3 p) D        }
, U8 K0 T" x9 s2 D+ s        2 Y& b' C$ m* {; I1 d2 H
        if (result == EDMA3_DRV_SOK), K- s& v$ X0 w2 R. [
    {1 [. v1 T5 ~' ~6 n% B0 Z4 q. R
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ R+ b8 R8 ^5 j' G( `* ~
                                                       (EDMA3_RM_EventQueue)0,! z8 q4 ]5 r1 V5 |( W" v# _
                                                            &edma3_isr, NULL);
* ^! a3 k4 S& x& A3 Z0 x; t    }
; H4 Y* d+ E& O- Q. R       
8 G8 s" g' }" }2 H        if(result == EDMA3_DRV_SOK)1 H" L' t; q( i; X! }  k$ n% P
        {* H$ Y* F* [" p# }3 e) y
                paramSet.srcBIdx    = 0;
3 w' ]5 O, A- r( e2 v2 C5 P9 S                paramSet.destBIdx   = 1;- I) A3 R. \! n' {) D- f
                paramSet.srcCIdx    = 0;3 G  U( {+ |( M: p( A
                paramSet.destCIdx   = 0;
! F% A  B' ~, c                paramSet.aCnt       = PING_PONG_ACNT;' _2 o5 T0 ]! Q# e$ Y' Q
                paramSet.bCnt       = PING_PONG_BCNT;
( s( m- I' V2 `8 P# i4 X: D                paramSet.cCnt       = PING_PONG_CCNT;( {, |; U3 M6 t! u+ ], G
               
4 y6 r; e  A0 l7 m) L9 S                /* For AB-synchronized transfers, BCNTRLD is not used. */
- S& h9 X" b6 B8 L                paramSet.bCntReload = PING_PONG_BCNT;
0 o7 }3 Z6 |* ~% i' f1 J" ]: P# ]' ]
                /* Src in constant mode Dest in INCR modes */; v  d0 @& [& F' A- D
                paramSet.opt &= 0xFFFFFFFDu;
+ E9 G& U' [1 n+ T  B5 Z                //paramSet.opt &= 0xFFFFFFFCu;# y7 K# N/ B& T- Y( E: k
                1 k. ]! j; g5 J( h# j
                /* Program the TCC */
- S% v; D( w' e$ u1 b( _                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 e' L; }+ b5 B! \  D5 y
* r) S" R( [1 ]* y. a/ l                /* Enable Intermediate & Final transfer completion interrupt */
' l4 U' o, v. C! @: t0 x1 r; F4 _: E                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ {2 R9 O" U( d2 j" r* q7 F( Q                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ V# b* R! k# `4 N4 Q# P
, S7 h9 V5 @8 \. i7 J: _1 O3 `
                /* AB Sync Transfer Mode */# v" M3 q0 w6 y
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! O' k1 T1 G- R$ c2 C) u- N9 c                - [& t# b- f! I5 w
                /* Program the source and dest addresses for master DMA channel */- P+ G1 Z5 F# J9 ]6 ]% a" N0 G
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
6 ^* E0 v; M) O4 s6 _2 {                paramSet.destAddr   = (uint32_t)(ping_buffer);$ f( h, D9 X' x

$ I! m( Q; w) X% T" Q                /* Write to the master DMA channel first. */. j0 P5 q  Y! ~( R( L
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);4 k# Z6 w! q* C$ B# T4 Z
    }      
! V( M6 D( s& `( |. i+ Z% L" ]" G8 ~$ `4 N0 @
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ w, q" V: @6 ]( A: O4 h- V* Z6 D2 X
        ( C( g& }4 ~3 H; ~
    if(result == EDMA3_DRV_SOK)
9 @. g5 Q0 U" z& C    {9 M2 I0 s* {7 v$ N1 ?; c
            print2arm("edma3 driver init success.",0);7 W+ K! p" G" a- U! n) ^
    }
3 W! L- L( E5 ~- ^5 F}+ ^) k6 e! a, ~4 U  ?

- p: Q' Y( ?0 P6 _( D3 T" B& L' ]7 |0 P* [9 x/ F" K: L
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' _/ j6 ~* b4 B6 e* i/ n
% D8 s. u) D% P
  K7 y. |6 a1 ~
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47+ J* z& |6 ]& s$ ~" f) P8 @
每次DMA传输完成后都要再次使能传输
3 ]* g9 }% Z5 B: B! q% C
原来是这样,我明天去试试,谢谢了!




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