嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:! P( t7 ], V  F. O2 ?2 N
#define  PING_PONG_ACNT          1
1 Q& u' U# h& S9 T0 T#define  PING_PONG_BCNT          8*32*40
% f9 C* p- A" P: _4 c//#define  PING_PONG_BCNT       1
& n. ?7 A4 k, U1 G9 [% H* \#define  PING_PONG_CCNT          1
4 g8 |0 c- I+ p% k; v* S1 f% @#define  MCASP_BASEADDR          0x01D00000
; a7 f# D5 x# G7 l#define  Mcasp_RXEVENTQUE        (0u): A7 f: Z- w9 T: Y' ]

6 X! x* P& v7 l/* OPT Field specific defines */
( c( T6 I* }; \0 o* e, h#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
+ c9 b& s/ {2 I4 Q6 @#define OPT_TCC_MASK                        (0x0003F000u)( Z8 T: P2 O7 A& B2 U  X8 g
#define OPT_TCC_SHIFT                       (0x0000000Cu)+ C- D, F/ @5 l
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# g: {' J8 {3 l* `; H#define OPT_TCINTEN_SHIFT                   (0x00000014u)
; U  R& W* H, J3 L1 x5 k2 x! u! x4 k# l7 X
char ping_buffer[PING_PONG_BCNT];
+ g" N4 l9 W+ tchar pong_buffer[PING_PONG_BCNT];( Y0 t5 C6 o5 d

8 Z7 u1 Z+ `; v1 o' f" F
2 [4 L1 Z9 e- E+ z, L
! G3 \& G  ^8 K8 }* i: r
* E( T9 E1 i4 E( o; Gstatic void ys_edma3_init()
* c* ^) ~! f4 W" |8 g{* t$ o. c! f/ W2 y
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 X# T$ E+ O& }) W$ r        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ F0 N; [1 k* _  J! D        EDMA3_DRV_Handle hEdma;
' \" V: v4 K1 Q; d9 _    uint32_t chId   = 0;  Q! v, Y8 P- \5 L% _' C
    uint32_t tcc    = 0;
+ P" |2 g  q: T6 A: U! `: t' X3 L/ U: h. o0 q
    print2arm("edma3 driver init...",0);4 D! P0 Q* X" Z* h) y* K+ o$ D

  |3 O$ \2 D; @        hEdma = edma3init(0,&result);, [+ x% ^4 n4 g+ t  C$ t- K' L0 y7 ]
        if(hEdma)+ B; ]) C, H1 Q/ F  X+ ?
        {
+ c; E0 `" R; o8 T: ], V" }                print2arm("edma3init() Passed.",0);
* n* Y2 |( ~5 d) L3 c        }
; j( S( L3 e3 A* @        else
* N. n! S7 N. A# i6 A0 Y" |1 b        {2 E( g# f" O; Z
                print2arm("edma3init() Failed.",0);
8 j: y: T9 G4 A/ z$ k        }9 m! |6 L' G" g( m3 Q7 i
        / Z+ I1 a' L% d# Q% @( K/ Q6 L2 z. {
        if (result == EDMA3_DRV_SOK)
+ a" D6 }3 j# J: R: O    {
2 r! I1 x$ g; J* H0 E& O                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 {; W; J' e8 _) N/ u' M
                                                       (EDMA3_RM_EventQueue)0,. J6 ]; A9 S/ b
                                                            &edma3_isr, NULL);
3 I/ U" L, L( K, U    }" l7 V+ p- [3 w# g( E7 K
       
6 [$ N$ V& F" }$ A6 \; F        if(result == EDMA3_DRV_SOK)
2 ]4 X) T/ b, r6 o3 \        {8 I  s/ V* e  X( e6 U9 b
                paramSet.srcBIdx    = 0;
# D$ z4 U: ^' X" n) P                paramSet.destBIdx   = 1;
. Z; p( y) a/ }                paramSet.srcCIdx    = 0;* s' ]; M+ h, ~2 F& u) {
                paramSet.destCIdx   = 0;
" m' g- P9 g) F$ K- m, K% ~& u, F: w                paramSet.aCnt       = PING_PONG_ACNT;
  d, l" }3 s5 C+ h  z! D) t/ \, [                paramSet.bCnt       = PING_PONG_BCNT;
) u$ \: Y2 L+ m0 A9 n1 d0 ~                paramSet.cCnt       = PING_PONG_CCNT;/ U3 D$ x$ J9 d4 R7 J+ g
                + n! e" \% u9 \# D5 F
                /* For AB-synchronized transfers, BCNTRLD is not used. */
# m; I$ Y5 `% [, @, F                paramSet.bCntReload = PING_PONG_BCNT;
' ?7 ^- n: X, H( T6 y* z, T
, W1 U9 R( B0 Z. I# \( \' E* z                /* Src in constant mode Dest in INCR modes */
9 a7 y% k# t# f/ x: ^# X                paramSet.opt &= 0xFFFFFFFDu;( v& C* z2 J7 O- k, I/ {; Y5 B
                //paramSet.opt &= 0xFFFFFFFCu;, F; ^$ H6 [7 ]" y$ a6 U  y1 |( H! s4 M
               
. B# t& B1 x( ^4 Y: h                /* Program the TCC */# E! n$ @2 ]  o
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& i3 A' S( n7 |8 {" d# |$ u
8 y3 Q7 ]3 u! L5 g# G                /* Enable Intermediate & Final transfer completion interrupt */' H0 l* K+ ~+ K* j+ K. u
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 N7 ^4 k. W& o3 [                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 Y& l+ m- Y) C
/ J$ c( t& M9 b8 J
                /* AB Sync Transfer Mode */3 h  q" X8 J. m6 ~: s5 L
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);0 r% y- c( h2 W+ Y
                2 ~- W, `- x" s" C" S- ]& E
                /* Program the source and dest addresses for master DMA channel */3 R3 o" H7 s, M# V0 m$ n& a
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);2 p1 t% C5 w8 {  E
                paramSet.destAddr   = (uint32_t)(ping_buffer);
0 H) w, m* {; u7 j1 D( T1 ~5 B' o* ~7 S9 M& {6 W! T0 s) e
                /* Write to the master DMA channel first. */6 m  l$ J8 A- F* B
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, c: T# v6 N8 q/ D/ O1 q
    }      
2 E5 Q3 A! R3 u# c) f9 P( F1 g
) W+ V. z. |+ A  G) @! n+ u        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);4 y1 {! S5 o4 Z& ^! j, J0 ~% r
        " S/ j! r/ P' {. C/ s
    if(result == EDMA3_DRV_SOK)
- Y0 Q3 l' K1 [# q    {
0 S, Y: @% g8 E, @" s' E9 q+ d8 @# d            print2arm("edma3 driver init success.",0);" F6 X: O, i& e8 E' s% o
    }
' K, X8 e) X: R5 T4 p! ^}& d3 G# l, Z7 T2 I8 @3 f: j

4 J0 ]  ~+ d2 f9 p: O; F# t; Y2 Z2 y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! ^5 y4 f+ D, _& C+ }0 o" Z" g

/ f3 A% q. e2 \1 F  @' H4 e6 c5 `5 t, z6 R) i

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47# ]7 d9 O$ `6 s- G, z8 ~
每次DMA传输完成后都要再次使能传输
4 z' }& j- p6 c& t6 ?' ?
原来是这样,我明天去试试,谢谢了!




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