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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
3 U! G$ m- R0 F& F% T& Q#define  PING_PONG_ACNT          1
2 F% q0 H0 w5 A& e0 \$ E0 r#define  PING_PONG_BCNT          8*32*40 8 D+ l6 a2 G2 i5 P+ U5 s
//#define  PING_PONG_BCNT       1 . `8 a$ Q3 _  l0 r  A: l1 Y
#define  PING_PONG_CCNT          1
$ O: S- U4 T" q/ K#define  MCASP_BASEADDR          0x01D00000
  z# a0 _# N( T8 d! \# C#define  Mcasp_RXEVENTQUE        (0u)
9 Y) V7 |) L& p  B( c. H- a# R, K: C$ a6 h
/* OPT Field specific defines */
& |2 l0 i1 V$ ^3 ~  F% N9 [* T0 [#define OPT_SYNCDIM_SHIFT                   (0x00000002u)9 f2 z4 C! H: |, Z
#define OPT_TCC_MASK                        (0x0003F000u)
+ Y8 z5 b  e* y) c) h' o; G0 m  e#define OPT_TCC_SHIFT                       (0x0000000Cu)
0 B, f$ M7 }% A6 X$ L9 g#define OPT_ITCINTEN_SHIFT                  (0x00000015u), x! `2 U  x* g' {8 n' O
#define OPT_TCINTEN_SHIFT                   (0x00000014u)6 r2 X; i" a6 K; x( ?+ g" ?
3 B4 q6 q/ c: c  I$ i( L
char ping_buffer[PING_PONG_BCNT];
) n& M* b9 r! r! T' I5 j2 Q1 \9 bchar pong_buffer[PING_PONG_BCNT];
! P9 M6 e8 o3 v: N0 J  ?" k9 o! N6 N4 t* Z6 R

! R# ?9 `! e7 d) ]  q" t8 p' Y8 H4 L0 [9 f, j) \$ O' x) l& b
$ G3 t+ l: k+ ~
static void ys_edma3_init()6 t* s+ n5 t* \& c5 x9 V
{
+ n8 H/ ^# B% e9 T1 @        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( m! g1 I4 A4 V. a8 Y
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;! u' F7 f- @8 L( V6 _, u
        EDMA3_DRV_Handle hEdma;+ O# B# M4 \  o
    uint32_t chId   = 0;
8 O: @# D6 V. e5 P7 ~) a    uint32_t tcc    = 0;  ~2 y5 S0 V4 P9 |
/ R+ a; M% W1 }3 ?) u4 H+ T
    print2arm("edma3 driver init...",0);  a0 G; v5 d$ A% @9 ^- \

