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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ H) ~) `0 J- p: W7 V+ u2 \$ p! m#define  PING_PONG_ACNT          12 z, R4 j$ \- h* _: c' j
#define  PING_PONG_BCNT          8*32*40
+ E( T4 T+ Y. F) b+ j# \" U' W, @6 H//#define  PING_PONG_BCNT       1 & j, z' l! x3 }" Y6 |8 }
#define  PING_PONG_CCNT          1( E# y# o0 o6 T3 l1 l0 b, }& \
#define  MCASP_BASEADDR          0x01D00000
* E7 a2 `. q  [7 ~0 [7 L#define  Mcasp_RXEVENTQUE        (0u)
- T1 @; P2 Z* D4 Q) p+ D4 m$ N( D' b/ ^7 s# ?( v! r
/* OPT Field specific defines */
1 Z/ C) }/ ?8 ?( l/ l7 Y1 W$ p#define OPT_SYNCDIM_SHIFT                   (0x00000002u)! A, |; z  q2 W. y8 W. V" L
#define OPT_TCC_MASK                        (0x0003F000u)
6 ?8 s$ ]5 x3 D! j2 Z. @/ P1 K#define OPT_TCC_SHIFT                       (0x0000000Cu)( t2 J& U. |% p; W- m
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)6 s0 F4 ^. d8 G, Q- F
#define OPT_TCINTEN_SHIFT                   (0x00000014u)9 h. }& p- J' M. f

