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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ S8 w2 m) y  t& [" y6 a#define  PING_PONG_ACNT          1
9 _/ d3 X+ e) A6 d#define  PING_PONG_BCNT          8*32*40
7 _; v2 v  v" Z3 c9 E//#define  PING_PONG_BCNT       1 5 s( ~* ~; [* W0 v/ C" g
#define  PING_PONG_CCNT          1
) D1 y  o8 H. b2 {2 z#define  MCASP_BASEADDR          0x01D00000, S4 O3 E2 f& ~# I
#define  Mcasp_RXEVENTQUE        (0u)0 K& k$ s$ z9 Z& D& H
$ U5 `! W# x  \9 G
/* OPT Field specific defines */
) Q# l( A! V  E8 V#define OPT_SYNCDIM_SHIFT                   (0x00000002u)- @" @8 K$ T4 G! ]
#define OPT_TCC_MASK                        (0x0003F000u)
4 |0 ?8 g$ F' o. a( H; t#define OPT_TCC_SHIFT                       (0x0000000Cu)8 ?+ C8 ~5 P4 i$ e+ O
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
% Q2 ^& B, t  E! e* {' ~#define OPT_TCINTEN_SHIFT                   (0x00000014u)( y6 }  B( l% _- h. y; l0 N  q

! ]; b0 y  ~8 `7 A! G2 Bchar ping_buffer[PING_PONG_BCNT];4 j2 o, E; }* G
char pong_buffer[PING_PONG_BCNT];
8 g( k: E& N, O& E3 b2 m) ]/ w" I3 m* j: J
3 T8 [. e% u, D" h) y& L+ [

: O6 G$ S6 Y; t1 B' k, `
' L* ?% o' i/ a4 {static void ys_edma3_init()0 T; l3 ~/ n1 [- S/ }7 F5 ?& _
{* h% E- I3 x; t/ G
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};2 U+ ?; P* H+ ]/ F
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 \. b3 f2 _: V) {; z% \; R( p0 r& Z        EDMA3_DRV_Handle hEdma;
6 y8 {3 w2 A( }    uint32_t chId   = 0;
$ w' u/ n0 A7 ?9 F    uint32_t tcc    = 0;! n% C1 `& y( m( p! q

+ g4 I+ h! X% T2 b0 r    print2arm("edma3 driver init...",0);) s' x* z: e; Z; x6 G
& }- b1 }0 g9 n/ M
        hEdma = edma3init(0,&result);
1 C' h. Z2 V" ~0 U        if(hEdma)
* a0 _  Y  N' I. d5 j        {
' e; C) W9 e8 W6 q                print2arm("edma3init() Passed.",0);0 Y. e9 A0 a: i5 `& c
        }4 O! E$ v- p& r3 q/ X# }- Y1 z5 H
        else
* u" }+ c9 r8 Z# l2 o        {: @5 Q2 b: y; w- n
                print2arm("edma3init() Failed.",0);' A: S# O6 E9 t+ \. _5 w1 F7 V
        }
( q; ^6 v& q% [6 c        ( v7 t( `- V$ C7 L3 S5 y$ ?  k
        if (result == EDMA3_DRV_SOK)% B) S6 y% j+ T
    {
; ?3 Y0 a" D' I; j3 i                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( A+ B( j- h/ O
                                                       (EDMA3_RM_EventQueue)0,
- ~0 b4 ]7 i3 S/ h                                                            &edma3_isr, NULL);# J3 q! Z% t9 v. q
    }
* E& }1 g5 l; \5 B9 ^3 j2 v       
: }0 F9 S' V) Y7 y# K        if(result == EDMA3_DRV_SOK)
8 B3 a; c7 a, G" C1 G        {2 W3 ~9 ]9 I, R0 C
                paramSet.srcBIdx    = 0;
+ c6 k7 h4 ]! E                paramSet.destBIdx   = 1;
  S' ~! Y4 U, x& E& p                paramSet.srcCIdx    = 0;5 ~# P* O. d* S. N4 p6 ^
                paramSet.destCIdx   = 0;
" x& v, u% f; q) o1 Y" p                paramSet.aCnt       = PING_PONG_ACNT;8 G- L$ i4 ]2 o5 O- J+ R# [7 B" d
                paramSet.bCnt       = PING_PONG_BCNT;
$ p7 e4 ~+ T- L2 O# q; g3 o6 Z                paramSet.cCnt       = PING_PONG_CCNT;
1 i0 P: P6 ^/ b, d' V- ^                ) [0 s8 @( [4 h( O& `
                /* For AB-synchronized transfers, BCNTRLD is not used. */
% F7 L( ]+ a) w, C                paramSet.bCntReload = PING_PONG_BCNT;
6 R& o0 A/ z& m5 j' a/ t( M1 W3 @+ }& d; ^' W* S
                /* Src in constant mode Dest in INCR modes */3 @4 h# Z9 }; ^+ A' E6 O% R
                paramSet.opt &= 0xFFFFFFFDu;4 x6 V0 c/ m% l3 _2 w4 C
                //paramSet.opt &= 0xFFFFFFFCu;/ Z' y8 e) t( z- f# |
                - j( T% h0 C8 t( o% d9 ]; q* P
                /* Program the TCC */
& j) s* H2 e1 h6 ]" b4 ~4 i7 h% Q                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! b4 j. o9 H. ?4 f
" ^2 A7 ~7 F* c" X                /* Enable Intermediate & Final transfer completion interrupt */- j+ Z  {4 T1 x: H7 ^3 V
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, j7 U& W# `( F! }" Z. w/ w4 X. l
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 m' d# X6 {( H6 Q7 d# w/ u% j: M- Q. L
                /* AB Sync Transfer Mode */9 ^3 V8 `" b( S5 _) c' l
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: G0 W" E% G6 d
                + |4 t% U- M7 |2 r5 }4 S$ h
                /* Program the source and dest addresses for master DMA channel */
1 ~3 {# r: Q# F2 W' f# D" u, c                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);4 v" h- R: A0 h. Q) B
                paramSet.destAddr   = (uint32_t)(ping_buffer);  M7 L, A8 A3 a9 i8 t8 Q
' P' H' N, |2 R* E1 h
                /* Write to the master DMA channel first. */
' i; s) D2 Q: \5 f' c9 c                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
: s+ }4 ^& z; |9 J. F    }         u# C: x  X- m  ?
' P9 e& P. _; C9 t8 Z0 l
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);* c9 s6 W4 d2 y5 w0 l  V! j2 Y* P
       
$ e2 _( D" K7 D- Y    if(result == EDMA3_DRV_SOK)
$ U* U) {/ t3 n+ P    {
4 ?) s9 v) ^3 \; q* K            print2arm("edma3 driver init success.",0);0 f5 O" _4 I& N1 \" ]4 Q
    }
% e& z/ F" E7 a+ P/ a, l}
/ k1 f% L2 Z/ s$ K' F+ S7 p% r' d9 I' B) G8 {0 }% Z
3 `3 R1 a* _4 v! B; f% l/ C# ^
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。; e0 u3 F: \9 P0 l: H

: U5 p: K- y2 w2 r! l6 I! a* G4 s9 |. v0 d/ B) 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:47- {3 l* r3 _$ I
每次DMA传输完成后都要再次使能传输

0 q0 B5 [+ E! Q5 h  E原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-1 22:28 , Processed in 0.048067 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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