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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, ]* S( T5 }8 P# P/ U& O6 |#define  PING_PONG_ACNT          1' J# u+ L2 j- |+ ]2 x
#define  PING_PONG_BCNT          8*32*40
9 ~  n/ x3 Z' d" Z3 ~# n0 D//#define  PING_PONG_BCNT       1
" L5 p+ A: D& w! h#define  PING_PONG_CCNT          15 k1 \/ ?* u, Y" G$ ~
#define  MCASP_BASEADDR          0x01D00000, _3 N% B" z/ {. O7 F
#define  Mcasp_RXEVENTQUE        (0u)
) A2 p1 @* p- k- P& V
5 u0 ?2 x6 l4 ~1 _$ q! v/* OPT Field specific defines */
% O" h9 l1 @2 l/ c; Q# q* S* J#define OPT_SYNCDIM_SHIFT                   (0x00000002u)2 ?) B0 @, @% n% D
#define OPT_TCC_MASK                        (0x0003F000u)
% N  w# d7 _: U' @8 ?6 w! V5 O. ^#define OPT_TCC_SHIFT                       (0x0000000Cu)
4 z% Y  ^& h0 I" n#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
: `/ A5 L$ N8 l7 ]( K; R4 k- U) l0 W#define OPT_TCINTEN_SHIFT                   (0x00000014u)) E% b% j1 X& l& [+ q4 z, R
7 r4 ~; x% O0 S( D0 z4 ]" {: q. b
char ping_buffer[PING_PONG_BCNT];" Y# g% L' r; N! a' o: P) B
char pong_buffer[PING_PONG_BCNT];4 q" k9 K4 [* t3 O9 x+ E! z" O
: Q7 b# q- _! z

7 L) |) s4 ^$ F) a1 W: P0 S+ J' e
. N/ m" B. c0 Z: |" s) c+ V" }! N) C9 a9 g0 q$ Y# ]% c$ d
static void ys_edma3_init(). n1 h; Y! B/ o
{
0 a2 V! M$ K6 X6 s  M; a        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* w8 o6 O; W% f+ P        EDMA3_DRV_Result result = EDMA3_DRV_SOK;6 M& n4 L4 @0 i# s0 U9 e
        EDMA3_DRV_Handle hEdma;0 ]7 ^0 {9 Y2 X) a
    uint32_t chId   = 0;* d) o; m2 l3 H/ K. h9 g
    uint32_t tcc    = 0;1 f1 X, z4 t" J1 p. ]$ a

/ l* z) N" H  H    print2arm("edma3 driver init...",0);
5 s9 P5 U4 o: z7 Z6 \1 o% U+ u/ [+ M
        hEdma = edma3init(0,&result);% O5 l6 A, a0 w/ I! a7 j1 d- i
        if(hEdma)# P+ F& T- m# o+ k) X+ X
        {0 I3 g2 S+ W1 H1 K4 P
                print2arm("edma3init() Passed.",0);
8 A) u6 [; _. ~4 u/ m0 W" _  O& o        }+ Z0 P# G* |' C% I$ y
        else- r& R; k, `! P- @# A& A7 v+ M2 i
        {
2 r+ K* [9 v5 a/ o* b& X  P                print2arm("edma3init() Failed.",0);
: d. t8 k$ L' J; s9 ?" K        }
: r" H5 |& j5 a. J# h        . b; T; a( d4 y; i. a' Y$ Q0 z! Y* d
        if (result == EDMA3_DRV_SOK)8 c3 f" b# V' n( {
    {
3 J% y" b( s( c- p- d                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,3 X  |) L: h) N7 [; m) R1 J1 O
                                                       (EDMA3_RM_EventQueue)0,
: p" S: C8 `) J8 w% R: g' p& U1 m                                                            &edma3_isr, NULL);
; `. n$ \7 W4 v) ^9 L& y    }
' {4 z; S1 Y* N' b        % g* N+ s" f  A# X7 _# l
        if(result == EDMA3_DRV_SOK)- n0 o2 d1 @$ L, b) J0 E
        {
# O5 S! Q1 o% C( d& a* L                paramSet.srcBIdx    = 0;
& l3 Q% ~& ]! T- O* j) E2 T                paramSet.destBIdx   = 1;
9 d" P, ^3 x0 ?' \9 T. m' g' D                paramSet.srcCIdx    = 0;
1 Y) q1 f. L$ Z                paramSet.destCIdx   = 0;
* c  L1 g- a, A                paramSet.aCnt       = PING_PONG_ACNT;
0 _$ x6 ]' a% d( G1 W6 ?                paramSet.bCnt       = PING_PONG_BCNT;
- M7 B8 W' X* N1 S1 N& H                paramSet.cCnt       = PING_PONG_CCNT;3 @* `3 X. [5 K3 M* w! g
                * x+ e: r! ?3 R$ r4 V
                /* For AB-synchronized transfers, BCNTRLD is not used. */
' D5 M( {% q/ y1 v( T9 c                paramSet.bCntReload = PING_PONG_BCNT;$ D& O5 R# e: b
/ e" l0 D+ K8 |# B- j- J
                /* Src in constant mode Dest in INCR modes */# k+ R, A4 G4 K3 O4 u8 w
                paramSet.opt &= 0xFFFFFFFDu;
( v5 T' a' P6 D1 h                //paramSet.opt &= 0xFFFFFFFCu;
; v  r8 x- ^8 i; C4 T               
( W4 s/ b: A1 X' m. T% p                /* Program the TCC */
: \  }# f5 R2 F# \& I                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);6 h" B  G- m/ ]9 e0 [) |" F

' u8 W9 F# O" K% u$ E                /* Enable Intermediate & Final transfer completion interrupt */* _+ ]" L$ ~- G# X* H" S8 Y
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. t4 t  [( n7 h2 P& s
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& I7 m2 b$ r5 m: {6 a9 i; P: W$ \1 o& n( J1 [: R, q. x
                /* AB Sync Transfer Mode */
$ E. a8 l( M5 a& @& V/ `4 V                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 z1 a! T9 D9 E$ [& f: p/ V( l               
& @/ F4 T5 U6 y! S- a8 ~( r5 Z                /* Program the source and dest addresses for master DMA channel */
: |( H/ |. t, h! h8 i9 g: d                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
1 u1 @& x1 {* _- z/ _" ~6 E                paramSet.destAddr   = (uint32_t)(ping_buffer);
; T# r9 P: ]0 w1 b3 y
5 C4 f$ W. l$ M  w2 |: W% f                /* Write to the master DMA channel first. */
0 h% _) ]: I5 L$ z4 G$ c0 X7 N                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
+ n. C$ R3 }. `: @    }      
6 N+ r/ f2 ^- h" M+ l
! h# B6 o1 I3 B8 ?' o        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);  N- M5 ]% o! M4 n& t# j
        6 Y4 U8 q% v8 M3 J: u5 i2 M6 O
    if(result == EDMA3_DRV_SOK) 6 k3 w1 Q6 }* z( w5 n3 A9 G
    {
' p% }& ]4 b3 T7 }* y. H            print2arm("edma3 driver init success.",0);
( v! X, e! o8 d2 `1 O: D    }
( U  \3 c2 S% B4 @. l}
5 M1 F9 ]1 ?8 K/ x& a- v1 M
+ I; `) V% `$ U7 t0 c9 Y: M
. W% Q% e' {$ n8 P! n' bEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 O$ q8 u% ]' m! J, E, g/ o. e5 m$ U0 L' @, s
) Z  C: X* t' H( W$ \' }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
板凳
 楼主| 发表于 2015-4-29 23:25:56 | 只看该作者
Lewis 发表于 2015-4-24 10:47# k4 T. k2 q% e7 f8 `) w: s
每次DMA传输完成后都要再次使能传输
; U2 d# V$ ?: X5 M5 Y
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-1 16:22 , Processed in 0.041986 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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