嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% ~$ D7 }6 O" c) w- T5 U8 [
#define  PING_PONG_ACNT          1$ t  @, ~" ~3 k( y
#define  PING_PONG_BCNT          8*32*40 ; l* I5 S8 k1 A; B1 \1 j; `
//#define  PING_PONG_BCNT       1
# G' T7 @) x" |, V: \#define  PING_PONG_CCNT          1
# D* Y) @' e; x8 g! _#define  MCASP_BASEADDR          0x01D00000
/ G9 M- }5 s6 H/ s  s#define  Mcasp_RXEVENTQUE        (0u)7 {- ]4 o! g5 P: u3 v& Z6 t

" {& y- L) {: ]/* OPT Field specific defines */$ S! X: A0 t' Z8 Q$ G! z
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)# R- ]' _5 L. L2 X- [9 v# T, G, r
#define OPT_TCC_MASK                        (0x0003F000u)" M3 n0 v2 }% L$ @! L# `8 n( l* g
#define OPT_TCC_SHIFT                       (0x0000000Cu)
$ |  |" v1 e+ S# N# ?#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
0 W; @) D" ^5 F8 s4 N7 y#define OPT_TCINTEN_SHIFT                   (0x00000014u)# A% e7 P% C! d; U# t2 @2 e
7 o: G9 ]' e$ p- q, b$ m3 b
char ping_buffer[PING_PONG_BCNT];9 K8 q2 k  l, x- v2 i' P$ {* ~
char pong_buffer[PING_PONG_BCNT];
- Y; L+ X1 f5 w
) B* X5 U. |# `8 S6 O0 F3 n: ]: Z" A  ]% T
% j* }5 z; d6 Z6 [( N2 m' n

6 {- ?( M( j0 d6 H6 k" ^static void ys_edma3_init()
( ^/ p/ P7 q, Y( K# @8 V* j{4 A& _0 p. j  j" N9 e$ I0 P( c% b
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 m. d8 t) j" E4 T9 j# L+ z( ~
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;( {0 L$ }7 G% Y8 R
        EDMA3_DRV_Handle hEdma;5 M* V, t- `8 R4 W5 K1 e
    uint32_t chId   = 0;
1 }9 @$ Z6 `5 T    uint32_t tcc    = 0;
6 w3 u" L( T) B
& i! s* A: e+ |  ^    print2arm("edma3 driver init...",0);- |! h. f2 n, u, G. u

$ E5 E2 C$ n. k3 i        hEdma = edma3init(0,&result);* G, k2 u3 X' S6 E! B
        if(hEdma)9 K5 x5 j5 q9 s. K0 i  R- ^
        {
" C0 g9 c4 ~+ p4 }) d: q                print2arm("edma3init() Passed.",0);
. E3 f; h& M% \/ ~6 e  b        }" w/ F% o& e( G& T3 |
        else
* `& C& Z9 e# ?  P1 u1 x        {
7 H8 U  Q0 f" s  C6 R( L                print2arm("edma3init() Failed.",0);$ G" {, c7 ^( U" P
        }9 g& F: s6 D. ]0 `; a' [  x
       
5 J* b/ P  q! s4 W0 m7 H: ?! g  o        if (result == EDMA3_DRV_SOK)
. ]/ O+ D7 g4 B- [5 \- N    {6 Q4 u* ^9 e; B& G' e6 t
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. X; K- E* J( S: b! g
                                                       (EDMA3_RM_EventQueue)0,
' a. E% }* y) R! v" f& \6 n% @                                                            &edma3_isr, NULL);
+ L% O" r8 y# H- t    }% o, ]. S& r! l3 R8 N: M. R
        3 R" Q+ \) w1 V7 j( s$ v8 q
        if(result == EDMA3_DRV_SOK)- H' u1 ], R9 C% p- [9 e4 I( _
        {7 A5 z7 }1 q8 }: I0 U6 ?
                paramSet.srcBIdx    = 0;1 p+ Y9 q2 [# g5 l
                paramSet.destBIdx   = 1;
# G& _4 [2 {% R: W! c( |% g                paramSet.srcCIdx    = 0;
6 |7 c. o! j8 X                paramSet.destCIdx   = 0;" q+ i% X: L4 u/ R$ Q( {# ~6 N- f( i
                paramSet.aCnt       = PING_PONG_ACNT;& I/ p; ~0 o* `, j+ z1 n
                paramSet.bCnt       = PING_PONG_BCNT;3 t$ I+ K' ]8 t* R$ l2 F% f
                paramSet.cCnt       = PING_PONG_CCNT;/ l3 Z+ I$ X. o! N
                . c: a* b7 E! [9 A0 j# `: J
                /* For AB-synchronized transfers, BCNTRLD is not used. */
' w( w$ L4 `" j4 k! `7 ~$ ~                paramSet.bCntReload = PING_PONG_BCNT;
& c- B" t. T# H; g  Z: X4 `  D3 d8 x
                /* Src in constant mode Dest in INCR modes */
9 H6 C( A1 r+ z1 q  m! P                paramSet.opt &= 0xFFFFFFFDu;4 c9 B: |6 |% d
                //paramSet.opt &= 0xFFFFFFFCu;5 ?) Q- s# @8 X
               
" _9 O8 c; c; U9 y& A% r                /* Program the TCC */
5 M! h5 D' n( K/ H3 \% C0 j                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);8 V' W! B  u1 a6 N8 N

0 {/ z& l. ]8 e                /* Enable Intermediate & Final transfer completion interrupt */. `9 ?* v& ]& Q$ A( z6 V6 w0 R
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);* [7 {* @( l: S1 ^
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);/ R' o5 B' N" w/ t) Y6 {& G" z
. x& `' x; e+ b$ `
                /* AB Sync Transfer Mode */
9 T) A/ R2 c  R% H; I% `! I                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 U/ l1 R5 b/ m# I3 }" e
               
8 A1 u  p% o3 ]8 `1 }; _- J6 O                /* Program the source and dest addresses for master DMA channel */
6 r0 ^; I8 |/ \- i                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
; o5 U5 C, B3 i4 y                paramSet.destAddr   = (uint32_t)(ping_buffer);
( G8 P7 M5 [$ Z- h: w3 l7 y6 U, R  u
                /* Write to the master DMA channel first. */' m6 A6 k0 i2 L( E8 v  W
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);. B2 j- \( z/ h1 N) k
    }         M) S! y/ I# l5 n: e
, Q! Z( @8 I" f: H  D$ o) l, l
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);) I8 _) W4 Q: a( x% A
        2 k9 J1 _. W: b0 m/ S5 x. X+ `, m
    if(result == EDMA3_DRV_SOK) & l9 Q8 S9 r$ Y+ Y
    {
2 p1 R+ H; @  e7 T6 u  s0 v            print2arm("edma3 driver init success.",0);
' w8 J3 D& y4 y: U1 C9 Z% U    }
, L  o: C5 h" K) E}! C; F$ D# K* \( @0 u5 v+ n' \; d

9 G7 f( w) [- U, m  `$ N
" `, R8 p9 \/ v/ r1 }6 d/ kEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。( C$ @. {* T7 K2 m4 X8 t0 i7 s" U
5 N- h6 t; R4 }6 x1 O- b
  j6 e1 T# t# O7 h) R9 c: |

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) v, j) Z! Q5 K, [. X, e' A$ l! X每次DMA传输完成后都要再次使能传输
5 W% |) r6 E, C2 w" I. G
原来是这样,我明天去试试,谢谢了!




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