edma3中断只能进去一次 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; |9 I2 P, Z- p7 B
#define  PING_PONG_ACNT          1
* S3 y" x* B4 u3 E1 _- `#define  PING_PONG_BCNT          8*32*40
* r) P4 V6 w6 q* o# P//#define  PING_PONG_BCNT       1 ! m4 M- J, n+ r: v( l
#define  PING_PONG_CCNT          1  X$ E0 H8 x7 F
#define  MCASP_BASEADDR          0x01D00000
9 q& Y, i& ~+ u4 D- `# V5 P#define  Mcasp_RXEVENTQUE        (0u)8 C/ N0 j6 ]  S/ x( y/ v/ S
5 f# d8 j; U$ x, r  |1 T) `
/* OPT Field specific defines */
) _$ `7 q, E* B9 A$ x#define OPT_SYNCDIM_SHIFT                   (0x00000002u)1 M7 a2 Q6 f% [5 O
#define OPT_TCC_MASK                        (0x0003F000u)
4 t. V! w# a+ D; H5 v# S6 j) z) K  o#define OPT_TCC_SHIFT                       (0x0000000Cu)
! R! M, m% Y/ ?& [0 v#define OPT_ITCINTEN_SHIFT                  (0x00000015u)6 K! ?# W1 S4 q& ?+ @4 h7 i
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
0 @( a( z! {& V: j: s' Y& |
' X! b; v7 g1 ?, r! C# W" kchar ping_buffer[PING_PONG_BCNT];
& ^  q& m4 l" S9 c( w8 _; y) {  Echar pong_buffer[PING_PONG_BCNT];
7 O% a* ]$ i) @, I5 Q3 N1 f
* A; Q8 I% I) R" E* X
8 \2 h, X3 s: @7 Q- J, y6 n: [" H  A* ~# ^* S' l. [
6 ^3 B$ S% S. e, B4 B! @6 q, E
static void ys_edma3_init()* E2 d& a$ h( ~  O2 C
{/ Y0 D/ F0 d8 N' v
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: t8 k; A& c0 d6 _( ?4 j+ W
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;' S3 p$ Y6 O7 k1 Z2 Y. v/ \
        EDMA3_DRV_Handle hEdma;
" C$ ?5 W, g& R5 \    uint32_t chId   = 0;
) j( S! _6 k  Q/ \9 V    uint32_t tcc    = 0;
" B- g. G* C# E( ?) x$ Y- @5 D3 |* ~- J# |  b% H
    print2arm("edma3 driver init...",0);1 m& H3 ^/ [+ e

: L$ L& H8 a  q4 }& _' V" }# w        hEdma = edma3init(0,&result);
" X4 i: X' a! v( H) i. ^( Q        if(hEdma)6 I: J1 V& \" F/ ~& \# U* X: Q# `3 ]
        {
& p" B& v  D9 J) z: R) C                print2arm("edma3init() Passed.",0);
7 ^+ g* u2 `) A8 z        }
2 G. ?# `0 h5 a' V( h1 R  P        else( z, m" L# H/ b' \/ D
        {1 y9 I( Y6 |! k
                print2arm("edma3init() Failed.",0);
8 ?' k' G2 X0 ^; l) P        }) ]6 m3 G8 W+ Z) G
       
( M  i# `( [# E        if (result == EDMA3_DRV_SOK)8 o+ i3 k: `6 \. O6 I- U( s9 m1 U  z
    {
  o, i0 \7 j; @8 G/ i* \                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 l4 _! Q% q; q# b$ x2 q
                                                       (EDMA3_RM_EventQueue)0,
& \9 ?! U. }% i' s' v                                                            &edma3_isr, NULL);3 ^# c; l7 k3 l
    }7 K# V. E3 m/ ?* C
       