' N; H7 A3 c6 _5 Q4 J! p6 l! Z        hEdma = edma3init(0,&result);
! r$ {! H1 O' i3 e. S0 E5 L9 O& }        if(hEdma)
/ c* T0 {: V$ U        {3 x9 l& w: r; W+ \3 y' k
                print2arm("edma3init() Passed.",0);
9 v1 `2 ^- L5 K% d4 K        }5 J0 Y5 t! ~8 c0 \* X
        else$ B+ q. T% p, `7 |6 I
        {) @& ?" P3 K0 Z+ a$ S% g2 o
                print2arm("edma3init() Failed.",0);
  C" P2 Z4 J+ Y' D8 \        }
( x8 a) O6 ^( v. e        5 l- M! c- {8 z; E1 K: W
        if (result == EDMA3_DRV_SOK)& [- G; n7 G) G! `+ ]; q& z
    {
6 y) f6 R6 W# d4 q* f, U/ r# F                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,- P1 Z+ v5 ^  ~1 F8 [* Z1 x
                                                       (EDMA3_RM_EventQueue)0,
- W% N6 s2 _" A' z& r  y" U7 w                                                            &edma3_isr, NULL);
# Z5 ]- m; z4 I; w8 C  m7 b    }
3 s: r# f1 Y. h+ R! h; e4 z        - V- O, ^- D6 M) o
        if(result == EDMA3_DRV_SOK)2 J3 A6 u% m2 G: P; v+ T
        {; \: |- o. M+ H- h, `& j
                paramSet.srcBIdx    = 0;
  f5 k! L9 N  f% O" Y                paramSet.destBIdx   = 1;! `9 ?; y$ `# s' b  t/ `
                paramSet.srcCIdx    = 0;
. U! e- ^7 Y1 p% u$ n! @                paramSet.destCIdx   = 0;1 q4 e: u2 j+ ]4 ~1 A7 M
                paramSet.aCnt       = PING_PONG_ACNT;
5 B$ s9 X. j6 l" P" d                paramSet.bCnt       = PING_PONG_BCNT;
) `2 @7 l$ I  i7 I/ L% ]                paramSet.cCnt       = PING_PONG_CCNT;! z" e- T6 B0 p3 i/ k- p5 l+ L! @4 U
                3 S; j  ?! I* Q2 W. W
                /* For AB-synchronized transfers, BCNTRLD is not used. */1 ]+ U$ K* z7 S" b
                paramSet.bCntReload = PING_PONG_BCNT;
0 Q/ }; y  [7 K8 o, w: R( _) g
                /* Src in constant mode Dest in INCR modes */4 _0 _( Z+ \' s. {% ?+ y1 C
                paramSet.opt &= 0xFFFFFFFDu;
( t9 a( y8 b/ ?+ T! V- W1 V) _                //paramSet.opt &= 0xFFFFFFFCu;: N' o3 T8 R; g  n; }* h
               
  \: \: ~$ @3 a8 U. D7 x* Z                /* Program the TCC */
8 B0 E! W0 \1 o4 o# B                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: J+ {, M8 Z9 h8 _' s

5 ]1 O4 q4 j- Q% v$ b                /* Enable Intermediate & Final transfer completion interrupt */2 N) n1 g" D# s/ w3 k9 m4 D
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ E/ H& R. d' V- w
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);9 ?0 D$ m0 T. t. v' w( \

/ e' T7 B  g  l" u" ~                /* AB Sync Transfer Mode */6 T4 h8 T5 y8 O/ y# _( v
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);9 [8 J7 X: r3 `0 {- z
                4 X* L) u+ C' y* P/ y
                /* Program the source and dest addresses for master DMA channel */& V0 D2 k6 W0 a5 R4 z5 O: b
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
+ X3 a# g4 V* G$ Q& k8 q* o. k                paramSet.destAddr   = (uint32_t)(ping_buffer);
1 f& b: a3 t, y$ ~! z8 I# i& H9 E; g4 s$ h9 I' u
                /* Write to the master DMA channel first. */4 K& |6 Y% w  ]7 O" g
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
% K# K2 J4 H. B    }       0 d) z, p" L% p6 h

; k1 \! R  Q/ c4 H        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ K! ^! E* b, @8 X$ v        % u- d& T9 ^; p4 {9 {& U0 V
    if(result == EDMA3_DRV_SOK)
: j8 @; f: n, K9 p- |3 D  a! X& [    {  Y9 r1 @) @  p+ G6 ~8 r- ^
            print2arm("edma3 driver init success.",0);% X" u. {6 d, D) X
    }
* z, z$ R. E+ F  U- h# B}
1 |6 p9 f& i0 B2 C. N" `# Y+ w
1 T& z7 C) P% W* }; c1 J+ y6 \2 C' e# H) F
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" s" V) K2 {' z! u- x; ^! T/ h) r) w# p# F6 \! m
' h6 j; H; b8 v% _2 ^6 k  _6 z  E
分享到:  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:479 {7 r* x: ?% [6 b( {; @, y: {
每次DMA传输完成后都要再次使能传输

  [+ m6 w' B: K0 K原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-19 03:50 , Processed in 0.039242 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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