嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* X4 B% i! [+ x9 q" R' {#define  PING_PONG_ACNT          1- a5 G: g8 c$ |
#define  PING_PONG_BCNT          8*32*40 ! B; t6 C8 }# r  Q
//#define  PING_PONG_BCNT       1
& a& n0 S9 Y% e8 G: o# ]#define  PING_PONG_CCNT          1& x2 {4 G, L' L! c
#define  MCASP_BASEADDR          0x01D00000  h* ?. J* m7 F9 U) @
#define  Mcasp_RXEVENTQUE        (0u)
4 x8 Q# s2 v2 `/ T! D
6 l6 _% B6 K! O, i/ Z$ q- w) m/* OPT Field specific defines */% S% n6 H4 J" ]$ M5 B! ?
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)* r- P3 |7 Y& e, S
#define OPT_TCC_MASK                        (0x0003F000u)
- q  P8 F& D# N% J7 M" p; @#define OPT_TCC_SHIFT                       (0x0000000Cu)
5 N9 T% K" J5 X7 V4 t#define OPT_ITCINTEN_SHIFT                  (0x00000015u)0 D  S& C5 Y2 P  |9 k, V
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
: M5 j8 Z6 [+ U9 h. b/ s
7 X4 @4 v6 A$ }+ D0 \* l7 a: B! Xchar ping_buffer[PING_PONG_BCNT];( |  }+ _( \* S* l6 c8 Z
char pong_buffer[PING_PONG_BCNT];
% N5 O1 Z4 h0 ^0 x" e# Z& U8 z/ k# E# o& h9 Z, E1 v% s7 T4 e

" F, g3 A" ^) M
& F5 d4 ^8 }- W! }
! @* o; y7 r6 s3 o& V3 y* M2 J0 lstatic void ys_edma3_init()
2 @: `5 n0 r4 k+ b/ n{
2 ]3 ^9 i% B- u9 Y        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 `3 {; F8 W6 v        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 H9 Y- r) H1 O3 r9 `        EDMA3_DRV_Handle hEdma;
3 v7 e6 [& U  B, }+ @    uint32_t chId   = 0;, |7 Q" T1 P# t* Z) z! @( Q* t
    uint32_t tcc    = 0;7 l4 m2 k$ Y# I% d6 T# u2 I' a: H5 }1 B
+ X, y/ r) k& \* ?. ~& q& S" u
    print2arm("edma3 driver init...",0);
5 X& x8 v9 O: e0 a- x" }- ?5 z7 t
' E, o; Y# w+ k# X5 u8 R& I1 I        hEdma = edma3init(0,&result);
, _" {3 s4 U# q: }! S) D" r! t        if(hEdma)
1 o' L( L1 O) |+ b, d        {
9 w( B5 i5 ]5 e* y5 q. P* R                print2arm("edma3init() Passed.",0);
: B; w( T. z% O  E; ]+ Y        }
8 W7 W# G3 i1 T4 ~6 P        else3 t8 J) q- ^8 `+ Q1 O- F
        {  y$ b3 L! y2 z- Q# R; R
                print2arm("edma3init() Failed.",0);
3 N% k8 X( P% H3 c' j- ]        }- R7 i2 P& l; A7 Z% \' K
       
( ^. \1 y  ?: O) J, s5 B0 b        if (result == EDMA3_DRV_SOK)
. c# o/ I) @0 v7 H: C    {
4 q3 n9 f. S# p                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, t! `4 ?) R* v* t6 H. ^                                                       (EDMA3_RM_EventQueue)0,: z  ~# |0 t8 E2 ?
                                                            &edma3_isr, NULL);( R' b$ Z" Z$ M# U
    }2 d6 T3 k, ^/ V3 T# |  g% G) t+ y6 D
       
; Z' [: n+ D( z        if(result == EDMA3_DRV_SOK)1 H" R! y# J+ Z4 [
        {+ E2 a6 a$ m' g3 N6 o
                paramSet.srcBIdx    = 0;
7 T/ E( `4 v+ v% N, A6 {  _, ^                paramSet.destBIdx   = 1;
3 O; {/ F! {* ~0 \0 z0 f6 }" V, {                paramSet.srcCIdx    = 0;
: `( n- B5 a8 p/ `5 ]                paramSet.destCIdx   = 0;7 [6 }3 ^; R5 [& r! X7 v$ p+ `$ I
                paramSet.aCnt       = PING_PONG_ACNT;
+ _1 l: L& f- L( \. z                paramSet.bCnt       = PING_PONG_BCNT;! r6 v' x6 ^* M' k% A. w
                paramSet.cCnt       = PING_PONG_CCNT;$ l% N" D% [: ^4 |& k/ \) M
                ! E4 A+ T. {1 H$ K- @
                /* For AB-synchronized transfers, BCNTRLD is not used. */
" ]" J1 s- \  e2 ?! H! P                paramSet.bCntReload = PING_PONG_BCNT;
& R# F  E' N4 @6 ?! P
, O- ~9 k. Q$ r; \                /* Src in constant mode Dest in INCR modes *// D$ b0 Q: n7 C& L$ y$ m
                paramSet.opt &= 0xFFFFFFFDu;
3 |+ |5 N2 ~- u, i5 W& X/ S% W                //paramSet.opt &= 0xFFFFFFFCu;
$ c$ ^5 Z3 _  y- G/ x# J               
1 e( k) v# ?. {8 G" B1 C7 i1 z                /* Program the TCC */, g/ T4 p3 j, J- ~
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& a2 k. e2 Q5 r% y9 r# ]! f" x# x# z2 U2 f
                /* Enable Intermediate & Final transfer completion interrupt */: V) i4 {$ E) [6 Y1 v; B# ^
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. ^) m$ k4 K8 M; Q& p                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
" f# m  O. f% }+ k8 N9 f) H3 _
+ Y) s# u4 n- M! B3 y# X' d1 v                /* AB Sync Transfer Mode */9 L' d6 n; K1 M. k* P( a
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);9 D$ h, f/ _6 ^& b9 Z
               
3 j0 @9 J. J$ k1 ?8 w4 k- j# h                /* Program the source and dest addresses for master DMA channel */5 ?5 L' M) Y2 [6 Y5 d
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
- X$ X- N  M) X" I" a                paramSet.destAddr   = (uint32_t)(ping_buffer);
: o$ |: G, A# y5 [4 _5 F! r9 g9 q. y- h; K$ c0 S% S# L" g# J
                /* Write to the master DMA channel first. */. n: l& T! d) |1 i7 K* f2 j
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, _  d! @9 i: [) O" W3 ^
    }       3 N( c7 K1 C; |- W

; q( Y8 X9 c5 |. `$ t6 k        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) x( `. n5 i+ ?3 `6 \       
/ v; U/ K; j. |2 F% n( b2 h3 Y    if(result == EDMA3_DRV_SOK) / a/ C' y" F2 Q' u% M/ W
    {
5 [7 U% c" X; v& {* W* w/ N            print2arm("edma3 driver init success.",0);0 ^4 i, Z1 I$ r
    } ; \- [! @; |  [- {& X
}
4 C! [' Z9 s7 C% h2 M' e# F0 Z: w3 Q3 w- o9 m+ V' c$ J
! g: W+ k- O4 h3 j7 ^$ O! O0 i
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。- x# e6 N5 L1 t* B" s! _& V) d5 Y

5 U, H8 e, C3 ^/ K  i7 i2 r' k- `; a/ w4 L

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:474 v: m  U7 p7 @( L
每次DMA传输完成后都要再次使能传输

2 N4 d$ U9 |. s# A原来是这样,我明天去试试,谢谢了!




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