嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:. l+ o+ q( C# `8 `
#define  PING_PONG_ACNT          1! j1 ~! [1 ?  U/ b8 Q
#define  PING_PONG_BCNT          8*32*40 , G3 z" U- n# Z( e. ^( Z
//#define  PING_PONG_BCNT       1 ' h  |% \- ]4 D& d5 v0 B3 c
#define  PING_PONG_CCNT          1
8 \% E# f! E5 p#define  MCASP_BASEADDR          0x01D00000' p) u& n6 v+ I+ o
#define  Mcasp_RXEVENTQUE        (0u)
* H: W( N/ f" W! w& d: Z$ i" u
3 Q5 y# L1 Z# G1 Q& K8 B/* OPT Field specific defines */
9 C+ E( E1 a' o! Y- n8 q+ H#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
0 Y' C7 I- `  u1 f8 s, d& m( k, J#define OPT_TCC_MASK                        (0x0003F000u)
* i6 c' {% v, \' x( M: {#define OPT_TCC_SHIFT                       (0x0000000Cu), f. F+ B8 ]: a- L
#define OPT_ITCINTEN_SHIFT                  (0x00000015u): W. W: }* P! `) x( ~, z3 I
#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ U; D  G+ T, d

# h1 v- \; H3 ]1 A7 _6 |8 nchar ping_buffer[PING_PONG_BCNT];! I3 a* p) Q% ]0 ^& a2 w$ r3 p
char pong_buffer[PING_PONG_BCNT];8 w4 W% x$ `) J$ B; ]( k

) z- O0 [/ u5 D! _5 y3 z- m
; t7 O5 c/ \1 C5 C. T# u
# Z, L# r1 E3 W3 T1 R- I: `0 \& A2 Z
: k' o$ ~0 B$ M* [% g" ~static void ys_edma3_init()
8 r* n0 @9 @0 j: b{
; x8 Y3 u6 H; j, y1 O        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 u$ g: }3 d) E5 ^- T' {        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ I3 l/ [% t5 M( S5 P2 |
        EDMA3_DRV_Handle hEdma;
+ S/ y5 y4 v/ _1 ^    uint32_t chId   = 0;8 F2 X  B9 {0 |0 H: R+ [& }$ W8 c
    uint32_t tcc    = 0;
8 U0 D9 u+ J' v# [% W5 x% c* C2 q; v2 t- h/ j6 F2 ~& {
    print2arm("edma3 driver init...",0);1 D: }9 U# B: M% U1 l' d

- U4 m4 w, Y9 Z; ?# p        hEdma = edma3init(0,&result);, Q. Y7 u1 f# }! H" K
        if(hEdma)% c% j+ I. o2 x0 `' n
        {
3 O  k  u1 c& `% c5 W0 h6 Y                print2arm("edma3init() Passed.",0);3 h& {9 k1 U+ t7 C+ A$ M/ G) ?. n8 K2 W
        }4 d+ E- p4 R& `$ e  P5 V
        else
( I3 u; B+ x2 ?        {
8 n9 k8 K0 a5 i( G. z5 p- A                print2arm("edma3init() Failed.",0);1 |# O4 m& W; S0 W# l- ?
        }: W0 O- C5 c: |) x& ]/ a8 S
       
2 a. m3 Q; O" Y5 q: e* s        if (result == EDMA3_DRV_SOK)0 n3 D0 ~# N& D  s+ x3 l
    {
- U  W9 r! A/ p* U8 N                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ R; l  p' k9 h# {+ e                                                       (EDMA3_RM_EventQueue)0,
4 _  ~0 T' q7 R8 T2 e! |                                                            &edma3_isr, NULL);* K3 t* A/ R, n% M' \0 c3 o& N
    }9 \9 t1 z- r* A
       
" F; B0 `7 W) W8 o        if(result == EDMA3_DRV_SOK)8 e6 x& a& L, L+ p" g1 F1 a# z
        {' g$ n: F. R6 C
                paramSet.srcBIdx    = 0;3 Z; p) _+ F) d% s1 R; j
                paramSet.destBIdx   = 1;' E7 |" F/ k' ?% n: ]* c3 c; ~- d* x
                paramSet.srcCIdx    = 0;- j7 _8 f8 n, o! R- G- {, f; \1 k
                paramSet.destCIdx   = 0;2 _7 e1 H9 N/ h1 j1 d
                paramSet.aCnt       = PING_PONG_ACNT;
. |5 e# L8 ~5 }& T( q2 d; R  H                paramSet.bCnt       = PING_PONG_BCNT;
# q$ ?: W5 r4 u4 X+ S                paramSet.cCnt       = PING_PONG_CCNT;5 ]5 P6 Q, R4 M7 }0 t2 T2 q
               
$ d; n, L! s5 ]  U8 P0 S                /* For AB-synchronized transfers, BCNTRLD is not used. */4 m5 u  K& N" |# ^, M1 R6 Z
                paramSet.bCntReload = PING_PONG_BCNT;' {- F! {5 r) M  q0 I
  }) A5 S7 o# g  K* d
                /* Src in constant mode Dest in INCR modes */
' v) P+ [1 D% T) t6 K& L+ g) v- A8 t% O                paramSet.opt &= 0xFFFFFFFDu;8 Y4 R3 t& P2 a4 J! k
                //paramSet.opt &= 0xFFFFFFFCu;8 {( t4 d( S" r
               
- Q, f$ a, S$ [- R, c                /* Program the TCC */( X' v+ ]' j; O+ ]* o& d
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 ]0 f1 J6 u7 U
" q$ b( _3 u% `* D& l$ A  |* U                /* Enable Intermediate & Final transfer completion interrupt */
3 N) ~4 G% j$ l0 C0 |# r                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 }" Y% p" |! }6 I$ R0 K
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ j! R9 A6 \. `

$ N$ m' f" F4 q& u                /* AB Sync Transfer Mode */
. M. G! v' R$ c' s                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& T+ |7 t. W- x& L                ' c- P; U4 [4 A( g) z- r7 O
                /* Program the source and dest addresses for master DMA channel */
0 v) K! ~7 E" P9 Z- b% m                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
0 j8 l9 b6 f# p- C                paramSet.destAddr   = (uint32_t)(ping_buffer);
: s0 ]) c! A/ S/ `5 ^, m$ K
* r3 \- F. N# z7 P; C( H3 [                /* Write to the master DMA channel first. */& s. r$ ^3 X3 o! [+ U  }+ n1 o
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
$ I* O; h9 {9 M3 ~$ q    }       9 e' a3 X. T# q

! ~) g; G+ u! n& s1 W; o        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);6 l! R8 ^0 ?% u! u, `0 I
       
' X! s+ A# R+ |/ ^7 W9 Z' t# O    if(result == EDMA3_DRV_SOK) + B% C. S! R9 p% n3 G# g4 x
    {+ \0 m! `$ v: Q( g' h+ l/ \
            print2arm("edma3 driver init success.",0);
0 C) L' i% W, V. o    } : Z! A; O( k3 g! v
}" U- d* k4 ?' S$ X
& X; I! F! g4 s
. y7 p3 t/ B+ h; \) @7 \& j
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 y( V# U& [5 _
7 N- }% N2 L8 B, _6 ^* t: u$ ?+ `5 }

; I4 [. T6 R- ^
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47' n7 F( ~2 F. Z4 m0 E3 j
每次DMA传输完成后都要再次使能传输
) i8 {( |6 l# x
原来是这样,我明天去试试,谢谢了!




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