edma3中断只能进去一次 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6578|回复: 2
打印 上一主题 下一主题

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( |: m/ f$ z: R# x5 R- q
#define  PING_PONG_ACNT          1' c7 S" @8 d4 L, e" m
#define  PING_PONG_BCNT          8*32*40 - `& e, Q0 L  G2 l  h! G: D
//#define  PING_PONG_BCNT       1
6 |7 r- C4 q9 w#define  PING_PONG_CCNT          1
7 y0 j6 ?4 B( F#define  MCASP_BASEADDR          0x01D00000
( G0 T" f/ i$ O7 e/ v9 E#define  Mcasp_RXEVENTQUE        (0u)
: ^# j: a8 Q6 B4 E8 J
6 \0 t" ?6 s: v; A6 x! ~& _/* OPT Field specific defines */
- z4 G8 W& Q- b#define OPT_SYNCDIM_SHIFT                   (0x00000002u)% V- k4 C- z. U, [3 b: [; A
#define OPT_TCC_MASK                        (0x0003F000u)
0 L* {3 E: s* J! V#define OPT_TCC_SHIFT                       (0x0000000Cu)" I3 R2 ^5 b  t1 l- s% Z; }
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
3 V. o( I- h) {. k# y9 ]4 B# n  Y- q#define OPT_TCINTEN_SHIFT                   (0x00000014u)
9 t6 f: H3 a# V" X7 g) Z
  V& B2 L) F  X$ w) @char ping_buffer[PING_PONG_BCNT];$ L0 b  E8 ^: _' Z- |$ e
char pong_buffer[PING_PONG_BCNT];
* x9 E# E3 I' {0 X( N% Q! `) \5 i5 }$ P4 o) C8 x0 \
+ ?8 U& E. b: y% [

7 l7 S6 T! W4 V* S$ M
4 p4 w; S/ U% o  J& d; Mstatic void ys_edma3_init()
. t* E9 R0 y+ q; B4 Z0 y8 B- v{
, h  L: q( w/ G! a( z5 f* y" @* P        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 F0 S- O& U' D/ C8 }  T        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 L4 \* z' G0 V3 q        EDMA3_DRV_Handle hEdma;$ r4 x5 g( z9 f) k3 C
    uint32_t chId   = 0;
9 L; R0 ]$ Z9 a" @) P6 @% e    uint32_t tcc    = 0;
5 I# n1 P1 R$ a& l5 a; O
4 I  w7 b7 ]; {: I, {0 M/ r    print2arm("edma3 driver init...",0);* z) Q% F, L: @6 A, T

3 `+ q5 w( ~0 j        hEdma = edma3init(0,&result);
5 c  ^& F. e; N$ Q" `! T" q7 A' r! J        if(hEdma)
; C- {8 ]: T0 V) k- U        {
% o. ~7 k& G! n# s                print2arm("edma3init() Passed.",0);
7 N0 F4 W$ F" D$ Y2 ^6 _/ Z        }/ T2 Z2 W7 |, q+ T3 U" j
        else
$ j0 `6 d6 X/ E. m1 d        {
% r. Q; B( f4 z) J( v% @$ D  [                print2arm("edma3init() Failed.",0);5 K% q$ O6 s6 C. R
        }, S6 f+ M, l$ v( p
       
# D8 q- U! W1 n& N        if (result == EDMA3_DRV_SOK)
! s! P& W6 w' v2 o& E    {" \/ y/ T/ ]" u/ Q: w
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,+ X! S: T/ I' s$ B/ R, K
                                                       (EDMA3_RM_EventQueue)0,+ ?- R1 @2 D! Y. `4 p) F. E' p
                                                            &edma3_isr, NULL);
2 H9 h9 b1 e7 l2 J* l+ D    }7 H( m" \/ E% A
        - c2 N# f& m' c. r& d! U$ A7 A4 o
        if(result == EDMA3_DRV_SOK)  P  J7 V: E) `) D
        {4 V& r7 t7 z' m( z4 n) c* t0 ?
                paramSet.srcBIdx    = 0;  n( ]$ Q/ x2 U
                paramSet.destBIdx   = 1;
) r7 [5 P. f; }  L                paramSet.srcCIdx    = 0;: b+ z# J$ e3 h4 B8 J
                paramSet.destCIdx   = 0;
% Y) t3 P1 [; s/ R; x0 ]                paramSet.aCnt       = PING_PONG_ACNT;
7 D' m9 B* c7 w                paramSet.bCnt       = PING_PONG_BCNT;
- @5 ]! Q  P/ [( U6 i+ ?: t6 ?                paramSet.cCnt       = PING_PONG_CCNT;
  c( E7 Y  P! T- j                ) `- q' V% C( Z9 `0 d
                /* For AB-synchronized transfers, BCNTRLD is not used. */
' V* O9 [( l, L2 m( C$ Q                paramSet.bCntReload = PING_PONG_BCNT;
! C8 H7 h3 O* J, ]  Q/ U8 T, s% K. m
                /* Src in constant mode Dest in INCR modes */8 B9 z7 I6 k4 \2 U* H
                paramSet.opt &= 0xFFFFFFFDu;
& q* G* \+ b6 s3 ?                //paramSet.opt &= 0xFFFFFFFCu;- F( v. j3 ?" D. D+ P9 K0 @6 |
                + y& F' W  M7 ?/ c- \- i' b; h
                /* Program the TCC */
$ l3 D& {: _2 t: \) j                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; U7 P  ^2 r4 H; M6 _
" `% y/ H" D: a" y3 i
                /* Enable Intermediate & Final transfer completion interrupt */1 @' ~! G, f, W( G8 d
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 k7 }2 C: Y2 }; ~: d9 t                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& w' B$ Q/ w9 R9 `" K  a$ w

