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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:9 Q$ U& J4 `+ m( Y
#define  PING_PONG_ACNT          1
' v- Q1 |1 m: m- g# z#define  PING_PONG_BCNT          8*32*40
1 B2 S1 f- \- m4 c8 \9 C//#define  PING_PONG_BCNT       1 2 a8 v0 D% G2 v3 @. u
#define  PING_PONG_CCNT          1# B# R8 p' J- r
#define  MCASP_BASEADDR          0x01D00000
, K$ i, Y# r1 T  l; ?4 ?8 q2 L#define  Mcasp_RXEVENTQUE        (0u)5 l5 l/ }4 |) r+ }
$ k! v; n5 k9 L% f: W$ Z
/* OPT Field specific defines */& |; T% C( Z4 S& D% w: n0 M
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 x) l0 V5 B6 G7 d0 a& [: Q$ }#define OPT_TCC_MASK                        (0x0003F000u)
9 _0 N; y/ d: N" a" z/ K* u#define OPT_TCC_SHIFT                       (0x0000000Cu)5 S" M  G( Y: t- _5 M
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
  ]. @- i9 A4 T% Z#define OPT_TCINTEN_SHIFT                   (0x00000014u)
; @$ n' Y. H2 w  o
1 W! e- R4 h& l2 a0 E% l) r, xchar ping_buffer[PING_PONG_BCNT];
3 M3 I$ X0 |% Dchar pong_buffer[PING_PONG_BCNT];* \3 V6 I# W$ _, ?5 Z8 i
! ]9 h' ?# G/ d6 [
! A! C) _. G$ x. U+ q

7 N! p- t2 Y4 P- s$ O) ^
3 |6 Y5 H7 Y: p: c" \& |3 v9 `+ hstatic void ys_edma3_init()
2 S. Z1 m/ y1 }3 a- F) K2 m1 x{
# f, g# S5 M6 Q  U2 O% y        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& X* {. O' ]- k- \. K# ?8 W        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ m5 |$ ~2 e, _6 m) ?# [
        EDMA3_DRV_Handle hEdma;6 G# K4 ^: n$ m
    uint32_t chId   = 0;2 B% t/ W/ g6 N9 n- J
    uint32_t tcc    = 0;- R8 d# c" i) ^* ?: c0 @3 z
; ~. S# G! l$ X
    print2arm("edma3 driver init...",0);
/ f0 v3 |6 @! C: x5 `8 F
8 `7 e- O( K+ U$ p' z3 H        hEdma = edma3init(0,&result);
8 [* S9 U7 |* e0 o        if(hEdma)) i6 C4 t8 O6 P% I
        {
/ S1 X) i' H. x2 U                print2arm("edma3init() Passed.",0);
0 E8 [) s. v) P2 Q        }
8 o7 w( Q2 X8 m# g8 ]% L1 N        else  l3 x" n+ V- S0 W
        {. u1 g3 V! x" I1 g) [; B! }
                print2arm("edma3init() Failed.",0);
2 i( ?. F5 H2 v: G. Z        }
2 m" f" \1 v( I( t        , P: g5 L3 Z" Y6 Z; |6 p9 u
        if (result == EDMA3_DRV_SOK)
  s8 B: B. r; L! U5 n. f& c    {/ u3 Y) o3 z" N# ?) Y' P
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,) v) c; E- m$ j7 o
                                                       (EDMA3_RM_EventQueue)0,: [2 b, u7 \' p, v1 O, m: v) g4 i
                                                            &edma3_isr, NULL);
) i3 ^" }5 w. j8 r$ {1 p    }
0 u- k: D9 n9 m7 r. x9 A       
* W* G7 x% c5 Z! c+ s        if(result == EDMA3_DRV_SOK)
3 j( F$ o/ g- d. j        {
: b4 L8 ^# u( W4 M8 [. X                paramSet.srcBIdx    = 0;0 x- l4 j! |' c- ?7 M( D8 u$ P$ Q' o
                paramSet.destBIdx   = 1;
+ h1 C* ]6 M3 \. S( l  L" ?; t6 R8 k3 U                paramSet.srcCIdx    = 0;
+ _6 H$ S' j1 D7 p7 q3 F                paramSet.destCIdx   = 0;
2 @. c% U* |( o4 g: u5 \/ Q9 d                paramSet.aCnt       = PING_PONG_ACNT;2 w6 G  y* [' y) w. G9 Q
                paramSet.bCnt       = PING_PONG_BCNT;# m4 y- E4 G) E( E
                paramSet.cCnt       = PING_PONG_CCNT;' w3 L' J- H2 u- j6 I4 H1 z/ L! X0 y
               
: m8 T  l0 X% K( Q                /* For AB-synchronized transfers, BCNTRLD is not used. */! W' y# ]2 R! e0 K6 s$ m. o6 q
                paramSet.bCntReload = PING_PONG_BCNT;8 ^1 Y+ R3 \$ h- q3 _7 G3 \* \! B

4 q, A% ]9 u0 |* Y' S2 @+ s                /* Src in constant mode Dest in INCR modes */6 Q  X6 n+ J$ \* i
                paramSet.opt &= 0xFFFFFFFDu;
6 z$ N7 W* F' w& E                //paramSet.opt &= 0xFFFFFFFCu;
* A7 \7 G& U/ u1 v/ f( v% s0 A               
! n2 Q3 x5 v% l                /* Program the TCC */7 R: @0 A* h; P0 c. I& u2 T0 A; X
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ A$ b/ X- t; P
" t( w( M. `" U/ m/ ?/ d; n' J
                /* Enable Intermediate & Final transfer completion interrupt */
- U; Z& O2 p; n" S4 T3 M" `                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);6 p" m; t9 r2 Y3 k6 g5 y
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 d3 X- D4 Z) k# |6 H* z+ p8 u5 G

/ ]4 b2 h" r: O. N) i3 I9 \& D* S                /* AB Sync Transfer Mode */! W, r) A+ K9 Q: j$ o
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 ~& }" P- Q) [; ]  F: F0 }0 s
               
& N. q# w: @# h  t  \1 R4 ^  i" e                /* Program the source and dest addresses for master DMA channel *// |% h! ]: K1 A) @( f
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
  X0 r1 ]8 S, \) C8 b) H- J                paramSet.destAddr   = (uint32_t)(ping_buffer);
* w, h) H- l: `" t
3 j$ w5 e1 V/ V. X( \                /* Write to the master DMA channel first. */0 ~  f! u4 P6 R2 a. }; m" R& ~8 W3 B2 B9 u
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);" u1 C+ x, L9 L# `$ r: x% D1 f
    }      
- v  ]$ x6 m3 Y) y0 a$ t8 I1 x/ ~& I+ U! x
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( x& w6 W6 I% ~0 m5 s" }
        $ F) `+ K( A9 ?. d2 d: @! {4 R
    if(result == EDMA3_DRV_SOK)
& A$ U( h0 r$ F5 J    {5 e% I# `( q7 _: f4 o
            print2arm("edma3 driver init success.",0);
5 T$ W& t' i* x0 D( O4 R, I# T    }
( n0 c7 R4 l( ^% n0 C8 n/ H2 x}
9 W* |6 n6 ]/ A8 k" F. z" B; J! [% T( I/ z6 S2 _- B2 e

; Z! m" r, p5 E: f- REDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ p1 m* X0 |( P3 l/ j  w! G. K  n" m0 e8 D) w. j

2 i! b" t) Z* p9 N& _  W) c+ I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
板凳
 楼主| 发表于 2015-4-29 23:25:56 | 只看该作者
Lewis 发表于 2015-4-24 10:47( n# o! M* W. I$ W1 @" ~; i6 x
每次DMA传输完成后都要再次使能传输
$ m6 c4 r( T9 \8 y( T7 t0 w, |' B" |* f
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-9 15:35 , Processed in 0.040765 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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