嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& Q8 @" w1 t: ]2 y' q  g#define  PING_PONG_ACNT          1
$ X9 M$ H3 W* U+ P/ v8 ]$ _# n#define  PING_PONG_BCNT          8*32*40
% P( V9 m. V, P* L//#define  PING_PONG_BCNT       1 - `  v. \! K8 [$ z3 |( n
#define  PING_PONG_CCNT          1
5 h' M/ e9 R5 D  G! w3 @6 W#define  MCASP_BASEADDR          0x01D000000 m! g; o+ ^/ _1 L+ E
#define  Mcasp_RXEVENTQUE        (0u)
3 O+ z9 [( Y* L5 I6 {6 _
; \0 _; y' t& a+ e/ D0 q/* OPT Field specific defines */
! j( C1 E5 c3 `0 x4 q0 z#define OPT_SYNCDIM_SHIFT                   (0x00000002u), Y9 j+ u' q+ I
#define OPT_TCC_MASK                        (0x0003F000u)6 L( S9 h" a" E( `1 X3 ?& X$ Q  L
#define OPT_TCC_SHIFT                       (0x0000000Cu)0 ?1 R' s$ N/ R& [- f: K( x/ V
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
+ d6 C4 {. M/ c" i  m6 F3 N#define OPT_TCINTEN_SHIFT                   (0x00000014u)1 p/ J4 A: i* {- p- t9 {6 o7 @  z
9 E' y7 G9 t! Z8 C5 X% C: ]
char ping_buffer[PING_PONG_BCNT];: n: T3 A9 e* C' X" q/ P
char pong_buffer[PING_PONG_BCNT];7 F& @4 U, @2 k& N% o( \% g& j7 S: d

- o+ n/ c+ K; j2 i$ Q8 ]; {7 B
& s) [0 ~! W8 c; \$ ~- M& L6 @% Z5 g; d6 l
$ Q! y( Y+ T, }/ R$ Q
static void ys_edma3_init()
5 }) Q/ A. X$ `  T* q! v+ J{
, s( a. u4 `/ `: Q1 j# P8 g3 J        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' K% b- P/ u* B% c0 I$ l$ s8 }  {9 }
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;: a' `# t0 ]% Y0 `0 h4 U
        EDMA3_DRV_Handle hEdma;( d# _- j% \# ]  o0 e* H
    uint32_t chId   = 0;' k+ f& ]  T2 h: N5 Q7 Y9 l
    uint32_t tcc    = 0;
8 g5 V3 g5 E1 t$ r' t5 R# p5 t% k" o; t  E5 Y) b3 A
    print2arm("edma3 driver init...",0);
1 [2 L' G) O1 L6 r
0 Z. M2 x" s& g7 H# T4 ]7 ~        hEdma = edma3init(0,&result);# F: {: u1 n+ o2 X  }
        if(hEdma)
2 Z+ \. b2 s  ~9 I        {
: A0 G" F( O5 U$ S, Q) B& {                print2arm("edma3init() Passed.",0);) N. L+ M2 z  w: t
        }3 O4 M3 ?: ?7 S3 B
        else* S. r/ c  x' h0 H! z6 U% i1 D
        {4 D" |# `. k; L0 Y. X/ a  @0 H# j7 v
                print2arm("edma3init() Failed.",0);5 _3 |5 v  p* W
        }
6 @1 _) G. E9 U/ p/ m        4 ?1 D2 _. Y$ S- L1 s
        if (result == EDMA3_DRV_SOK)
2 p3 C" L6 g% M7 a2 N- B  [( u    {
8 E  h  e! g6 _) N                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," @3 U8 F7 j/ h; C6 e
                                                       (EDMA3_RM_EventQueue)0,
+ w* d! G* |; v  a                                                            &edma3_isr, NULL);4 w3 q) Z: g5 e7 e) t% Q0 U
    }( {. S. J8 M4 W, y# |; C
       
1 v4 U8 S3 c3 r        if(result == EDMA3_DRV_SOK)
& I# z3 ^8 D# N) f: S        {3 D! T, w' F# P
                paramSet.srcBIdx    = 0;# I* e, Q" {: E* R
                paramSet.destBIdx   = 1;8 E( m- w& z' ~8 d7 T% Y" x
                paramSet.srcCIdx    = 0;
% v. F; }2 g" i+ K- D                paramSet.destCIdx   = 0;
, r: K7 S. |' ]; ^0 H' D7 x                paramSet.aCnt       = PING_PONG_ACNT;
5 [; Y- r- g3 a* _$ g- \# F. v                paramSet.bCnt       = PING_PONG_BCNT;9 M! s1 U5 x: Q2 e5 t$ o
                paramSet.cCnt       = PING_PONG_CCNT;
- r$ {0 a3 q) g6 j0 |. `               
1 U6 o+ E" d. Q/ f/ J                /* For AB-synchronized transfers, BCNTRLD is not used. */6 `6 |8 B' A8 ?
                paramSet.bCntReload = PING_PONG_BCNT;
0 |' e" ]8 h7 S8 k. R/ y
( }) T0 L$ [1 d                /* Src in constant mode Dest in INCR modes */
, K0 V7 h& F: m: P                paramSet.opt &= 0xFFFFFFFDu;
7 S) V  G/ V( v. H( N0 _8 L' r                //paramSet.opt &= 0xFFFFFFFCu;
# c. s5 ]3 J! W& r; T- u                . v7 r  S! P, B! D% B5 K
                /* Program the TCC */
% w6 j) {2 h& f. {/ `                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# r% l2 h; F% n0 ^8 H7 u9 e( ~- S- ]5 `5 a2 {3 e; _6 V
                /* Enable Intermediate & Final transfer completion interrupt */$ Q- ^' X" I: j, Q; N: a
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* s# i( C* o4 C. z- u                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
. u+ n' `2 T& a
+ d  q8 [* f2 e! J3 Q0 @                /* AB Sync Transfer Mode *// d$ z0 @) O& f4 U! ~; |
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- L& e' X5 n% b5 t0 b               
6 a, N, }# x- n: G8 i7 ~                /* Program the source and dest addresses for master DMA channel */
! U' M5 G( B# t                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
  f# N7 w+ h* R& Y  o                paramSet.destAddr   = (uint32_t)(ping_buffer);0 o' z( x0 f/ o# @8 Z8 f, n3 z% V

. v! t- ]$ Z* ^" }                /* Write to the master DMA channel first. */! l, x4 d* L8 o- }0 H
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);! q+ A4 \+ A, G  J$ `6 w
    }       6 f$ X% v* S- |" q* g
% j+ V; i- }- q  P8 Z0 a$ B
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 A8 r. n7 L4 w- B
        , [+ e1 X- c8 D6 Y8 |( X- m+ J+ M
    if(result == EDMA3_DRV_SOK) ) g; }' u) }% e2 m  C" `
    {
; U9 i+ N+ V3 A6 R  J  k) r            print2arm("edma3 driver init success.",0);( O) Z0 D2 j7 \% x$ i: |  D, n
    }
! ~: y. q5 G) W$ X2 v' u+ M}
: h# J/ ^. C+ Y% c! ^5 {) B
, b, Q4 u! s  v% z! M3 i7 `, U( O' {3 u! ^' R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。% Z( s3 p* Q0 X6 c
5 Y  [, {. D% e4 g9 c! N

4 t" y9 s3 u5 E% f0 ?
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47, g% S( P, u8 v
每次DMA传输完成后都要再次使能传输
8 R$ I* ~  e0 t. r
原来是这样,我明天去试试,谢谢了!




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