嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% E; J' g# z: b/ {4 J7 G#define  PING_PONG_ACNT          1: [/ u( X6 s/ m5 x  q& h
#define  PING_PONG_BCNT          8*32*40
; a; C6 C$ v: `3 i  F//#define  PING_PONG_BCNT       1 0 c3 Q% L0 Y7 ~" g/ }: r
#define  PING_PONG_CCNT          1
& M+ p, u# w, t#define  MCASP_BASEADDR          0x01D00000! X. b2 @9 c4 P  U! K
#define  Mcasp_RXEVENTQUE        (0u)4 Q1 y& C6 J- ?

; z$ H" V1 w7 r# F3 I/* OPT Field specific defines */
8 p+ k: E/ P  V/ j#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
7 c* |' z# {- p5 b: [#define OPT_TCC_MASK                        (0x0003F000u)5 W. s* B' V; s" {2 H0 e% p' y
#define OPT_TCC_SHIFT                       (0x0000000Cu)* C, _5 Z. {. ~% m
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# ^! b, e. j2 G) d#define OPT_TCINTEN_SHIFT                   (0x00000014u)& N3 s; B5 n8 A: ?$ ]2 o5 Z- j$ x
# U- [/ d9 z0 c6 S9 d
char ping_buffer[PING_PONG_BCNT];7 X' }1 |9 T  _( O% K) G
char pong_buffer[PING_PONG_BCNT];
7 D- H6 W) b$ U+ M) ?9 b4 ]! e% R2 I. r. ~& N/ f# ?
: z- r/ k* ~% U0 l9 e) k
1 \; w6 |% @. K4 v6 r9 o& }! p  z

* u# i8 F/ }7 \9 _) R# |static void ys_edma3_init()
3 S6 y$ w+ k# ^* K{$ l* H+ }% b2 `1 N
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};* }; v; ~# j) J
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;4 A- [* z  }+ m: u) H* S
        EDMA3_DRV_Handle hEdma;
$ h) b" {* e# U1 l. w2 A# G& _    uint32_t chId   = 0;8 G* ~! `, W# m& C
    uint32_t tcc    = 0;
4 }% W4 f  |2 {8 S( h$ [
' d+ D% Y& Q& ?    print2arm("edma3 driver init...",0);$ X, M8 M7 G9 [' w. _9 J. X6 G
/ Z$ A' t% ?; {1 v- V7 ]
        hEdma = edma3init(0,&result);, P/ {) ^: M' k' r1 c* M+ E, A
        if(hEdma)6 ^' x* l) O3 E* q$ u% J2 H
        {% \$ Z( G* W5 T* ~
                print2arm("edma3init() Passed.",0);$ b; I4 A) g( }  k1 w. X
        }
- q+ z* {( N9 N1 Q: h9 b        else! O7 t: ?  H$ u: g
        {
) P3 P; t5 ~8 @% T' `4 N                print2arm("edma3init() Failed.",0);5 u, |4 \; V7 H
        }
; u( w& j6 s  K; o       
- O) u( y9 }, {& C        if (result == EDMA3_DRV_SOK)8 g3 w' p1 w8 ~, P- M( g+ u: T
    {, v- p# f) R  [3 p. ^' F
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ A  j" a2 r. G                                                       (EDMA3_RM_EventQueue)0,  ~! i. ~) N5 q' h+ T
                                                            &edma3_isr, NULL);
3 e5 O0 T1 I" A- P& x3 |9 d; Q    }5 f, [& F* U; k" n! l% P
        . ?# z' e1 g( ^9 u# t; p
        if(result == EDMA3_DRV_SOK)
7 t& I5 `8 w4 V/ ?8 s        {
5 w" A5 i- C' x- T                paramSet.srcBIdx    = 0;, M2 q3 ?+ M8 k8 T: `0 L
                paramSet.destBIdx   = 1;
4 Z! U. q, r4 ?: w' B4 r                paramSet.srcCIdx    = 0;
8 Q( ~; x6 ?* t4 U                paramSet.destCIdx   = 0;: S6 M1 C, u$ z; q/ ^
                paramSet.aCnt       = PING_PONG_ACNT;
4 d1 |  H8 k1 D# i6 W                paramSet.bCnt       = PING_PONG_BCNT;( `, w/ z6 J9 ?. C4 g
                paramSet.cCnt       = PING_PONG_CCNT;
2 K* Q5 H2 u) n0 z! C2 L8 f  L                * z: T4 B2 }! d
                /* For AB-synchronized transfers, BCNTRLD is not used. */* i4 @+ f* C; ?" J4 {1 S
                paramSet.bCntReload = PING_PONG_BCNT;
2 o# _8 n' h, d0 Y- `
, v/ o9 L) z0 m8 J4 v" I/ q$ f                /* Src in constant mode Dest in INCR modes */
/ n" @. y$ w& l  c0 T- _3 X                paramSet.opt &= 0xFFFFFFFDu;; n! B$ H- _. G- v7 E7 h
                //paramSet.opt &= 0xFFFFFFFCu;3 Q! v0 }. X; r1 ]
               
2 U1 i, O7 q- Q* N- V) {6 Z                /* Program the TCC */% C! k$ I# D& D! Q) a% O& P
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( A1 m( Y1 Z/ n! I) h2 T1 q# j  z% e, n' n# K% s
                /* Enable Intermediate & Final transfer completion interrupt */
# }" Y$ I6 k; }* ?9 ^8 Y; R+ w- v                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ [% ^( t/ e/ p; W0 ~4 O7 _/ c                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 t6 X+ @( v; Q5 ^3 \

+ ?: ?* L) z  r" I" c2 o! V0 V                /* AB Sync Transfer Mode */) E. _4 O. [7 [6 T% r# x
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);, j* z- w' P9 Q6 z: {
               
4 D' g* f: R" V5 r6 z) d. _& w                /* Program the source and dest addresses for master DMA channel */
2 s6 I8 ?* Z/ N4 l  ~                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
2 V: G2 s4 i. }                paramSet.destAddr   = (uint32_t)(ping_buffer);. D& [' W3 s3 b0 j( i

8 X+ r: I, {1 O1 J/ f0 s) Z& g                /* Write to the master DMA channel first. */
1 r/ g* n+ o+ W9 Q" Z! n4 k$ r                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);- N( l' d' I2 n: ^: _6 X
    }      
  d1 D- O$ ~  v5 r8 ]. g- Z# W% E$ G9 a6 i6 |
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);7 _+ b1 E( x1 {+ T
       
# _1 z1 r; H# G    if(result == EDMA3_DRV_SOK)
4 ~+ i) ~2 Z+ ^1 H    {
( m1 c2 ~: l- e6 X5 F, ~            print2arm("edma3 driver init success.",0);
2 N6 r: b  [  e1 }- G/ ~    } 4 e7 t: z  m0 O; Z
}/ E* E0 \- o, Y; k* }! h
: `' l- i$ N' d6 g
$ z8 _1 a% ]; P" X0 ]
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' C: d8 N3 t6 ~- n# ~" B- X' E5 p

: ^$ A1 V/ J8 I) Q; [
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 n8 Q9 _# G; ^, D$ d  I每次DMA传输完成后都要再次使能传输
" {% i3 U% |9 l$ t9 n* m" Q2 ~
原来是这样,我明天去试试,谢谢了!




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