嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; U, A8 }/ Q9 [0 v& S; B% K
#define  PING_PONG_ACNT          1
' \) u/ @% Z5 l7 i' m- R* f/ ^$ s: c$ H#define  PING_PONG_BCNT          8*32*40 / k/ a/ b  U/ D$ ^. V/ F: [
//#define  PING_PONG_BCNT       1
, x# \- k0 B/ W#define  PING_PONG_CCNT          10 Q9 h' C6 J' P
#define  MCASP_BASEADDR          0x01D00000
/ I: U0 D2 y8 {8 D% J' {#define  Mcasp_RXEVENTQUE        (0u)
8 ]+ Z8 P; U$ H, Q% I( J9 W8 K& s, G3 }1 q0 j6 [
/* OPT Field specific defines */' a& S9 a; [) Z0 H" M9 f* ]
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)" X8 z( d# k3 o( z( i
#define OPT_TCC_MASK                        (0x0003F000u)
0 Z, m. N3 B, a( h/ h& _* \/ r0 Q#define OPT_TCC_SHIFT                       (0x0000000Cu)
% F( P& U: a& t3 t2 W#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
6 h0 R) q1 X) E; E#define OPT_TCINTEN_SHIFT                   (0x00000014u), B2 t( q6 H8 ~5 S/ z! |

* t1 D! L, f+ u0 Lchar ping_buffer[PING_PONG_BCNT];
8 l# u6 z6 C5 x8 T& u2 T1 t0 A+ Rchar pong_buffer[PING_PONG_BCNT];. b: w& ?- E6 m: Q& @( x' ^

$ X  `9 c) u. L6 M/ h4 x
" G) W1 _5 `( Y, a* r# H
" U. ^7 G5 I% f1 S# E
2 D. I4 d1 g2 h! F, J( y. [! E& D7 Zstatic void ys_edma3_init()
6 C+ k* N; y& Z+ O0 q* n{3 _! m5 ~( V$ S+ H7 |" N
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 r7 ?" V' B1 t        EDMA3_DRV_Result result = EDMA3_DRV_SOK;$ E2 U5 H# \, R% M( O/ k
        EDMA3_DRV_Handle hEdma;4 @, }; J0 C2 |% S8 ]% |( k7 L: a
    uint32_t chId   = 0;
$ C- p) \  }  J( I/ X    uint32_t tcc    = 0;* m7 t( e* @& ?5 U
7 H' Q7 ]4 h8 I
    print2arm("edma3 driver init...",0);
9 @/ R0 h+ t' M% ^, R; Q6 ], n( e0 S1 f& r- Z8 ?% `
        hEdma = edma3init(0,&result);# b, j) q6 U( O: p' e) P+ r
        if(hEdma)( ^( S  A7 G" a' m
        {
2 N% F* A- {! {, F                print2arm("edma3init() Passed.",0);
/ ^2 g+ k; ~8 q: c: b5 l5 m& o- x        }* Z8 M2 `1 Y+ B! _) m- U9 y
        else) t. W' d; B4 _. |9 _- k
        {
  a, o- b' X1 z                print2arm("edma3init() Failed.",0);. r( T# |; J9 z
        }
8 i7 R; Q/ |1 ^- B8 q1 T7 I& G        1 E8 Y- x5 J) d4 P$ Z
        if (result == EDMA3_DRV_SOK)9 @1 U8 |; G( V( V7 Z9 @/ W
    {. g6 L0 D" v* y0 f) ~1 c
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
- y. ?( h. Q4 c8 j8 H$ R% b: J                                                       (EDMA3_RM_EventQueue)0,, \6 L8 q7 Y8 @$ c7 o# t
                                                            &edma3_isr, NULL);, Y5 D+ ?) Y0 w' m+ l; S' M3 t* T
    }
- w/ n# ?- ^' u9 D0 G" E. \       
" H" Z, s9 J: @3 F5 p+ B- A        if(result == EDMA3_DRV_SOK): T& \7 X1 Y( W: N$ R6 D$ M
        {4 ~% c! r9 O$ ~6 I
                paramSet.srcBIdx    = 0;
, g# `; C! M, ]2 ]$ O) v& V                paramSet.destBIdx   = 1;' l( ]4 i# H$ `  V! ]
                paramSet.srcCIdx    = 0;( f7 N% a* G. ^6 H2 c- K
                paramSet.destCIdx   = 0;
, b0 ^& M# K/ R" S- w$ m" j                paramSet.aCnt       = PING_PONG_ACNT;* V! A8 q! u& j- {3 t/ g
                paramSet.bCnt       = PING_PONG_BCNT;
$ v. {+ S0 z) Q6 e4 P" ?                paramSet.cCnt       = PING_PONG_CCNT;
( W9 Y4 X+ N, [; A* G& a* {2 S               
3 ^' G/ R) a6 O4 Z, z1 w3 ~                /* For AB-synchronized transfers, BCNTRLD is not used. */
# h6 @: ^7 _, v- K                paramSet.bCntReload = PING_PONG_BCNT;
- X5 r1 r: P" m$ a* {+ F3 Q+ Y' L6 E# i, Q
                /* Src in constant mode Dest in INCR modes */0 a- @, `+ {  \! b* D
                paramSet.opt &= 0xFFFFFFFDu;2 Z, Y; z. z( M: j- O/ [
                //paramSet.opt &= 0xFFFFFFFCu;
* S: e7 A, H& e* d, z                9 K4 V  {1 l' g+ h) k0 ~( E
                /* Program the TCC */  n+ [2 @! v3 T/ P7 _. O
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 V9 _1 M' `1 K3 u# S
1 Y: e1 \4 P. j5 ?* M                /* Enable Intermediate & Final transfer completion interrupt */2 ]/ I6 N' I5 ^8 W& F, y: s
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 K0 \/ d  y6 ]9 X/ `' d- ?7 F                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 U( P/ \4 r. U) P) E! W% A. O  u
                /* AB Sync Transfer Mode */& m! s' \9 a1 P1 k
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);" k8 \5 [* k4 C
                1 ~2 A3 s$ E- u# N
                /* Program the source and dest addresses for master DMA channel */
3 j* l7 p# |) o" G$ _/ ?- n6 M                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);. g7 o6 W! Y6 F
                paramSet.destAddr   = (uint32_t)(ping_buffer);: k: G5 ^* h4 p, i6 l3 D9 @

% U7 e" a4 o6 |/ W8 ^5 z1 p( T  T                /* Write to the master DMA channel first. */
) y( a: {3 a0 q3 R( Z& y% D' d/ ]7 n# E                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
9 E) |- d. E7 K4 k* a3 Y/ w* s    }      
. h6 x) A2 j7 v; B+ _/ @7 X- @$ u9 E' r% A7 w
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 r7 _; ]- }$ e; x, ]$ e8 Y
        , o* I* V; q1 L) Y2 m
    if(result == EDMA3_DRV_SOK)
0 F7 @; B9 k/ _. @9 g, J. X    {# t/ `: F$ P' Q* Z  u3 h9 ~  U7 T' Y* Z
            print2arm("edma3 driver init success.",0);
$ Q. {0 o5 \" L! r* Y2 l# P    } - T! p2 @) @9 {- q, m4 M4 s# Q% Q7 j
}" L& M1 j+ {+ @* O+ q1 ]

! |! ^8 F7 \0 W3 j' a; \, U3 |" P# K, m$ b
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。/ B5 b7 m  P" m  Z! _* [/ o7 R
$ Z. g5 j8 G2 h8 p8 t4 Z

7 p# K1 D; d* j! K$ z5 p  X
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 J$ d" f5 j  e* e- a2 n每次DMA传输完成后都要再次使能传输

/ m8 b8 @4 i: E: P原来是这样,我明天去试试,谢谢了!




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