嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:4 ]. t+ V7 @* M. n2 B
#define  PING_PONG_ACNT          1
$ T; f3 ~8 V* w" Z! D#define  PING_PONG_BCNT          8*32*40 3 k9 o8 L4 I3 E4 h
//#define  PING_PONG_BCNT       1 ; J( D; D( R0 o8 @* @
#define  PING_PONG_CCNT          1
. I- g/ Z; ?: f$ ~* F, G3 V#define  MCASP_BASEADDR          0x01D00000* ~' W& [; B$ x) _6 F
#define  Mcasp_RXEVENTQUE        (0u)$ P/ d& }  d# c& v
7 G6 {; L/ Q3 g6 b* N1 `( G, C
/* OPT Field specific defines */
/ f- M  _, u' O; [5 B4 R  e! F#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
' u% k, W1 r7 |: h  F5 n#define OPT_TCC_MASK                        (0x0003F000u)5 G# Z# P, @! P( N8 y, [
#define OPT_TCC_SHIFT                       (0x0000000Cu)# a- ~0 E3 P! R4 S6 s2 W
#define OPT_ITCINTEN_SHIFT                  (0x00000015u); O  ^4 W6 @* J( S) x" I  k
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
" y! m  V- a0 s+ N: J: P3 a& Z% ?4 T$ e. K2 e8 W3 H/ K9 s- l
char ping_buffer[PING_PONG_BCNT];
9 |9 i7 v# \8 Q- w; c1 E( M, i" Pchar pong_buffer[PING_PONG_BCNT];) q1 L& F3 U3 f3 g6 J. E. v
6 H5 C+ ~" Z& ?& b! A
8 d; J. E3 k( j

% `9 a; p# S  x/ D; `" v6 Q" n& _- ~
static void ys_edma3_init()
. ^0 B. F7 A- g# A$ C) C{
& [8 |1 O8 K* C# V  n6 p. }        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 p+ y/ L+ D- R, _" K: G0 t! I        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& V. J% E) [( T: |9 W        EDMA3_DRV_Handle hEdma;
" {, e& k) @& E: m! V1 w2 ?    uint32_t chId   = 0;0 r2 Z9 T6 I  ^6 c; p$ P" O
    uint32_t tcc    = 0;
6 I9 E  d( b7 [0 G4 K$ x
! p* v, s! W. j) \    print2arm("edma3 driver init...",0);
4 M8 u" f' u+ T9 u  ^
. N5 i+ d9 K7 e- g* F        hEdma = edma3init(0,&result);1 D3 p8 V* r: K0 y9 }
        if(hEdma)
: S8 O5 m6 j% c* O4 z  r' ~. i        {
% b6 P9 y" k9 q& t/ a                print2arm("edma3init() Passed.",0);
! b5 ?4 l: e1 A# |; T* ^, d$ l        }
/ u- q1 V- D# j% w9 j/ t. K1 a* y        else+ c" J3 s$ R1 o9 Z
        {
/ d# N# Q' \( J# {! r" h                print2arm("edma3init() Failed.",0);6 ^6 C9 V  W8 ^0 b" j. U( b# x
        }
! T5 `4 _. L5 u; q( I5 W        " x$ o& s6 y& {6 u0 ]
        if (result == EDMA3_DRV_SOK)
$ B2 Y: P- h& _9 ~0 u1 Z    {
7 J- ?- C9 {: C( \                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,; x- I6 l; j% c$ B* w* \/ W
                                                       (EDMA3_RM_EventQueue)0,
* P& R7 _3 }0 |/ d. N. J' q" [$ L5 Q                                                            &edma3_isr, NULL);" J4 e/ p% V% D! W) o4 L
    }- I, h& d& ?, Y( A" U! o4 w' D5 ^
        8 D1 t, I9 I: W+ ?% P& R
        if(result == EDMA3_DRV_SOK)
! b) Z5 h" N' ?; U4 a; A0 U9 E: q        {4 }, `* e4 X& v1 @
                paramSet.srcBIdx    = 0;' q$ U( B- Y) M
                paramSet.destBIdx   = 1;
2 x5 B$ S7 W3 A( R4 u                paramSet.srcCIdx    = 0;  l2 ]9 \" Z" z/ J
                paramSet.destCIdx   = 0;
! m+ N! ]0 X1 Q                paramSet.aCnt       = PING_PONG_ACNT;0 c/ ^1 f3 ~) ^6 r  i
                paramSet.bCnt       = PING_PONG_BCNT;
# {) I5 ]8 [% G) Z! B' s  r                paramSet.cCnt       = PING_PONG_CCNT;
( O# X% D$ h4 Y3 \' |% M0 H               
1 f  k3 p5 V& V6 J; z                /* For AB-synchronized transfers, BCNTRLD is not used. */( r8 I1 O/ G. l% j, u
                paramSet.bCntReload = PING_PONG_BCNT;
( m- f& ~1 q( |5 K5 T9 X3 U: v, m& S* W5 y& J, m3 [
                /* Src in constant mode Dest in INCR modes */8 o. q; K8 n  `5 }
                paramSet.opt &= 0xFFFFFFFDu;: B, F' p2 X7 u# J- G
                //paramSet.opt &= 0xFFFFFFFCu;
! w7 H+ d, L7 z0 U- {               
- |; I+ c0 {5 _; a/ `0 J4 n                /* Program the TCC */
1 P% g, N6 g6 j, _8 `; g  N                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ K9 x7 Z2 g6 {5 \  k" D; `6 ]

% g- e% j3 H4 X6 ~/ d                /* Enable Intermediate & Final transfer completion interrupt */
# i1 Z, f0 f4 e                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. M- f' F7 E) ]
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ P/ B- q* k/ v; M3 X1 X

$ W0 j3 A! W. e                /* AB Sync Transfer Mode */: R, @1 z, z; L, R8 L& S$ D) H- c7 T
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* j% \+ u" ]/ d; ^1 L+ M+ ^               
  D9 P( X6 l3 F5 j) k7 B9 c1 S/ O- J                /* Program the source and dest addresses for master DMA channel */% f( B" f4 H7 _  J; w9 e
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);- g' D8 Y& b! q% F
                paramSet.destAddr   = (uint32_t)(ping_buffer);/ f& ^0 e; }6 p% K: [+ S$ m

7 A; h6 Y$ ?, k3 d! T4 F                /* Write to the master DMA channel first. */7 u1 w5 l* A+ E9 n; i
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
- Y$ N1 ~5 d4 q: C9 T8 G    }       ) P- W/ d5 d% l# t) i& ~
7 Y3 A* ^9 h$ @  t% Q4 B
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);0 U; }7 W9 I9 I. h/ O
       
. [/ l( f$ I9 R9 H! o0 x0 b0 z$ [2 o    if(result == EDMA3_DRV_SOK) 1 k8 |' ~4 U: P+ D0 _2 F
    {. y( Z4 m$ @  i0 a7 `" l; R
            print2arm("edma3 driver init success.",0);2 ]9 ~, H- J6 O" u
    } 0 P( `% A" N5 W5 k% E+ M
}& _2 N2 K9 k) y5 J" w

& q4 m) s3 N% O5 C2 P; i3 J: w# u1 t) p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 ?7 A) Y7 j+ t, p/ \. o1 f
' a, B4 P8 g0 f& m) U1 t. W3 _: x( c2 r3 r4 O" i" ]( B

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) ~; f  D3 g) n$ g2 R9 [每次DMA传输完成后都要再次使能传输
1 z- t  F- h2 V, t( h! N- ]
原来是这样,我明天去试试,谢谢了!




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