嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:7 O. t( U, r. B; [$ x
#define  PING_PONG_ACNT          1
' `6 u  K* g6 ^2 x* U0 U% o#define  PING_PONG_BCNT          8*32*40
/ h8 v) L  U- s; F$ d//#define  PING_PONG_BCNT       1 " r8 L' M6 D& }! N6 [, G/ K
#define  PING_PONG_CCNT          1! R* f7 O. P- r+ p9 b' n
#define  MCASP_BASEADDR          0x01D00000, g2 g$ {" I1 [8 X8 Y$ T( F
#define  Mcasp_RXEVENTQUE        (0u)
: \  {3 K( b4 Z" U& w6 G: x( n) u1 j: `* D) L
/* OPT Field specific defines */1 b+ e& h5 H& V
#define OPT_SYNCDIM_SHIFT                   (0x00000002u); J0 ?: \9 ?, M2 c  J5 c
#define OPT_TCC_MASK                        (0x0003F000u)
- Q3 \! c3 ^2 z' @#define OPT_TCC_SHIFT                       (0x0000000Cu)6 Y, w2 A9 ~& l
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
5 a) }6 ]4 s! p; V#define OPT_TCINTEN_SHIFT                   (0x00000014u)
% f) r$ n& [; \" Z
; Q; \+ U  q7 h' m1 s# O! Y, L* Gchar ping_buffer[PING_PONG_BCNT];
  o+ e2 l+ r0 Gchar pong_buffer[PING_PONG_BCNT];
8 X( p; m- l# _4 J: x4 v( \( z  _8 Q4 @$ O/ ^

' y) e+ w3 n* C9 ^9 M9 S; s7 B; A' B6 t. J" G

$ l# L; J/ @8 O: S7 Sstatic void ys_edma3_init()
6 G& S% h. h6 D6 H; V0 [( b/ `{! }: A3 V  U1 ~6 h& l
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};1 h" a+ p, v( R6 X
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ M: H( d3 H8 g* h0 @  G( y
        EDMA3_DRV_Handle hEdma;/ W9 o  F" {' o# D9 P- m) H
    uint32_t chId   = 0;' q9 n; a" x, q* g% R' h- D  j- `
    uint32_t tcc    = 0;7 A8 j6 p& z% ~7 K1 R& Z

4 |: f- g( i! X2 G9 h( g/ x1 h    print2arm("edma3 driver init...",0);
4 O0 y  R1 m' d/ u  G: K
- R. _. g8 T" S, U        hEdma = edma3init(0,&result);' \/ [+ |9 s  k! K3 s! @7 L
        if(hEdma): t* ~3 O: w: E/ d  _
        {
7 j2 h4 E0 T* `$ j                print2arm("edma3init() Passed.",0);# q8 z" F8 x5 O4 _1 ]1 A: a+ B
        }
5 |* p/ L% h( E  _# U3 e$ Q        else
- d) a* ?. K* N( J% s6 f        {
" N: R2 C1 J( y                print2arm("edma3init() Failed.",0);( y8 k* ^3 Y4 l
        }9 w! Y( _. E$ }) v
       
. Q! ]4 H, {- u, q4 @$ `        if (result == EDMA3_DRV_SOK)4 L* V/ e" G5 i: i) z& l
    {
8 Z; M$ n3 D4 m( R( }0 f+ P                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 S: X( k, M, h, i/ m. Z                                                       (EDMA3_RM_EventQueue)0,
! C: D/ e4 M8 B3 r- S$ c                                                            &edma3_isr, NULL);
+ |$ j. r! ~& w5 |, g8 K* O    }9 C4 S" e! X% ~  H; G
        0 h5 p" Q- V7 y; [) g9 x! Q
        if(result == EDMA3_DRV_SOK)6 c/ ^% o7 o' l
        {
( U# ^. c1 p/ z, e6 R                paramSet.srcBIdx    = 0;! @, f( R% K* U# V9 x7 X0 x9 t
                paramSet.destBIdx   = 1;
: ^7 F8 C! w$ }" O- V2 e8 Y/ k                paramSet.srcCIdx    = 0;4 }* _/ k" w/ L7 Z% P' q& t
                paramSet.destCIdx   = 0;
6 p& A8 @. s1 {3 `' R% Q/ E; d                paramSet.aCnt       = PING_PONG_ACNT;
3 ?, m# e1 |3 k2 N$ P; B                paramSet.bCnt       = PING_PONG_BCNT;' M6 y" ]: a4 W8 C
                paramSet.cCnt       = PING_PONG_CCNT;/ A! _. }& K2 Q, v. z, }
               
9 |6 G- x3 i% [/ Z4 l6 z                /* For AB-synchronized transfers, BCNTRLD is not used. */2 N  `5 ]& o5 o* h" V! [
                paramSet.bCntReload = PING_PONG_BCNT;
- }2 v, S% A9 q
8 X/ K* {% R$ U                /* Src in constant mode Dest in INCR modes */
# ?0 @* m: e+ t6 O2 i0 H                paramSet.opt &= 0xFFFFFFFDu;
0 `1 V7 }, s& l* E! r! u1 h0 b                //paramSet.opt &= 0xFFFFFFFCu;
3 W+ |) _3 ^. p0 y; @1 N. L               
' E- q3 h1 p0 P; J2 R                /* Program the TCC */2 `" k: Q( A5 o; ^" {/ P" d
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);9 @9 T# \) H4 w6 \/ x
- O6 d. I  I: @1 |
                /* Enable Intermediate & Final transfer completion interrupt */
* B' M; }) D) e& e+ c' H1 e- }- W                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! W; R1 N9 J  v' b9 V# \4 P
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);+ q4 Z+ ?, P8 n
1 I# H% \* w* Y& L8 u
                /* AB Sync Transfer Mode */
' B6 a: h$ ~9 C) ]1 \7 m4 O                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);/ Q- G3 j8 Y; Q% t
               
$ ~! a# o5 w, L: `" _4 s) y                /* Program the source and dest addresses for master DMA channel */
" i+ ^# ^6 N! l( q/ X5 u' C                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
3 B) g# T# B- G' d4 J) }( O                paramSet.destAddr   = (uint32_t)(ping_buffer);2 W6 X2 ?0 H: v$ y! s0 |
! k) F+ a; ]: r$ H$ J0 W+ f( q; M$ k
                /* Write to the master DMA channel first. */& `" Z, I4 u9 f- _) g$ X  r  |
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
2 v$ ~" G, S+ g. K2 x) H. `( K, Z    }      
6 X( j- W" B2 ]0 M
' i% S( P  ], v8 m  q        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);$ u. }9 u' F+ i' g# w/ Z- i0 b
        $ a' P( {6 t- Z+ z* c
    if(result == EDMA3_DRV_SOK)
! D% \/ s; {9 I2 N3 u    {7 |8 u0 Y' n: g4 `- n! M
            print2arm("edma3 driver init success.",0);9 t1 n  |) ~) F* P: o: X6 B
    }
+ b9 Y. Q* |1 U$ T$ h; T}& E  s# w2 P/ B* O9 c

* J0 H1 N( e. U8 d+ R9 k5 D6 R5 g  y+ Q  a: o5 \
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# i8 R% Z! @6 Q, B, K6 ]5 z
( y3 D4 |8 L$ B( d# ^4 v1 j' _- p3 ]) J- u% q3 k4 F

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 B) g' t1 @! z# S每次DMA传输完成后都要再次使能传输

  e. u3 O2 o5 g* }5 T. ?7 H" l原来是这样,我明天去试试,谢谢了!




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