( X. w1 i( l- v* M) k6 Q2 R( schar ping_buffer[PING_PONG_BCNT];& D# I" ]4 ?' L) r- w6 b
char pong_buffer[PING_PONG_BCNT];
8 n. E: U6 V0 u9 v# ]  f
' j7 N. |" z& u
3 I$ V* e9 V8 M: E1 l0 @* ~  w# b( d- _! g0 J7 z
/ O0 k, t: P1 d0 E7 A5 d
static void ys_edma3_init()- s% _/ o9 a8 G
{
: H  M+ ?2 [. j6 Q  b' F6 C9 G        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- T7 h7 X: [( b
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;: ~9 S0 G$ ^3 A0 v5 |
        EDMA3_DRV_Handle hEdma;
, ^# H, X- P; ^$ K    uint32_t chId   = 0;
" O7 Q1 S8 P6 r1 y. M    uint32_t tcc    = 0;
$ B2 M: A. I2 E6 I/ Z  r  r. P; e6 |6 @' y! c( K0 }& E; |3 F
    print2arm("edma3 driver init...",0);; M- f  r7 l6 R: g3 d: H- x

$ Y4 h' k8 k: Y' L/ u$ g        hEdma = edma3init(0,&result);6 f3 K3 u7 X1 \8 Z* j0 r
        if(hEdma)9 f! Y+ O& F* q( d, i
        {
8 o. i+ n9 x3 b, W                print2arm("edma3init() Passed.",0);
. E7 [. n2 b, c: f- T! I        }
! l2 r1 v. x9 V, f! {! ]        else# p& n( s6 P6 }* d9 j! I. Z
        {5 @7 J* V- S: g( N3 ~8 q
                print2arm("edma3init() Failed.",0);0 l3 [  F' @! T2 g% U  B
        }
8 H( ~# H! W- W/ n. ^7 G$ w4 |5 B       
3 z+ z% p1 C2 R- R( [" f8 \        if (result == EDMA3_DRV_SOK)- y5 [% n( ^9 w6 C$ d
    {3 T6 p) B8 N" p
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 [7 _% o+ F9 ~8 X2 L& j) q4 k6 D  ^                                                       (EDMA3_RM_EventQueue)0,
/ x2 a( d$ H( b" ^6 Q  D# A# z                                                            &edma3_isr, NULL);: d3 E# ^5 j: m/ E; H$ E
    }% S# r8 a4 U8 E$ B
        " r$ i9 V% k$ h) a4 e
        if(result == EDMA3_DRV_SOK)& l* C; }/ N: ~# `$ [
        {
1 ~7 N3 n5 K! a0 c" R! r                paramSet.srcBIdx    = 0;, m0 F0 Z) c0 B1 D  I5 m
                paramSet.destBIdx   = 1;  `- r2 |6 c3 y/ Y9 Z) q
                paramSet.srcCIdx    = 0;
" c' A4 Y6 S% D, C9 z% B% U                paramSet.destCIdx   = 0;; w; a; c& \. k7 S( |  o: J
                paramSet.aCnt       = PING_PONG_ACNT;, H9 N5 h! `7 J# @
                paramSet.bCnt       = PING_PONG_BCNT;& z! L/ G& Q- h4 X2 C# s$ k7 {
                paramSet.cCnt       = PING_PONG_CCNT;7 W8 i  T. ]: A$ m  j& m
                ! |9 D- {1 C; v- n5 U& r  j  m. W$ x" v
                /* For AB-synchronized transfers, BCNTRLD is not used. */
' M) H7 ~: S! d4 z' S                paramSet.bCntReload = PING_PONG_BCNT;: q4 I9 n5 D8 n. Z; C& N! Y% `

" x) V5 z2 J5 n                /* Src in constant mode Dest in INCR modes */
" e. b3 E( N" ^0 \" v( Z                paramSet.opt &= 0xFFFFFFFDu;* D9 l) F5 H, R) e1 h$ Z
                //paramSet.opt &= 0xFFFFFFFCu;3 |3 n3 e3 q' \2 f/ D+ `( m8 t" b
                1 `& z; ]0 K" {2 J8 E! ]$ {. I
                /* Program the TCC */
% f* ], d; D2 n7 k3 q4 f5 i                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 K2 x& {! N/ D8 |3 e8 c
: y8 |4 V$ L& d( c                /* Enable Intermediate & Final transfer completion interrupt */
, v! X$ q* q+ k                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
  |- |3 i% e/ K% E( J, r2 x                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 o! q" d  l4 ^! O  ^' j0 y) F, g  d& n$ C! w
                /* AB Sync Transfer Mode */5 e" O  U- H8 C# a1 B1 l8 T
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);2 `3 W0 }+ S. j+ V, E( {- \* F
                + I8 W  \' h- P3 I- T; _
                /* Program the source and dest addresses for master DMA channel */! @" u# L+ F: `5 P; D$ N1 L4 f
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);6 t+ h( C/ i- d
                paramSet.destAddr   = (uint32_t)(ping_buffer);1 X1 P$ k3 f- @5 j7 F3 k
$ `; i3 F, `3 Z) k9 `
                /* Write to the master DMA channel first. */  k# w5 R& ~7 e5 e! |. K* g
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);# ~5 @' @# C* Z7 S; |) a) x: Z, b
    }      
: P- G" x, c0 T+ _  t. j* H9 Y6 z3 S+ k% i
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. x$ n% E0 W. Q9 @
       
0 G8 O& A6 r, ]" `- f; x    if(result == EDMA3_DRV_SOK) 4 A8 c/ F4 g) S: }; Q5 y/ O3 y; D
    {& _7 I- a( u/ X( ^( l$ }) |
            print2arm("edma3 driver init success.",0);4 A; _8 Y9 v$ ^& H0 m2 D
    }
; d% Y) {% [% \}
( I- C* a% Z5 O$ g+ ^) D! T
: p( k9 s7 H4 V  v0 \4 U# F2 x6 `1 v  K1 l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# e+ K$ _" I: Z: J8 j
7 l9 s$ i$ u: y
+ P. m$ |* W# z2 G/ z! @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
板凳
 楼主| 发表于 2015-4-29 23:25:56 | 只看该作者
Lewis 发表于 2015-4-24 10:47! h  Y) `# p; C9 w( V
每次DMA传输完成后都要再次使能传输

, x$ z, o) k% X0 ?6 }: ^原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 18:33 , Processed in 0.037978 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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