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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ V8 n9 ^% k9 L# g( P5 v#define  PING_PONG_ACNT          1# ^0 V4 \) [8 r& y6 c) X
#define  PING_PONG_BCNT          8*32*40 : b1 U0 A9 N$ M0 U- }7 |1 |, }9 N
//#define  PING_PONG_BCNT       1
$ I* N5 @, `1 d#define  PING_PONG_CCNT          1
+ s7 e/ w2 F$ n2 h7 q#define  MCASP_BASEADDR          0x01D00000: X$ J' `. G" I2 q' c( r; t/ F, j  h9 A
#define  Mcasp_RXEVENTQUE        (0u); l- D$ b: p6 Z3 X' u: B/ x

1 N$ k, J9 C6 z: |! p( A5 D* C/* OPT Field specific defines */
8 l; t) A) D5 R/ f; P6 W% X#define OPT_SYNCDIM_SHIFT                   (0x00000002u)" L) H. [: t: L* |# ~
#define OPT_TCC_MASK                        (0x0003F000u)
! f' I5 f$ y5 Y; \/ ?#define OPT_TCC_SHIFT                       (0x0000000Cu)7 N8 g; x& x* D5 y4 L9 R1 K! X5 ?& ~
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)& b* u9 X  ^. @2 i  O
#define OPT_TCINTEN_SHIFT                   (0x00000014u)) X. i& R( h& ?7 m/ D
" _4 ^; w% i6 Z) {- [; a
char ping_buffer[PING_PONG_BCNT];
  V( a) W7 F7 S. l+ Tchar pong_buffer[PING_PONG_BCNT];
: Y) ^* t! I, e" f6 @( N% X% h3 I' g! c% Z

: A' @) X+ }$ S1 [# ]" {9 n# T# g$ d0 v# m0 o3 c" h2 r$ I

; n5 p0 i- i" o9 I- x3 m3 ]static void ys_edma3_init()2 }$ K, E" H' _: G
{
. T  K* T" m! X4 N- Z' q        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% M. i6 u9 u7 e% r        EDMA3_DRV_Result result = EDMA3_DRV_SOK;) r, S- _+ }$ Z" c) Q  Q
        EDMA3_DRV_Handle hEdma;
( F9 d, g8 B% B+ ?" m    uint32_t chId   = 0;
5 f; h  H& }; p+ P$ ^, z) D    uint32_t tcc    = 0;! }5 }4 E; K  W0 V- }- X. d. w9 }

7 j) C! m1 R* X    print2arm("edma3 driver init...",0);" B8 K6 Q5 N2 n9 L% i& a

, V/ F7 X3 L8 g        hEdma = edma3init(0,&result);! ^8 z+ i, ^/ _2 ?- J. F
        if(hEdma)
+ ~3 C/ @+ Z$ ]- B$ v, f  ?        {9 B: H) l' V( S
                print2arm("edma3init() Passed.",0);& o$ N: Y" c) |- U6 G( m* h6 f8 e7 _
        }' u* s7 ~3 O0 O) b3 k5 ]
        else
( W9 ~& c4 ?: k1 ^& Q        {
9 U4 H7 ?3 j$ n& S4 q# e                print2arm("edma3init() Failed.",0);
' Q1 B4 _! D9 D$ w, p        }$ ^5 ~: l% M$ }; q
        - I, R2 E/ |8 o6 l
        if (result == EDMA3_DRV_SOK)
+ h6 @3 F# N% d8 e7 [    {
2 `, i  o- Z8 }                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
  I" W; V7 ]# h2 m* O8 o                                                       (EDMA3_RM_EventQueue)0,, W$ [* S! f% ^* w
                                                            &edma3_isr, NULL);8 Q/ F; l+ C8 e
    }, Q9 C7 m5 k% y! O2 K8 n+ Z
       
% g) ]; ^! z0 g) e, M        if(result == EDMA3_DRV_SOK)8 D& ]9 X; g- s# y5 `
        {
7 |1 }8 S) Y) e6 s                paramSet.srcBIdx    = 0;# Q% y6 I% u* P  o( S* {$ m; R
                paramSet.destBIdx   = 1;
5 s% x( [2 }" c$ J; L# o) h: T                paramSet.srcCIdx    = 0;
. w. r1 J- d/ [/ c; p                paramSet.destCIdx   = 0;
% g1 w1 V0 C" e6 ]/ P5 w                paramSet.aCnt       = PING_PONG_ACNT;& B: J2 j% _1 U8 d: \5 a
                paramSet.bCnt       = PING_PONG_BCNT;
' a2 z$ h1 G  D6 }' ~! ?                paramSet.cCnt       = PING_PONG_CCNT;. H! ]9 M9 P* X5 b
               
! D2 x3 L+ `6 A" ~                /* For AB-synchronized transfers, BCNTRLD is not used. */
1 D: d4 Q7 L% e0 h$ y8 Z" {                paramSet.bCntReload = PING_PONG_BCNT;7 i( ~: X" \& S
( P. j+ J7 ?. n/ B1 v6 E* x
                /* Src in constant mode Dest in INCR modes */0 l# F4 A- j& m2 i& a2 f% w$ [
                paramSet.opt &= 0xFFFFFFFDu;: h1 z" j- E" \, \0 Q* T
                //paramSet.opt &= 0xFFFFFFFCu;, z. y* D" m  F- n
                4 M/ a( z* n* k: i1 u) ~; \
                /* Program the TCC */
0 C$ I1 u+ y3 L8 B                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 ~' J6 E" P9 B- D+ k

4 B7 j. [# g1 N% I  [6 j, V& v5 f                /* Enable Intermediate & Final transfer completion interrupt */: {4 y9 ~7 o* l/ b3 y7 d& L
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);& U! P: X& p0 p4 e; `
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 G9 l7 y2 H2 O2 h* ^( J  u
* J& y$ q) x5 }                /* AB Sync Transfer Mode */) o; \5 V: o* K# k2 n' Q
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
6 {1 z# n' v  f& `0 C                6 y- h8 |5 ^( ]& t
                /* Program the source and dest addresses for master DMA channel */' E0 j% o. c4 s7 j
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);; Q+ Y& ~! `" \% }7 V# h$ \
                paramSet.destAddr   = (uint32_t)(ping_buffer);; L+ W% W3 r) u2 Q& d! c

! m2 f" N# E3 {                /* Write to the master DMA channel first. */
0 D0 v7 v* O4 o0 c8 h                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
4 e* Q9 E  {8 r0 \8 ]    }       ( d/ P5 C, L4 `0 D( [! D
' M5 i6 V0 H3 O6 r/ h. e% W( F9 r
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 o3 J  Z7 a0 r% K# R( _0 X        * ~! {, F# O$ k$ N6 S
    if(result == EDMA3_DRV_SOK) ; v, I+ Y  x9 F
    {4 h! X2 d+ \3 D% y
            print2arm("edma3 driver init success.",0);
8 [8 |$ _# p0 d6 q4 @    }
  y/ I0 O# M* {( W, c# C}
. x, I; D% H7 f3 _$ I' o- |* A- H0 }  E

! m: Q$ \* m4 \  o4 n8 S& s- rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& D) N  z6 }3 M6 d; w

( u  L5 ~+ Y, @
0 r. g$ _, x" F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
沙发
 楼主| 发表于 2015-4-29 23:25:56 | 显示全部楼层
Lewis 发表于 2015-4-24 10:47, A) U$ P6 f0 ^
每次DMA传输完成后都要再次使能传输
( w( v0 b2 p% V& X- D  j/ Z# W
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 13:44 , Processed in 0.036853 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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