1 H+ B+ w5 A' n: h. }1 m0 A        if(result == EDMA3_DRV_SOK)( F8 k  b: y  I' G$ w4 B$ Z
        {
: ~- u5 w8 X+ n, v& O                paramSet.srcBIdx    = 0;
8 I  c$ t# n" i1 b0 x$ R% I) O                paramSet.destBIdx   = 1;
+ O) r- n2 R7 c3 Q, p2 V" u3 N1 h5 K                paramSet.srcCIdx    = 0;
3 i! \" M3 T' R/ E* s                paramSet.destCIdx   = 0;( ?) V0 m) z2 F0 M5 Y; f# C  w
                paramSet.aCnt       = PING_PONG_ACNT;
2 p* d, G! B2 U; F% u6 U                paramSet.bCnt       = PING_PONG_BCNT;! |* _4 v) ?$ R7 N- K
                paramSet.cCnt       = PING_PONG_CCNT;: S+ q- y9 {' K% L; ~0 n; g
                ; S9 n2 a) l7 R
                /* For AB-synchronized transfers, BCNTRLD is not used. */
& O3 ]. X* F1 y. B) D                paramSet.bCntReload = PING_PONG_BCNT;, L  e5 {  W# T5 Q- s3 q: X9 H  ]
& F% W1 [3 k* P2 Z3 |. f/ U- e
                /* Src in constant mode Dest in INCR modes */
0 {% U4 {  o; v                paramSet.opt &= 0xFFFFFFFDu;% e8 ?* A/ u& n/ k% W
                //paramSet.opt &= 0xFFFFFFFCu;
/ M7 S. G, I9 a                ' B4 [, j; ]$ z# z# B
                /* Program the TCC */+ i0 A+ _1 M; C* z" `, E# p" ~
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 f7 U& {3 D- [4 Q' t

. U. a7 o" d" l/ [& B8 p! ~7 B                /* Enable Intermediate & Final transfer completion interrupt */
, c6 x' G8 @4 V2 m( o                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);; S5 p! U5 a3 [  U$ K1 @. u
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ \6 X/ b! w9 ^
9 H0 A$ M( `& J& A3 A$ p                /* AB Sync Transfer Mode */
! u5 L7 ^/ U' N) j6 F1 {; J                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 g; ?$ s& N, Y4 g* g) w
                ' M' ]. B3 u2 \6 z5 j" G. U6 r
                /* Program the source and dest addresses for master DMA channel */' j" k6 Y- W6 ]; d' ?$ H8 D7 _( m
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
2 e! ^5 D, o- ]                paramSet.destAddr   = (uint32_t)(ping_buffer);: _' P$ u  N8 W# @( t7 G) \

- i, p+ [: B# Y* }                /* Write to the master DMA channel first. */
2 \" u' s3 y" q; h3 ~$ \' Y2 H3 t                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
3 _. b1 x5 M; H) z- P; c' @    }      
" H* f' o3 U* x5 B9 A! V
  E/ l& l# o  V" M        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);; C' V- d0 [1 s
        % i# o& j' U% d' e! E  O% r' y" H. A
    if(result == EDMA3_DRV_SOK)
9 M& T7 K* K9 M* S    {
6 l$ A" n! {9 c' y6 P            print2arm("edma3 driver init success.",0);
- c5 E2 Y" f5 A3 {0 G, ^5 j( |    }
2 t2 _5 m# s+ J. V4 n( }) L+ m* a}
' I7 n: u4 \  f9 u, T. X" g4 Q3 [: J$ x1 ?
7 E/ K7 j1 V) k, \& y% \9 A3 z* _$ q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。, a, x- e9 G# d7 W! c, @( m; h/ X5 P
% o: M: R) h3 A. t! d
0 c. R; g6 |" V0 n  s5 M
分享到:  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:478 d: D; y4 A0 a$ ?* K+ @8 j3 r
每次DMA传输完成后都要再次使能传输
7 v/ O! T% w' E6 x: r+ \- ~1 T0 y
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-17 16:21 , Processed in 0.050169 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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