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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' |* K, W( x" I, i4 ]#define  PING_PONG_ACNT          1
( T* w; p  f2 R1 q8 G8 ?#define  PING_PONG_BCNT          8*32*40
2 t* C: u. W# I4 |5 y( v* `//#define  PING_PONG_BCNT       1
! T4 `" q* C# s, [#define  PING_PONG_CCNT          1( J2 p; V5 x& f
#define  MCASP_BASEADDR          0x01D00000
. R1 P8 q6 Q1 E7 D# ]#define  Mcasp_RXEVENTQUE        (0u)6 |% k" Q0 ~* @. [, H) ]6 s
1 C1 P0 j. ]0 E8 |
/* OPT Field specific defines */
. j  N: |# G- x2 y#define OPT_SYNCDIM_SHIFT                   (0x00000002u)' z* K" R' X3 ~' u% m& H6 G
#define OPT_TCC_MASK                        (0x0003F000u)+ J3 M' h4 x$ ^3 m9 \+ x$ ?# q* {* z
#define OPT_TCC_SHIFT                       (0x0000000Cu)
* w! d, K) `9 r7 `! N' f6 O- G#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
+ o+ }1 _* {* ?& O  V2 ^#define OPT_TCINTEN_SHIFT                   (0x00000014u)  }. E6 l: B# `* L  n+ z0 [8 |
6 V5 E6 n# I1 C
char ping_buffer[PING_PONG_BCNT];
) r1 ?! m- f" Gchar pong_buffer[PING_PONG_BCNT];
: _, H$ l* a5 m( {
. h. W/ A: \/ U0 b6 d$ d& I
" j6 U' N$ M* l3 x1 j$ e* H
$ f8 l3 a  y+ r$ e; B$ h
/ ?. {$ h' E0 ^: [1 Y9 lstatic void ys_edma3_init()
7 U: W' [! E5 C" f{+ n/ j+ V4 Q! i
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; G  p% |) w! v6 S; d' f
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) J' N+ ~4 S, I        EDMA3_DRV_Handle hEdma;9 |4 z7 K9 t3 F$ V% Y
    uint32_t chId   = 0;3 }) X/ v% j' J% T1 d& S; U* O/ T
    uint32_t tcc    = 0;
* v; x# ?$ c0 _! l% I* @) ]7 N' h* ]7 i1 A# H) h% m
    print2arm("edma3 driver init...",0);
6 j6 w! [, X( r- E; A% a# O: D' k# m
1 T1 A3 m7 |8 e        hEdma = edma3init(0,&result);9 A9 w# `' I1 T' _
        if(hEdma)
3 E5 k! q! ~& m        {
% v( |7 d' j% R  s                print2arm("edma3init() Passed.",0);9 x9 T  Q+ B) \- a  t0 {& r
        }6 T- t, P+ Q* V
        else7 ]  n! W) j& T$ a( w7 U
        {
2 q" b( g/ V2 z" q+ e                print2arm("edma3init() Failed.",0);: r9 v7 ]2 P2 Y3 [/ r5 l; E
        }2 t/ e( T% o" h# L
       
& q, P8 @- `' ~% N% C$ r        if (result == EDMA3_DRV_SOK)
! C$ {) P3 B- U9 H& t    {
6 X: J, {& k7 T                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ T, B: k; C4 J
                                                       (EDMA3_RM_EventQueue)0," F( H! v. ~9 |( l* S; X
                                                            &edma3_isr, NULL);
# Y9 ?+ t. e- ~! y3 L8 X2 `    }
* ^# I( f6 j) `0 I: ^: x* f+ `6 M       
3 d3 J& A0 v" t/ K6 R- `# P  g        if(result == EDMA3_DRV_SOK)
- o' T, @, M1 d% g        {% m; s7 }; z+ o
                paramSet.srcBIdx    = 0;- r& C% i+ A* b9 s9 {
                paramSet.destBIdx   = 1;4 B5 D$ h& m$ R5 _
                paramSet.srcCIdx    = 0;
$ F: g1 P0 O# ?                paramSet.destCIdx   = 0;2 y* \+ n/ d2 T& p# Z* J
                paramSet.aCnt       = PING_PONG_ACNT;% T5 b9 {3 g  A4 L
                paramSet.bCnt       = PING_PONG_BCNT;
3 m3 K. M1 f7 }                paramSet.cCnt       = PING_PONG_CCNT;
+ c) O+ |* x! ^" I+ {& F; K               
) Q. j; f* ]% W+ `0 w* c% \, `( P                /* For AB-synchronized transfers, BCNTRLD is not used. */  c& F' C2 n' O6 o' l
                paramSet.bCntReload = PING_PONG_BCNT;* Y  [6 P; ^9 `/ `

, W( f) |: Y& U# _                /* Src in constant mode Dest in INCR modes */
, c4 V* h! c$ e                paramSet.opt &= 0xFFFFFFFDu;$ `  }6 v$ Z. C/ m" ]& h& |
                //paramSet.opt &= 0xFFFFFFFCu;
$ G* h. k& S2 }* b7 R/ ~4 R! H               
" r( H2 G: E% L% M( [( X$ V8 k; Y                /* Program the TCC */
+ J$ Y6 s# f( i  D5 l                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 \: y4 i+ z6 q) b& Y& r
* }# m; r" X+ J0 e
                /* Enable Intermediate & Final transfer completion interrupt *// C. a  ]6 R: X8 \! g3 u2 R+ k0 }
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ c7 I+ |- u* q/ Z- h% @
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);/ p6 Z5 X- U) S; R3 a' v" y+ V

4 i' j2 [- X$ d' o                /* AB Sync Transfer Mode */0 V' D& ~4 C! V# R+ h
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 X3 D2 B$ j* T% F1 o( c                * C8 H0 V) d+ I# u
                /* Program the source and dest addresses for master DMA channel */! _5 ~- m1 Z+ n, M6 ~" Z$ P+ E& ~
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ j; l5 [, D6 Q5 G0 }* |/ f, w
                paramSet.destAddr   = (uint32_t)(ping_buffer);9 S9 h9 l- p0 q  Z- z
5 e4 @9 P* c6 _* |3 C
                /* Write to the master DMA channel first. */2 k: O% A7 c0 F& C( g$ I/ g
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
2 R  h8 O! J" ]  T    }      
) g5 N+ T  G  E, R8 E9 k, A
, i$ M) g2 Z/ K, P! {* t        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( b4 u6 S/ D* |: A       
2 n9 Q! F: k" w$ e) Z$ y    if(result == EDMA3_DRV_SOK)
( l; X1 N5 W- U    {
8 ?3 i& U) Q7 J4 @            print2arm("edma3 driver init success.",0);! H4 F- M" n( Z1 D7 b
    }
$ E6 s+ g1 D! m3 q- M" S}& m" k8 ^. U5 s1 F6 e3 }* b3 Y

* h1 q- r4 q0 ?2 l1 m# z$ \. U  u- K  q4 q, O; X7 L
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: F& I  s0 Y' D# x$ }
% }  b& e5 y5 V

" @: P7 K2 e4 F4 d& @! n- r* \1 x
分享到:  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$ Z( `9 j- h" M3 ]& x
每次DMA传输完成后都要再次使能传输
- n8 v7 S2 c" u1 T
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-6 18:35 , Processed in 0.039430 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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