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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 \- E4 c  N8 R. l3 b
#define  PING_PONG_ACNT          1
5 _. x. c8 ]( ]+ s+ e  N5 l; n3 O3 D#define  PING_PONG_BCNT          8*32*40
; |# {/ N5 M- O/ }//#define  PING_PONG_BCNT       1   X: P' |% u, s6 K& C7 q: I' _
#define  PING_PONG_CCNT          18 j7 g" s; M- h! ^
#define  MCASP_BASEADDR          0x01D000006 q" B8 O& s6 e/ ?) H& B: ?4 H
#define  Mcasp_RXEVENTQUE        (0u)
6 N% _. g, ]' o" v- n7 [
4 g' A8 L, {6 |- M) T$ C/* OPT Field specific defines */
9 y* _/ t" V4 G/ Q, ?- n  y#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
  i$ a6 z+ i! Z( B$ r" h( T#define OPT_TCC_MASK                        (0x0003F000u)2 O/ v/ i* [% D; L8 R7 L7 D# h  S; H
#define OPT_TCC_SHIFT                       (0x0000000Cu)
! Q  X& b" N9 m#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
( `3 ~0 g' ^1 L/ O$ {#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ o# @7 E7 m# G, j% a  z5 T
/ J+ o* M5 w& g0 M4 B. ~1 F. T, _
char ping_buffer[PING_PONG_BCNT];
9 B/ e" r' m1 q' M3 c8 [char pong_buffer[PING_PONG_BCNT];
7 M4 b$ |) E; b
9 \1 ?$ W+ f, S$ j' @/ v
7 r$ z  W1 B5 X  l( ^2 H( f
3 }" ?0 l& W: T* E7 f- l% C
# a; x! h# v2 x3 sstatic void ys_edma3_init()
0 w+ l% g; h, _' F- ]+ y$ |+ s{
9 Y. \3 c7 H% \6 q2 B        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" l/ x9 u; o# e: E* f* p( p* o        EDMA3_DRV_Result result = EDMA3_DRV_SOK;  M9 R9 v8 T+ z1 d2 U$ q
        EDMA3_DRV_Handle hEdma;+ B9 L. H* A* Q& D7 H' d" _
    uint32_t chId   = 0;! R( S  Z; C) O
    uint32_t tcc    = 0;
( _; C6 N0 _% i, {+ N
6 W# o0 w- S) Y) N9 l' C5 b    print2arm("edma3 driver init...",0);' h. W3 y8 f( w; r/ K( h

* M/ E9 z# m% d& |        hEdma = edma3init(0,&result);1 Q- U) }! F. r1 r
        if(hEdma)
# \7 u" u8 b% }% p4 e0 n        {
) ^& `5 |( U7 M                print2arm("edma3init() Passed.",0);
4 G& D1 E4 i1 i5 s: e2 O        }, w' V. o- J- a4 {. f+ d4 I, ]+ K0 n8 |
        else: e$ c6 w0 l9 k; f9 y" i, s8 d( W
        {% e( a' \; W5 s
                print2arm("edma3init() Failed.",0);
5 i( Z+ Y7 ?$ o& l        }3 f0 y: ^1 H, Z8 [) N$ Y6 N# _
       
  v7 u0 w* T* ~( o7 w4 @        if (result == EDMA3_DRV_SOK)
, p; b3 O6 X/ d) w1 b! d5 k' ^- z    {4 {  L$ `9 n) G
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ g/ b. x5 g4 s( \+ |
                                                       (EDMA3_RM_EventQueue)0,4 ]6 ?/ h- e4 O* F' m1 f8 p. `
                                                            &edma3_isr, NULL);
  v/ i8 ], e. C) w$ {    }+ v4 B6 s; X2 |# s& Z1 n/ g8 g
        / Q$ M6 J, t8 N; c
        if(result == EDMA3_DRV_SOK)
4 H; B: q5 p( J4 j( W        {
1 X2 P5 z8 B8 J) J2 ?8 I/ V                paramSet.srcBIdx    = 0;
9 a4 m7 P( E2 B/ o9 W4 b                paramSet.destBIdx   = 1;) k8 i4 |4 s+ i, i# K& W
                paramSet.srcCIdx    = 0;
1 W- X6 u* O8 d2 u- h; R5 ~( R                paramSet.destCIdx   = 0;  ]% Z" g! D/ O+ p5 e$ O! o
                paramSet.aCnt       = PING_PONG_ACNT;- ?8 U0 q) \. d6 ?- c
                paramSet.bCnt       = PING_PONG_BCNT;
1 T% j, h+ h* b# T8 K. H                paramSet.cCnt       = PING_PONG_CCNT;
4 y) E- ~% {2 I: L6 U8 l               
8 h  d0 h0 ]1 _' t2 l                /* For AB-synchronized transfers, BCNTRLD is not used. */  ~! m5 N! D0 z5 }
                paramSet.bCntReload = PING_PONG_BCNT;
, p7 ^$ U% X: ?9 L6 ?$ l8 X, g% T
! T$ x2 N  _4 R                /* Src in constant mode Dest in INCR modes */2 S' a8 j" {3 v' W; E; j/ D
                paramSet.opt &= 0xFFFFFFFDu;
- l; q1 M& M$ w9 X                //paramSet.opt &= 0xFFFFFFFCu;5 l6 k1 |8 c! ~$ E" M
                & s1 |- @2 X# J9 D
                /* Program the TCC */9 K1 t& g1 l  A+ F5 p
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);# z( `8 L: k# I+ B/ O/ U4 \5 z

