嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:! Z; m# y- e6 }' V" O
#define  PING_PONG_ACNT          14 c4 n9 ]: y! C2 v" P4 V
#define  PING_PONG_BCNT          8*32*40
, H6 k0 n7 s$ F, Y//#define  PING_PONG_BCNT       1
* O/ c5 T0 o% F# X) }#define  PING_PONG_CCNT          1; z; B+ ]- p6 f: y0 G# n7 T+ K7 R
#define  MCASP_BASEADDR          0x01D00000
! P  o* X6 n" [3 N6 ~#define  Mcasp_RXEVENTQUE        (0u)% z+ u" H+ }  {6 D: @: N) Y

0 \: Q  u1 s4 N4 y/* OPT Field specific defines */
8 s/ ]. ^( I- A- }5 D#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
. c& F' G! s+ X4 z8 z. V#define OPT_TCC_MASK                        (0x0003F000u)+ q6 f( S' p3 l7 i3 C; {! E" u- k/ ~
#define OPT_TCC_SHIFT                       (0x0000000Cu)- B9 ?8 y, l7 L
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)% m; _6 s! a+ Z: @' ^3 F. O
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
# _" ~1 X, @% `' ?& J! Q& J5 N  D; J& f. U5 K# W
char ping_buffer[PING_PONG_BCNT];- s9 D+ D5 h# ]# i; V. b! g
char pong_buffer[PING_PONG_BCNT];0 Q5 R4 B$ |( D) c2 S$ A* W% S
- J8 B! y/ w" A* {
0 T* `( q* K3 i% D( ^

+ k" l1 {* k: k5 b: D2 d# |( d' k& l; Q
static void ys_edma3_init()
1 x$ \6 L. y# b7 h& R) r) e{8 ~5 ^" Z0 X1 S0 s$ q$ k  o
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) T, u9 B  R& L' |/ K# Z/ z# ]# ]# {        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 I3 L7 y+ D% Q        EDMA3_DRV_Handle hEdma;
3 l3 {' u7 u. k) R7 \0 H8 q2 c9 m) r    uint32_t chId   = 0;4 ]( h3 m( Q- c& c
    uint32_t tcc    = 0;$ N! W/ d+ t5 y8 q
2 b# m) d7 H1 W) }1 z
    print2arm("edma3 driver init...",0);& ?& ^3 r3 t- [; r! k/ n
7 p$ m! {0 o$ Q$ p9 F
        hEdma = edma3init(0,&result);5 U& J5 |6 r  ^9 F. s0 N
        if(hEdma)1 Q+ j* y: n  n, H. b  J0 ?9 p
        {
: m; @+ q9 u9 p) C8 ]; C! D3 O+ E                print2arm("edma3init() Passed.",0);! p5 z* }! v9 W' V3 f$ t
        }- I) v; V2 n4 d8 ^, k
        else
8 T3 b* W* w6 \5 m' J        {2 d& z% U+ W6 M1 g  N2 H
                print2arm("edma3init() Failed.",0);7 `# w) Q5 f9 h0 F0 i5 z
        }+ _/ R9 _# a. i
       
9 Z$ y. {) O/ d' t2 D+ ]3 x+ z/ H8 q! x        if (result == EDMA3_DRV_SOK)
: {7 P2 u- d+ y    {
2 U! l' b: x, l$ U6 T5 [                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,! \6 H' T9 m6 D3 }& _/ K
                                                       (EDMA3_RM_EventQueue)0,1 N2 U% s% s8 d$ C/ B7 ^" c
                                                            &edma3_isr, NULL);
; K: c7 F) x4 r/ [    }6 Z% |$ G( b6 u% |3 m9 u3 Y
          \0 R4 w! g# [3 K5 U  b' I9 x
        if(result == EDMA3_DRV_SOK)5 R+ Q3 z/ }9 m8 E! |
        {
( z) i9 V. z, O  k5 ]3 i) p                paramSet.srcBIdx    = 0;, R2 h/ U+ m; y
                paramSet.destBIdx   = 1;9 D" y, d7 b) Y0 J0 w* ^4 `
                paramSet.srcCIdx    = 0;9 y- y3 |) s) ?5 U5 W0 X
                paramSet.destCIdx   = 0;
$ D2 N" [5 o; d, f/ c                paramSet.aCnt       = PING_PONG_ACNT;
. ]  H0 R* b4 y% s. X                paramSet.bCnt       = PING_PONG_BCNT;" v- |/ v0 S# N& C
                paramSet.cCnt       = PING_PONG_CCNT;
6 z, y1 O5 d% w& y               
( H% }1 N: w+ X) B* \                /* For AB-synchronized transfers, BCNTRLD is not used. */" Q0 ~( H$ f' R, _6 X& Z
                paramSet.bCntReload = PING_PONG_BCNT;
: t- j- I; ^7 X! l; ^  t2 ^/ Q2 ^
! J9 P' ]. p% a% {2 T                /* Src in constant mode Dest in INCR modes */
- X, _, N9 M6 ]* r' s                paramSet.opt &= 0xFFFFFFFDu;( d+ Q% g# R% ^
                //paramSet.opt &= 0xFFFFFFFCu;
" L% [" V, N0 L  I) r. r; L                + [$ R4 ^5 l' G$ _: f
                /* Program the TCC */4 C- p3 H! ]" p! y
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 s7 v! P; T5 s2 y: j/ ^% F& ?. z* c" t0 Z! K% l
                /* Enable Intermediate & Final transfer completion interrupt */( k1 \) X/ l8 P3 D6 a$ V* Q
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 f: Y* ]. B8 Z# t4 c9 A                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 ~1 I' O5 @) G/ A9 N+ d5 u& g& u; o7 v9 i. ]' M7 Z1 p
                /* AB Sync Transfer Mode */8 f5 a3 }3 V7 N2 T7 |9 M7 A$ ~
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ C6 W. X9 x  D& o: {                ! ~( S, C3 ~# G% W
                /* Program the source and dest addresses for master DMA channel */( e1 S' x3 W! t
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);- A* ~4 G- v0 p4 G' M
                paramSet.destAddr   = (uint32_t)(ping_buffer);
0 v# U0 Y2 G5 n" T
+ x6 d2 j$ g, N( L* A                /* Write to the master DMA channel first. */9 J. O# M# U" G$ t9 f) o; l+ F
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, Z# J, A1 m4 h" d: B2 D
    }       3 H3 p4 b( Y( V* P* ?1 O+ Y

# x( p0 I+ I# G6 W' O- p, X        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: ?. Z( e4 v" i" X        8 l9 q+ o4 o' F" l0 t) x
    if(result == EDMA3_DRV_SOK) ! k! J9 r. _$ S+ K6 \) K/ I8 A
    {8 b8 ]+ f' C* k7 a! R( M3 R& |
            print2arm("edma3 driver init success.",0);
* v; y3 h" \9 {6 D, @% l( Q# E; u' S    }
/ P0 I7 V) ^5 `" `}* w9 C, e5 h: h0 |  j; D

1 T7 z1 W9 j5 S5 l) m5 O1 ~) r  |! b( @& @" |! [
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。+ Q# E3 z& }( i* E

$ l2 `2 s) `( ]% K& I9 L9 g7 \. r) r0 C, G* {2 E: l* Q: w1 F

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47$ b  w! g5 X$ F6 u8 q% K
每次DMA传输完成后都要再次使能传输

% ?# K' _7 u4 B5 E( Q3 n& J1 I原来是这样,我明天去试试,谢谢了!




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