5 _/ U7 \& n" R4 d                /* AB Sync Transfer Mode */0 A3 N- Q. F8 k* ?
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 v- M! }2 @$ Z$ |4 Z                : d& m) e* K% r8 W1 I- l
                /* Program the source and dest addresses for master DMA channel */- K4 z& D/ [+ G% n
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
  v' f  \9 A/ K% b, J                paramSet.destAddr   = (uint32_t)(ping_buffer);- e0 r0 X" f4 i$ S9 i
3 b+ Q' |1 I0 A
                /* Write to the master DMA channel first. */' v6 n) o# B/ v- u9 g
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
2 l' I, q- B! ]$ W    }       ) O4 {. m8 |- x+ ^  V* s

- \+ v# w" e7 i4 G4 ]        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& W6 z" |- x4 p# l+ S# p, a
       
$ J# T* n2 J, l! ^    if(result == EDMA3_DRV_SOK)
1 q! e& a9 K, ]. e: U8 o1 C7 e6 B    {
7 S6 Q  ~& O7 y) i3 r8 P1 A            print2arm("edma3 driver init success.",0);
# m' A; m3 _' w- P0 x+ P& O/ U    } 0 t7 d" e+ l1 k
}0 i& L( I2 h! `$ x

8 H3 ?  ^9 v) E
4 O# V0 I& H( b' v9 w4 d5 Q+ T1 M- L  aEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: \  I' m2 q# c- V- J/ K

0 n3 Z) I' p4 A  l8 J: I; G8 z
5 p4 Y1 M  ~5 f9 O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
板凳
 楼主| 发表于 2015-4-29 23:25:56 | 只看该作者
Lewis 发表于 2015-4-24 10:47, Q/ B0 W) p* s
每次DMA传输完成后都要再次使能传输

4 C, M) F. t9 n原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

积分
1137
沙发
发表于 2015-4-24 10:47:00 | 只看该作者
每次DMA传输完成后都要再次使能传输
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-1-4 19:04 , Processed in 0.040275 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表