& e7 d, K  y$ i9 `/ ^                /* Enable Intermediate & Final transfer completion interrupt */* ?) t: @( W, [6 g- ?- H' D  G) A
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 ?' Z5 B) ~/ P7 u4 K2 V$ o+ \                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. J( w) A: \% ?

  I. R, F% [  `% L. [8 Y/ _                /* AB Sync Transfer Mode */
* @; ]! i; H6 `1 f4 {( b                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# `2 q: ?1 I, n8 @4 E
                & x& T; F* J& \# N( W/ Q* ]
                /* Program the source and dest addresses for master DMA channel */
* x! i1 i& [. J: d" d                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
+ v1 J( w5 ~9 e                paramSet.destAddr   = (uint32_t)(ping_buffer);+ {0 ~* P: ~! f, \  G$ V' w

9 ^3 {' x% w* s/ _8 \( e                /* Write to the master DMA channel first. */* y/ F$ \6 a  _
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, S# ?+ B4 [: U( t. e
    }      
( u5 o1 r5 c$ [) A0 R" q; F3 c2 u, [: E* X* {( K7 L+ h
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; R8 y; b. @6 S9 v2 E- b! x       
! a6 y, B* T4 u* ^0 z    if(result == EDMA3_DRV_SOK) 2 f* S4 g# N# r4 S( y3 N
    {' b5 @4 Q% ?2 G+ u! W. I. Z
            print2arm("edma3 driver init success.",0);
# c8 Z( Y! e: b: q. |    }
+ m% U3 i+ w( L! Q; Z}
4 P* T& l- R, j- E( m2 w0 k; _4 S3 J$ [0 ^/ P9 V4 N6 |1 S# k

% x9 J' C; h$ NEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ P) ^4 l# {; j7 `) N  F

5 w- S) x% `+ |, J3 |+ I9 \& h) y( H7 q* ~5 E, A" Z8 K) F5 E: S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
板凳
 楼主| 发表于 2015-4-29 23:25:56 | 只看该作者
Lewis 发表于 2015-4-24 10:47, l1 v2 X1 W& ~6 l- H* B0 o% Z
每次DMA传输完成后都要再次使能传输

! T. \( v) W" l* O原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 06:55 , Processed in 0.036484 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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