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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' y% |0 |- }. H& o# z$ K9 L$ q0 ^
#define  PING_PONG_ACNT          1
! `& e$ a# \/ t! B#define  PING_PONG_BCNT          8*32*40 0 Y5 [8 G% ~6 H1 K' l
//#define  PING_PONG_BCNT       1 , \  Y" S" B% E/ F
#define  PING_PONG_CCNT          1; F5 p( L5 Y. I3 H0 Z- S# H
#define  MCASP_BASEADDR          0x01D00000
# q( e+ I$ m& k: Y4 w2 M6 S& c#define  Mcasp_RXEVENTQUE        (0u)
2 R( E1 z* s: M6 N- G( h# f0 y3 f* o: Y6 b/ ~
/* OPT Field specific defines */
4 J  d3 g3 V% [+ r0 ~) C#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( a4 N, F3 p9 q+ J#define OPT_TCC_MASK                        (0x0003F000u)! ]# t3 k4 I& u4 N
#define OPT_TCC_SHIFT                       (0x0000000Cu)
- @6 y3 c/ d$ T( R8 ?3 `; O4 @( e5 ?#define OPT_ITCINTEN_SHIFT                  (0x00000015u)8 \+ X! L+ ^! }' L9 L
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
- [( U# u# o& B% K7 ~6 k
; P/ i& N* T7 p% hchar ping_buffer[PING_PONG_BCNT];
! a0 v6 |; I; \char pong_buffer[PING_PONG_BCNT];. X2 Q# e% H9 D6 A9 u- e2 A
; i! K2 Q3 W: T8 p4 A0 a+ W# n

9 V" D/ W5 z3 j) B% K, Y# ]8 \/ M1 V0 v, p0 j/ g. t9 R
2 q! h6 q4 k4 b$ I+ \
static void ys_edma3_init()" C3 m" g2 K) d7 g5 Q0 W; X
{! m  H+ f% o2 G1 j& p' H! O/ \" r6 @
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& c  v$ A( R( q! }# @; t
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ M+ Q# f- H/ W' _7 t$ P
        EDMA3_DRV_Handle hEdma;- ]/ `. I  V# I! x
    uint32_t chId   = 0;
2 A9 O5 G7 ^# t; D    uint32_t tcc    = 0;
8 t* M1 T+ e# H, t/ C& L4 ~; r' p& l' Y1 p3 e3 Q! f- v- S5 r
    print2arm("edma3 driver init...",0);8 U) u; S4 _4 c  n& K, t

6 P# K1 _# g8 P- ^! J  w+ P0 I4 k        hEdma = edma3init(0,&result);
1 }$ i$ m% z; q2 e% g( L7 Q& V4 p        if(hEdma): I  \6 ~3 F* B3 n9 |& t7 Z, i
        {( F8 }1 M* a9 y( n
                print2arm("edma3init() Passed.",0);
+ o8 m& V  F0 H8 J+ ]        }0 g! U: S6 e3 u7 A5 s' V/ o
        else
- b2 V) ~+ u  e& f        {- N% B7 K/ }# p' q# z: I) L/ ^
                print2arm("edma3init() Failed.",0);* _3 v0 f- l4 e- e
        }5 V! ]3 F! v" r6 {) _7 j) Q3 f
       
9 J. i! i, X% b7 C% T/ C5 _% Z        if (result == EDMA3_DRV_SOK). a7 Q4 e3 h0 H  o4 ]5 c
    {
8 |3 m  W( t% Q1 Q% q+ a+ }                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 o6 j1 V2 O6 W3 Z2 V9 t! n4 m                                                       (EDMA3_RM_EventQueue)0,7 J4 V- D! O8 i# G: f5 ~2 G
                                                            &edma3_isr, NULL);0 V4 ?8 l$ J% B
    }
& T! u$ Z9 M4 q+ P1 m       
6 w8 c% l9 b! h9 d) g        if(result == EDMA3_DRV_SOK)* G- @7 ]% t# m9 S: P
        {
5 x% c; l  w7 w- O+ H. T  G+ ~                paramSet.srcBIdx    = 0;! d& w, B6 L. @. A4 c/ g4 ]' K
                paramSet.destBIdx   = 1;4 m* k+ U' p$ u2 t: u7 y
                paramSet.srcCIdx    = 0;/ |, X* @( u8 I% F4 C' j8 @
                paramSet.destCIdx   = 0;; p$ _1 g$ B7 P
                paramSet.aCnt       = PING_PONG_ACNT;. I( i% Y; i! D3 A: ^) t  X
                paramSet.bCnt       = PING_PONG_BCNT;
$ p, e+ y' o$ O  v0 D6 D& j                paramSet.cCnt       = PING_PONG_CCNT;
6 r5 l$ r  `0 G2 `" p                6 b0 o/ V$ R" I: V6 q! E1 y
                /* For AB-synchronized transfers, BCNTRLD is not used. */% l8 c8 B! }3 C0 j0 E
                paramSet.bCntReload = PING_PONG_BCNT;
0 Z; o+ E- G) z% F: @) H( K+ Z2 K) i$ K! c! ]
                /* Src in constant mode Dest in INCR modes */# v* N- z- T( M7 w& \4 u* ?
                paramSet.opt &= 0xFFFFFFFDu;) p# d2 ]- {) m; ?2 E2 g+ n
                //paramSet.opt &= 0xFFFFFFFCu;( @2 G3 j% S* y
                3 P2 ]' m% J/ v+ {2 R$ s; H) S- @
                /* Program the TCC */
1 E: w: N1 a, o7 Z/ P( n* V8 v                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ r! E" D2 n* x% b  N8 \$ I/ _

) e' J2 f. U" j: c) |                /* Enable Intermediate & Final transfer completion interrupt */
% b& S8 V& u& ~; S7 h! s                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, |2 x. Y4 c. ?6 N3 t; W" f  f5 E4 U
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. c9 z3 s1 Q6 \: o, v8 i- i9 x6 G1 h
$ d/ }2 u. S3 {8 C' X
                /* AB Sync Transfer Mode */
) I. ]; \. ^$ y" v5 y+ ]3 Y/ \                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 o. G3 ^5 g2 S+ s* l
               
4 m( S" b% v3 z/ W9 v/ k                /* Program the source and dest addresses for master DMA channel */
! v7 r& [. r1 T$ M0 I, x3 s                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);7 a$ Y: T; Y# w- v
                paramSet.destAddr   = (uint32_t)(ping_buffer);8 a+ J  n; r9 I& ~* e0 Y
7 F3 S. H: k4 ?  t
                /* Write to the master DMA channel first. */
+ y) i2 {9 \; b+ K3 W* }* V                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
; y: A: P2 C7 T( _    }      
! t! w! V6 v% O$ Q/ S; |
  M3 |6 h7 Y! e4 n6 w        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 r$ i! u0 u, e2 \4 @4 P
        ! }' i* \+ B  L, B9 M2 U9 u
    if(result == EDMA3_DRV_SOK)
+ w  z' T0 ^! ^% F2 x! P: Y    {
( K- ^7 S0 E, p" }' Y            print2arm("edma3 driver init success.",0);9 Q& {6 s( a- }
    } 7 a6 |$ M' a4 s# a( {6 u0 S0 y
}
* t6 m2 D; ]. Q5 W, h
1 L( F$ z2 Z: x  n8 v& j. n# x5 K$ G0 |, p0 d" O% w5 g, k3 [% r
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) u# a" m7 x8 `2 g( Z

1 k" r5 F9 c9 @) E3 H2 q( \7 i, `1 h. E# B" q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
板凳
 楼主| 发表于 2015-4-29 23:25:56 | 只看该作者
Lewis 发表于 2015-4-24 10:47. u- L) _; G" Y) O& r& t- f  j
每次DMA传输完成后都要再次使能传输
& j  u, Z1 }' O$ i
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 18:21 , Processed in 0.042323 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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