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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( l' L1 n/ v& }& {# J
#define  PING_PONG_ACNT          1/ o4 N. t% S( f" f8 V
#define  PING_PONG_BCNT          8*32*40 % E) T9 S& U0 \6 Z% Q7 }0 U
//#define  PING_PONG_BCNT       1
8 T+ E7 T# q# j/ E/ M#define  PING_PONG_CCNT          13 c' Q( q# T2 o; o) b
#define  MCASP_BASEADDR          0x01D00000
% l4 {$ M- P8 x9 f#define  Mcasp_RXEVENTQUE        (0u)1 \! b, W1 O* F) k( m+ G6 [4 Y
5 D/ Q5 F4 @7 q( _+ Q, q9 f
/* OPT Field specific defines */
8 R1 Q' _( X1 @1 Q. b#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
' a0 F& [! ]& c2 I#define OPT_TCC_MASK                        (0x0003F000u): J; b8 d& y! h5 @) q6 P
#define OPT_TCC_SHIFT                       (0x0000000Cu)
. _" {5 f) {8 K, T/ m/ g#define OPT_ITCINTEN_SHIFT                  (0x00000015u)0 M* W( [+ {9 ?% D, g) r
#define OPT_TCINTEN_SHIFT                   (0x00000014u). b; k+ q* F( [, S7 m: x, C

  W7 H  J( U8 ^9 V# z7 `5 G& Schar ping_buffer[PING_PONG_BCNT];
9 z8 v9 Z/ n$ y2 Q+ Fchar pong_buffer[PING_PONG_BCNT];+ c# t' w+ N* Z/ o& Z* j
; T% D2 U: M% \6 d

8 o) m( l6 h- B( Z% |6 L. X
7 @! p, B, q! R+ j: R' w
5 a# S) I3 w; S! i( }7 Vstatic void ys_edma3_init()
3 s. f$ W# C+ T! z& M! X/ ~{- [; x  Y3 J* z- [. ?1 B8 n
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( X  |& F2 C  H6 X( K5 [
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;7 G; O( p5 ?1 \2 K. U" H" q$ f" W
        EDMA3_DRV_Handle hEdma;
2 |2 t8 V# _' O) z. G    uint32_t chId   = 0;
7 m3 j  F. P" ~4 c    uint32_t tcc    = 0;5 @+ ~2 U! s4 z, V0 H% y- g

1 ?3 D4 T( w$ j! h) A  _7 A    print2arm("edma3 driver init...",0);/ q+ O: m, |+ ]3 l. f

* F) a. U, H! K& y( }3 n0 z% Z3 O* r        hEdma = edma3init(0,&result);
- z: L) Z$ D( ?# w+ R  F" |: k3 I        if(hEdma)
0 N+ d* \4 Y* ~6 k        {1 w2 J/ y6 U  {; U2 P* A
                print2arm("edma3init() Passed.",0);
' m, F  o& P& y, C6 s8 ^0 u        }
9 z$ I0 ?' A: m5 F  n        else! O* y! ]$ |$ J4 K' k1 ^2 g
        {
" \, v- \6 ~8 _: ~# |/ u                print2arm("edma3init() Failed.",0);
) M; k5 ]8 ^$ N  e        }) j# r3 C$ q7 X* ^7 M
        + i( K9 s+ O' Z$ o3 i7 E; |5 A
        if (result == EDMA3_DRV_SOK)7 Y- O7 \3 P3 w$ I# j; ?
    {; z2 J9 c( P9 A5 h# F
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,2 ]1 s0 u0 ]  T* p$ h! f
                                                       (EDMA3_RM_EventQueue)0,
& \" ^* D# u4 {" x3 t! d9 C" t                                                            &edma3_isr, NULL);
( |+ M1 z3 t7 L+ v) D. W    }
: {- b$ R/ }& K) |$ ^" e7 ?       
' H; m' H$ R% [        if(result == EDMA3_DRV_SOK): n$ K  N3 b( f) y6 K- {
        {1 o7 A, P" |, W. l2 X. v) U
                paramSet.srcBIdx    = 0;8 e. H! [4 ?! p7 d3 i* A
                paramSet.destBIdx   = 1;
6 o3 |/ G* A$ Y                paramSet.srcCIdx    = 0;
' U, Z2 \$ b. R$ Z                paramSet.destCIdx   = 0;% ~6 P9 h# U1 r  x' U
                paramSet.aCnt       = PING_PONG_ACNT;: Y- |9 K" D/ H
                paramSet.bCnt       = PING_PONG_BCNT;$ w" D; ]4 W5 N0 \3 O1 B
                paramSet.cCnt       = PING_PONG_CCNT;
; G" c" X, Q( F4 E, }; p               
  W" M% }: ^" g/ h( [; g$ y                /* For AB-synchronized transfers, BCNTRLD is not used. */
) C8 s8 B5 |+ K7 Z$ Q                paramSet.bCntReload = PING_PONG_BCNT;0 O# S( M$ ^+ g
" a' ?7 H& ?, J# @: i0 p
                /* Src in constant mode Dest in INCR modes */* {1 \  T4 ?6 D3 ~
                paramSet.opt &= 0xFFFFFFFDu;* h& q' L  z, G
                //paramSet.opt &= 0xFFFFFFFCu;& Z3 |" C  t! q% B" x6 R# x
                3 D. v4 N$ }( M1 D. l* K; y. j! `* u
                /* Program the TCC */
" r; [5 c. K) `/ f# x5 d                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
  k7 J8 S- G" |1 ~4 d5 \8 ^3 w$ V# W
                /* Enable Intermediate & Final transfer completion interrupt */# C" x0 S9 L6 _' B) C3 J
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: P4 p9 }# a- H) [1 R                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, j+ a  d, y% g% _

1 `5 ?" W6 k0 |) A+ S) I* D: Z                /* AB Sync Transfer Mode */
0 v  Z7 Z! @2 K% i- v3 o  v% w                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% R  A1 e$ `1 s               
, c$ K. S3 V2 d$ P1 k                /* Program the source and dest addresses for master DMA channel */; o6 \$ F4 h1 K7 ?, l/ T; P8 b
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
) T) V# B( C  z% n% E5 m1 u                paramSet.destAddr   = (uint32_t)(ping_buffer);
" E+ t1 h) {2 s5 T; [4 @3 t1 |/ ]! ]
                /* Write to the master DMA channel first. */7 N3 p. T) a, U5 ^
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);% e& v5 G! \" e) X
    }      
) X8 |: m0 ?5 B" L% t, I/ s% N3 M. c/ I/ u: O: ?+ r
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);; s- Q% m( e) ~" v) }# N6 U
       
( A2 k& T, C* Q) p7 I% a0 I# A    if(result == EDMA3_DRV_SOK)
$ ]8 g4 f7 U! e8 Z( o1 B    {
/ [$ U; |: Z: Q, l            print2arm("edma3 driver init success.",0);
) }6 e1 a+ N  I$ t; o    }
2 p9 ]0 M) m' Z/ _8 |1 M}
2 l; {$ W2 J2 k$ m
& M4 z' S) B% @" C/ Z$ f
6 a! `6 l& E% P/ u6 xEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 R/ _% Z( @7 E2 B
' a8 T0 R) }" `1 n& l, y0 J4 r
) {& r4 n6 @6 d1 K" h- x: V2 [
分享到:  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
0 F5 q5 X1 U" d( G2 }( [0 `" p每次DMA传输完成后都要再次使能传输

0 T1 w( q) n% a* a" I原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-2 09:53 , Processed in 0.037883 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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