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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 N6 G+ V# k* S1 E/ f+ D( M
#define  PING_PONG_ACNT          1
) y% }* O: O7 |( j* C* B! O( |#define  PING_PONG_BCNT          8*32*40 % Z4 G! e$ H. o3 m' n' U: D1 H1 \
//#define  PING_PONG_BCNT       1
" u$ ^, {  n$ v2 @7 o. b$ B" s4 O6 ]1 r#define  PING_PONG_CCNT          1, [+ [% G) m+ X# ^
#define  MCASP_BASEADDR          0x01D00000
7 s9 n+ E& G2 r7 o* c  }+ |#define  Mcasp_RXEVENTQUE        (0u)9 D* d3 Y+ d9 G% b2 n; i0 {7 m* h

8 O; r5 S5 b& P) O9 m. M/* OPT Field specific defines */- C& k2 f  K4 N! F" {2 X
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
5 m2 S- g/ O9 a7 R" z* i9 ]; V+ o; Y/ N#define OPT_TCC_MASK                        (0x0003F000u)" W4 l% d' a; G: s
#define OPT_TCC_SHIFT                       (0x0000000Cu); H% ]1 f3 I7 L, Y0 ^, l+ i
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
$ A5 Q& D# l5 q/ ~5 I3 ?! y5 a#define OPT_TCINTEN_SHIFT                   (0x00000014u)
5 h8 P6 P% F7 f0 P9 |- n4 }8 ~( |
4 n8 R3 X) f* \: Z( B6 i2 K. Lchar ping_buffer[PING_PONG_BCNT];
! l2 \+ E8 {2 W  cchar pong_buffer[PING_PONG_BCNT];6 A, Z* X; y5 y* ?8 K

( e4 M' V) M% A( |
) G" @( K. d: _& E- H0 L0 n& e# R8 V0 o" F8 u

2 A/ ~) H" h7 Q6 p* ~% l# W0 l8 Dstatic void ys_edma3_init()
! [& q9 S; k6 f: m/ d, F{% D3 }; R+ ^9 f7 X
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& D6 E  j: z8 w# A% Z& d: @' ]
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) U* v( \* n- z+ C( V  E        EDMA3_DRV_Handle hEdma;
; ^) V; b& Q$ j4 h    uint32_t chId   = 0;3 E8 X* v! ?: R+ r1 c, O4 s
    uint32_t tcc    = 0;0 Q' l1 s. ^! K

8 M3 e: n& d, x* X& |    print2arm("edma3 driver init...",0);
9 b2 a4 l0 o5 I  b& ]% r7 c6 J2 S
        hEdma = edma3init(0,&result);
" V( }; x1 f* y, D        if(hEdma)0 l' k9 d/ H$ m+ q
        {
, V# i- j1 p) H9 k5 A, A9 m' \                print2arm("edma3init() Passed.",0);. t$ r* o7 P, Z
        }
: S$ s+ J! f) r+ u9 W        else
4 E0 C3 D. m9 S  H& [6 u) g        {* t. r: ~. {- V. E+ \4 F
                print2arm("edma3init() Failed.",0);/ q2 ^) i$ b$ M2 _7 v0 ?
        }
