嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; B4 k7 R- d. q! T3 G9 l#define  PING_PONG_ACNT          1
7 {9 B7 k5 }2 {1 ?4 C4 |2 _#define  PING_PONG_BCNT          8*32*40 - E! j* f4 |& x; p' z6 m4 H
//#define  PING_PONG_BCNT       1
% T( |( f( x# F* K#define  PING_PONG_CCNT          12 z. E# H% u1 S4 _
#define  MCASP_BASEADDR          0x01D000009 |! `' j) k1 B, G5 Z2 ]
#define  Mcasp_RXEVENTQUE        (0u)
* r" @- m5 U" z. z# B3 \
+ R2 r& w9 p- w3 C0 x1 F/* OPT Field specific defines */
5 ^; @/ p; r% s6 T#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
8 U5 A1 a+ ]) k/ _/ l& I#define OPT_TCC_MASK                        (0x0003F000u)
- c9 |4 F; [& {' I! Z#define OPT_TCC_SHIFT                       (0x0000000Cu)
4 D4 i: i, C' M1 ]#define OPT_ITCINTEN_SHIFT                  (0x00000015u)+ Z6 d& ~1 H2 U& c7 T$ b
#define OPT_TCINTEN_SHIFT                   (0x00000014u)% [  B) D3 G& X( V- W
& U! I5 J: X; {4 _) b9 C. ]6 l' I
char ping_buffer[PING_PONG_BCNT];1 I8 h2 x) |1 f- L
char pong_buffer[PING_PONG_BCNT];
2 k' W/ R% z  }0 w0 L- H+ J9 C: l4 I. P: S5 ]2 c
* A3 l0 E$ {' M; ]

+ y& _2 g* |9 R0 l: p) \; c: a+ [1 q7 l
static void ys_edma3_init()
& [) ?; \3 W) c$ j0 c8 I{
0 E6 V5 }! Y) D' N7 D- O: ~        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 k  L% M# P, P- V. A5 [        EDMA3_DRV_Result result = EDMA3_DRV_SOK;  L9 d& ~- Q3 A5 o. j, h
        EDMA3_DRV_Handle hEdma;  o( a3 R& C6 P
    uint32_t chId   = 0;2 \5 S0 X* f- b
    uint32_t tcc    = 0;
8 R$ K/ l/ p1 B2 Z( f* T# o0 ]5 B5 U0 w$ [
    print2arm("edma3 driver init...",0);
" r" |4 `3 e. |9 r, i- p  H
% K+ k  Y" l2 H, ~0 D8 I- h- ]" m1 D        hEdma = edma3init(0,&result);& T$ c! _) M2 X6 K- e; Q
        if(hEdma): p* h! k; m* y- M; v; \4 _; s3 X
        {( F4 u5 L. l; G
                print2arm("edma3init() Passed.",0);
+ \- K! a7 e  C3 v4 \& P        }
; u0 |6 b! R' n& F3 N& R. [. Z. F: n0 u        else
& r4 ?$ N( Z9 q+ a/ U0 g  |        {4 x$ J) S6 {2 ]3 U( x* r
                print2arm("edma3init() Failed.",0);  d, s9 u6 G& N* i& l1 G7 d
        }
7 V) ^: ?6 P+ D        9 @* C& L$ g( f# D
        if (result == EDMA3_DRV_SOK)0 `1 T' N) u2 v; K& A- }
    {
& G3 J9 Q0 a9 e" Q                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ N* L; z  x, H" b; w! y                                                       (EDMA3_RM_EventQueue)0,
2 y# k. m& |6 w( ^                                                            &edma3_isr, NULL);
  t* b$ B' h8 f    }" |3 h$ |8 }. T
       
: ?' ]' i% v. E/ w        if(result == EDMA3_DRV_SOK)
3 P5 G: h2 Z- u  ^: b( L& U; h        {5 O, ^- G4 \8 p: J9 a7 O. H* W
                paramSet.srcBIdx    = 0;9 D1 `8 N. B+ F1 ^2 c9 L: C) _# P, I) }
                paramSet.destBIdx   = 1;
; j- G% x* |; T# Q" v" M7 z                paramSet.srcCIdx    = 0;
4 j& f: p1 R+ C' I                paramSet.destCIdx   = 0;
1 [4 B: C- p. J1 C$ A9 R& ^                paramSet.aCnt       = PING_PONG_ACNT;
" W/ V# E2 O( k. L                paramSet.bCnt       = PING_PONG_BCNT;
* T# W( G/ E' W- N( ^/ g                paramSet.cCnt       = PING_PONG_CCNT;
5 [" N* T& x6 h8 L% S+ Q               
- D0 `; p5 @* h1 [5 @: L                /* For AB-synchronized transfers, BCNTRLD is not used. */. `9 @  B! {# x. b4 [" c& Z/ _
                paramSet.bCntReload = PING_PONG_BCNT;
/ q% f* {6 z8 }
8 W2 F7 O; n+ [( i) p% w                /* Src in constant mode Dest in INCR modes *// T, C( K7 [; w
                paramSet.opt &= 0xFFFFFFFDu;
0 @9 d  G  A5 v/ R- j2 L                //paramSet.opt &= 0xFFFFFFFCu;! P' j& F0 b; J2 S2 s' g
                # K7 r' s) I1 P; L; n; p9 I
                /* Program the TCC */7 x6 `5 S& h& f# Q1 {
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);9 b7 M1 [* Z- `4 F; b& G) H( M

- _- B" b; _$ h7 P                /* Enable Intermediate & Final transfer completion interrupt */
2 C" r1 \3 O  f7 S1 G                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 n! }$ \) B  F/ E                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) J, _2 L5 V  l' C, m
" E4 \7 C; E' y# g4 Z
                /* AB Sync Transfer Mode */
" w7 S7 O" O: Z0 L8 ]7 A5 N; a                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" l$ I- v5 m" u$ h                + ?% W8 r. o+ I5 A3 p  `
                /* Program the source and dest addresses for master DMA channel */
! g8 @0 N3 T- X+ P6 q                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
% s  M  c9 T1 L; [6 v# M                paramSet.destAddr   = (uint32_t)(ping_buffer);
+ i2 E" f8 [( G8 u: f6 y0 V8 c8 j7 U9 O3 K: s6 ~
                /* Write to the master DMA channel first. */6 u0 s( m- s( c+ `( ^6 L
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);4 H* j& B' o2 y! Y
    }      
  m6 ^2 ?& ^& R2 v9 |* T' V
5 o; U1 J* l2 K9 _+ b. N3 x        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; k6 v" O9 e  q- A8 k) i        ' G0 g' a  ~# D1 l1 R. s6 Y5 h
    if(result == EDMA3_DRV_SOK)
" W, _: T% ]  x7 R+ H4 B: A    {
% d, p* K* M" R2 Q9 d4 |  h- V. \, n            print2arm("edma3 driver init success.",0);
# m; H8 e, ~. D    }
4 b8 B% `; e0 X% J4 s2 O}
# \' P5 e2 Z% a( K) ]0 u
8 Z, M7 O- M; Z* g4 l& o5 Q0 m% I% @* }4 W
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。4 M( G$ R  z) [* k3 E

. s- \" o4 \. F/ T' h. q9 N% H' z% l1 D' D' p

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47& V" {; ~- e9 `
每次DMA传输完成后都要再次使能传输
5 t6 \* P' u1 {" \5 X6 U
原来是这样,我明天去试试,谢谢了!




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