嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- J3 U6 \2 e5 A4 E$ U7 m: B#define  PING_PONG_ACNT          1( I0 T: U6 X0 a" {& L
#define  PING_PONG_BCNT          8*32*40
- v  M7 S7 S/ r7 t. m# c5 N" \//#define  PING_PONG_BCNT       1
/ F. N0 r% R, I/ t5 K% w+ Q% N, ]- m#define  PING_PONG_CCNT          19 ]  r, d+ c) u) |
#define  MCASP_BASEADDR          0x01D00000' K  i4 g  Y% O4 k! _/ G+ e
#define  Mcasp_RXEVENTQUE        (0u), |3 |. h7 V( T# F" v* u. V/ G& ~

/ n; C! W  [# J0 S' \/* OPT Field specific defines */# s; V7 R% `( |5 N: i" g
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( I+ [/ ~. M0 D" l$ k- l#define OPT_TCC_MASK                        (0x0003F000u)
9 i  c% ~& j+ _/ B* \6 {#define OPT_TCC_SHIFT                       (0x0000000Cu)
3 D$ q0 {# \( ~8 k, z' r$ R#define OPT_ITCINTEN_SHIFT                  (0x00000015u)' w% u, X0 S8 k9 }0 [4 g
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
" `! N3 R  |' W+ }" h
2 U* [6 u) ]" Q2 e9 m( k( H! achar ping_buffer[PING_PONG_BCNT];& z7 n1 B# [5 o( K3 k- \1 b: o' f! x
char pong_buffer[PING_PONG_BCNT];
# q) B* W' z" |$ D+ U: H* h+ y/ K

7 q( T5 |/ Q  d3 o/ ~3 H8 P
* M! y( e8 N# [5 k
' _2 N7 G4 N8 `- o, @static void ys_edma3_init()$ Q) k  d4 \' w# W7 t  e
{
1 n3 h, ?! ^1 t' C        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& Y; t' w% z6 H# J$ u( D" N3 r        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( U, C2 _) s6 \        EDMA3_DRV_Handle hEdma;7 J6 ^. b5 x! O4 h. }
    uint32_t chId   = 0;0 J) e: r/ B, {! E: F
    uint32_t tcc    = 0;
8 m# Q) B5 A+ ]' R( z, P# Q3 R, F$ g3 N% V' c: e8 ^
    print2arm("edma3 driver init...",0);
& J( G  I: G0 k. D+ N2 T. D2 j8 x
9 r2 v6 ?; J. L  b        hEdma = edma3init(0,&result);. l; o( Q$ l; _; p9 k( i; G: b. x
        if(hEdma)
# Y- X! H4 y. I8 @: y4 V3 m* H7 G& b        {4 E& \  `, ?. y
                print2arm("edma3init() Passed.",0);
0 d! r  T" [% ~7 i! X        }
( F. ]& G) ]! o" a: `( e) E        else3 l, i0 B6 Z! ~+ X- g1 H  H3 z2 L
        {
3 q3 _) N' V( [) x6 S                print2arm("edma3init() Failed.",0);
% a! {$ Y& o) f. m        }
% b4 m" I' u, s+ d6 a9 x! s% p% v       
) z8 a/ d! A0 q+ V2 k        if (result == EDMA3_DRV_SOK)
7 R; B& Y+ `7 ~+ E7 |2 S    {
1 d) p# x; I# x! G- A. c' O                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; V, X- ~! Y3 M# n                                                       (EDMA3_RM_EventQueue)0,! }7 ?2 }# }- _, U# E
                                                            &edma3_isr, NULL);# d6 `/ j9 Y" a9 \. y3 v+ p
    }) h: i. H0 f5 v1 w6 s, |7 ^
       
" w# `+ v0 H9 G        if(result == EDMA3_DRV_SOK)
. T3 Z7 s! T/ y0 Y  a8 E        {6 ~# t" C# F7 \3 h6 b
                paramSet.srcBIdx    = 0;
  v. o; ~# g2 {6 l                paramSet.destBIdx   = 1;
( i( e0 m% Z- ]9 ]# C7 I. w2 q' P1 ^+ z                paramSet.srcCIdx    = 0;
% t, [& e4 I" g7 U* i+ h! w7 n/ F                paramSet.destCIdx   = 0;( ?( i4 |1 i! p! r, G
                paramSet.aCnt       = PING_PONG_ACNT;* N" P3 w& ]0 {& R$ J8 V- r
                paramSet.bCnt       = PING_PONG_BCNT;
9 w4 j- X: L# V( d, K9 k) M                paramSet.cCnt       = PING_PONG_CCNT;
$ y; t  F! E5 m. L               
" u& W6 j* r. z5 w                /* For AB-synchronized transfers, BCNTRLD is not used. */) L. v/ F/ }1 y) Y) d
                paramSet.bCntReload = PING_PONG_BCNT;; G) W) c2 V# O; B8 h# U
* b* I1 ]2 u- p- f
                /* Src in constant mode Dest in INCR modes */- B+ P' a+ G6 {5 J
                paramSet.opt &= 0xFFFFFFFDu;
! G, P- U& l% x) d" X! v                //paramSet.opt &= 0xFFFFFFFCu;
+ D2 y. ?5 |/ V$ k               
6 N$ H% H. D% R5 r% ~) l& ^* z# v                /* Program the TCC */
) t% p4 S9 R: t1 t# _4 t: U                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 [6 ^# l3 r1 G% p- W3 a
; a: s; a$ J5 {; b                /* Enable Intermediate & Final transfer completion interrupt */
& D/ s0 |2 E3 O  w! L" Q                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ V2 E1 ~1 M6 G3 \+ X                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& A* \' j5 S1 @) S. A6 i$ y

4 C8 m+ g6 D& P6 F                /* AB Sync Transfer Mode *// k- }4 ^+ a4 d6 D* C
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);0 b: U3 R- u$ |, k$ A/ x* t6 r) p- l
                - t0 A5 Z4 W% C5 Y( L; v4 B
                /* Program the source and dest addresses for master DMA channel */
4 H6 \7 y1 @, \2 m0 N0 ^2 A  @                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
! Q5 J5 U! l/ A' N7 `' Z                paramSet.destAddr   = (uint32_t)(ping_buffer);
, i* [" \* E$ r' s! R  s# f' m( l4 E9 _$ p3 P! j, @! {# [, c
                /* Write to the master DMA channel first. */" R  D  S/ W- E3 {( {$ ~; t# M: n
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
; U1 y+ T8 H2 h. L    }      
" A. F6 J6 l+ }. k# }
. N; Y" F# E% `% y) c1 V" u, y        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. g0 P% Q( g# R
       
& j5 C( W/ Q# C7 g/ @3 r: m    if(result == EDMA3_DRV_SOK) $ g0 L- S# C$ t+ W, @
    {$ g& P* y; H5 o/ Y9 u
            print2arm("edma3 driver init success.",0);( {, T6 H# x" h
    } 9 D2 G+ _5 D, ]0 U# d/ s
}) @& n; X7 v" s, u6 c4 h8 d! u3 p1 _9 N

2 k; i& j# ?  w9 e' `4 p5 @+ a5 ^. W) j, d3 `0 l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。- A: J8 K0 c2 ]0 [2 }  d6 u6 l" ~% _

7 |: R3 j) c# C
; w3 F; a; f' M! G
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47- j. l8 S9 l2 ], Q
每次DMA传输完成后都要再次使能传输

1 {" s  T' `& T6 U8 w% g原来是这样,我明天去试试,谢谢了!




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