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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! K8 d1 l4 n8 V( Z; d. k#define  PING_PONG_ACNT          1
8 _6 D9 E. n# S- X0 m7 M. v2 I#define  PING_PONG_BCNT          8*32*40 5 X9 J/ k, W; S( l  B& N% w
//#define  PING_PONG_BCNT       1   w, S8 ?( C, k0 Y% Q
#define  PING_PONG_CCNT          1
: K1 c7 N, t! \9 N# |#define  MCASP_BASEADDR          0x01D00000
8 Q, D1 e1 q3 k; D% `! E, Z4 g#define  Mcasp_RXEVENTQUE        (0u)
8 ?& ]+ J4 m" G, D% V% B' @$ Y. h4 ^/ G' R/ ?! C8 |
/* OPT Field specific defines */
: T: W) q- w' |$ N- n# }#define OPT_SYNCDIM_SHIFT                   (0x00000002u)! u2 @: |2 f6 j5 d* g0 f  x
#define OPT_TCC_MASK                        (0x0003F000u)' Q, J0 f7 L2 b: I' o* X: a
#define OPT_TCC_SHIFT                       (0x0000000Cu)+ Q( I8 q0 t9 p0 H9 N: q
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
5 w" o3 J/ A" {  \& c& D$ q& Q' h#define OPT_TCINTEN_SHIFT                   (0x00000014u)
8 P, X  E0 q9 P. q
8 L! V8 Q# [' R  Nchar ping_buffer[PING_PONG_BCNT];
% Q. I, T" t* f9 I( Lchar pong_buffer[PING_PONG_BCNT];* {4 c. j& S' l! @5 _+ P: {

6 H2 M* B/ C/ p) N( ?
! m, k6 c1 D2 a* h
, ?# G9 T5 e# {  K1 J" F; }  c5 W+ B1 N. Q0 D/ R" u( S
static void ys_edma3_init()
+ V1 ]5 @0 V2 ^4 N{
; P8 x! f2 B( [) t# t& |& ?% d. i4 s        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ T  {2 r8 f1 ]& w2 Q  c  ?5 c
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;- V5 ]# B" k4 L3 x. [9 c
        EDMA3_DRV_Handle hEdma;7 }% P, R6 |' ?3 v$ x4 Y1 {% W1 K
    uint32_t chId   = 0;
, t, i9 [% d% z9 A- {5 @    uint32_t tcc    = 0;& F3 v$ _( M9 w% L5 s
- {1 E! ~3 d3 S; o3 z( G
    print2arm("edma3 driver init...",0);" b0 g: u! e6 R/ M

6 W6 z3 k  l! I; H7 v; |1 g        hEdma = edma3init(0,&result);! l. N+ J# s: ^% k* F' f
        if(hEdma)
8 w( L  k1 D; p+ f$ q7 ^9 V9 s$ `        {
3 Q8 I$ f2 ?' y! R7 l                print2arm("edma3init() Passed.",0);
; k% j( i8 z; H# j; F4 _9 }        }
0 {$ Q$ h! e# y' P7 W        else( y" R; s0 {2 x3 E& e: t% }
        {2 z3 j3 v& Y% b' w
                print2arm("edma3init() Failed.",0);
- h! d* c0 Y5 n, ?# }$ y' M        }( [9 n+ y! y) U8 t4 q
        0 u- [1 S  ^  M' s; v
        if (result == EDMA3_DRV_SOK)
2 F! v: h- }; P: Y0 @9 v& i    {
1 y% y, ~7 ~" Q% P- Q                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,# j7 |# j( E1 i
                                                       (EDMA3_RM_EventQueue)0,0 N, R& x$ T( T) g
                                                            &edma3_isr, NULL);
' Y9 V# i4 m9 U% [, E" _    }
9 U# p. \5 r" k. `+ n5 [8 d* O$ M        4 t1 F5 O: `3 f* t+ b/ m% ^2 C1 E, Q: O
        if(result == EDMA3_DRV_SOK), {& b  p7 u$ e  O4 t
        {
: {' Y$ n8 V- m! g, I3 D' r. e$ {" Z                paramSet.srcBIdx    = 0;0 l6 L0 q: y' }0 a* N/ U, _
                paramSet.destBIdx   = 1;
' s/ V- ~, P* B& Q                paramSet.srcCIdx    = 0;$ z' E- A' F: n- ^( Z2 W, [- A9 Z
                paramSet.destCIdx   = 0;* m  p! X! J/ B$ j
                paramSet.aCnt       = PING_PONG_ACNT;
, `& O  \6 R, N) X: Q9 l; V" N* K                paramSet.bCnt       = PING_PONG_BCNT;; f- B' B* U7 p5 D( u4 G
                paramSet.cCnt       = PING_PONG_CCNT;/ a* [' U+ c& v$ l* [* H5 a" K
                ( v7 M( }; F4 w& p' I: v* F- b
                /* For AB-synchronized transfers, BCNTRLD is not used. */
6 `/ v) K" `) Z% W1 U) h4 {                paramSet.bCntReload = PING_PONG_BCNT;) X* L% D3 i! _/ L
/ k, e! ~) n: D% |
                /* Src in constant mode Dest in INCR modes */
; E4 e1 p& q* y2 }: d                paramSet.opt &= 0xFFFFFFFDu;, d9 D6 B( ?: y% W( q9 ]+ o  m5 y
                //paramSet.opt &= 0xFFFFFFFCu;
# t6 i# @4 L1 x3 @, P                # R# o5 |  K* V; G" P, |0 l
                /* Program the TCC */
# _# k/ g" S/ c$ x9 q                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( ?, `! \5 d' w, Z  A1 u1 h" I* K1 ?" X, f& O5 I* W
                /* Enable Intermediate & Final transfer completion interrupt */9 y' S# N$ v. e5 A; W# s
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. ?1 h' c) |& Y/ w                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! ^" m1 g2 h8 U( `& L3 y) b7 Q& v5 K+ O: J
                /* AB Sync Transfer Mode */
) C. u& n4 r: l+ }3 f                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);/ L6 k7 C1 v) j
                ' E: K# Y* V3 d* `
                /* Program the source and dest addresses for master DMA channel */
6 Y1 Z: d4 M( Y+ _                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
- D8 G9 Y$ C7 t! H                paramSet.destAddr   = (uint32_t)(ping_buffer);% }. ?0 a5 Z) s% p1 H

  H! i2 e1 e8 _2 B' f                /* Write to the master DMA channel first. */
* y) t) [' j: i- j" p7 r                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);' P) ^8 Z# l6 m% P5 j- l% B8 |/ |
    }      
! A) s" D: i4 f& ~! G6 A( [8 P/ @4 |
0 i" u% a9 |9 w  V5 ~        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
6 }/ t: R" e& D; K  L       
: k# `0 q3 M& k5 S6 J& M    if(result == EDMA3_DRV_SOK)
% |- {  r5 b3 M3 d0 L5 T' D    {
0 T' X& g0 P" j, i# H7 m6 S            print2arm("edma3 driver init success.",0);
* O; G' o1 X5 d& w* r* Q  j# B    }
3 S- [: N/ I) e0 }; z9 i}
- d, j& n# _/ F0 l( v
) T2 n7 u7 B8 Q! q8 D$ ^  O: k: Q/ G4 E0 h4 x, D1 K: V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ Z1 p/ E8 X1 M* {. S) w5 g$ R; L! S& ?

. v( P' c; A3 |7 r8 Q1 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

使用道具 举报

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
板凳
 楼主| 发表于 2015-4-29 23:25:56 | 只看该作者
Lewis 发表于 2015-4-24 10:47! Q& @& L5 M& ?% B
每次DMA传输完成后都要再次使能传输
2 Q7 r; k- x; I( Y
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-12 03:21 , Processed in 0.040806 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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