1 R! ]) |. a7 ]2 u2 Z( K; X9 Z        ) `5 @: z; c, n- _3 [
        if (result == EDMA3_DRV_SOK)
( x  r4 E8 v" S; S9 P4 L# `  }    {/ a( n- B, f2 i
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," @9 g' d  n& [8 G
                                                       (EDMA3_RM_EventQueue)0,
8 R* W" q$ K+ z- @  o                                                            &edma3_isr, NULL);
) z% m/ e9 A. _3 n9 x    }; M1 F- _+ a3 [, X; j6 t5 z' W& M; M3 j
       
0 f8 _2 ^7 P3 q' V3 @4 q        if(result == EDMA3_DRV_SOK)- i) b* ]7 b+ B: G( Y
        {
2 e* W6 Y& {" M                paramSet.srcBIdx    = 0;( T5 n( \' U7 W
                paramSet.destBIdx   = 1;
4 T/ `5 `7 s% M0 g0 A                paramSet.srcCIdx    = 0;
! R: m% _. z7 C5 e                paramSet.destCIdx   = 0;
: X' K' w  }' o' z/ t4 C$ F                paramSet.aCnt       = PING_PONG_ACNT;
. G0 K( g( t- o, Q. u+ b$ d7 |                paramSet.bCnt       = PING_PONG_BCNT;# k7 l* ]* y. k
                paramSet.cCnt       = PING_PONG_CCNT;+ B& I$ G' N: I* \! V5 r! }% ^
               
1 c- u: A/ E% @( G) D9 [, ^                /* For AB-synchronized transfers, BCNTRLD is not used. */) P4 ]% W6 |/ s$ y: \% m
                paramSet.bCntReload = PING_PONG_BCNT;* o" S$ v8 M) G: U
/ f: d" I; y) Y- u7 e6 d2 M
                /* Src in constant mode Dest in INCR modes */
9 k8 K3 _; v% x* G                paramSet.opt &= 0xFFFFFFFDu;" d( v% |* p2 g) ~, h
                //paramSet.opt &= 0xFFFFFFFCu;
4 @0 E7 R+ [+ L5 E# t8 d, H" E               
$ E8 s* o7 t  R& T2 b& L                /* Program the TCC */5 M$ p! t; t1 Z. [* v
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 Y7 p" H: f$ O8 G# j. ?& y

- Z6 n8 G9 _; W' f7 t. _                /* Enable Intermediate & Final transfer completion interrupt */9 [& i( ]5 Q: Y* ~
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
  |! x2 }* T+ Y! U8 Z$ \6 N                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 |9 y7 B0 a9 d, V' ?- P( e
8 I1 r3 F" w- J% l5 f, ?                /* AB Sync Transfer Mode */3 N! u2 Y- O( c4 E3 e
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ x  t6 h( @$ k7 o' X               
% @# M- h( y2 Z5 ]4 p  ~  A                /* Program the source and dest addresses for master DMA channel */# Y' U9 G. k4 G* Y9 r0 ?  ?
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);/ H) M" N# v8 u7 x) Q/ M- M% `/ v6 l
                paramSet.destAddr   = (uint32_t)(ping_buffer);
; l$ H; S! c# e( \9 g$ d$ m- z( ^5 M! N& t9 G7 s) L; \/ j
                /* Write to the master DMA channel first. */! P- Y& C* P! T) w$ F
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);- ^2 Q8 b% N6 Z  }" J( y  i& s: c
    }      
6 V4 A) ^! ?( L. F9 y
7 H% w+ h+ n0 p" U0 L, v        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 \+ \2 d8 d4 V$ W; M2 x        ; t8 b9 n1 C1 E- `. v
    if(result == EDMA3_DRV_SOK) $ s8 ~6 b0 R* o+ g& ?7 z. J4 l- N
    {
2 H7 P) C, }5 c, p: ?% e7 M3 [            print2arm("edma3 driver init success.",0);
# `$ f) Z2 y$ z3 s3 U2 k    } 0 F) z9 k/ G0 f
}
2 g* h9 J6 M  P+ ^' m& [6 z2 w' m2 d: m* e4 b" ~1 V3 V" A
" d+ |2 N3 D- K) u& r- v2 S
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。0 ]* h; B) C" S( w* {: `
. C6 f; u' v2 [1 ~# L/ `3 K
$ Q9 V+ C: K% {& J$ q4 T4 X( R
分享到:  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:471 f3 J$ o* j2 b' l* G3 @: |& Q
每次DMA传输完成后都要再次使能传输

+ Z& I9 Y" [4 S; ?原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-1 21:17 , Processed in 0.040229 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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