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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* O7 J5 o+ D9 y8 s- r) Z4 @#define  PING_PONG_ACNT          1
8 }7 h, e3 A0 Q  Y& w5 a' J#define  PING_PONG_BCNT          8*32*40
. n9 ^+ H# d5 k5 m//#define  PING_PONG_BCNT       1
  X4 K: }4 L! o  A#define  PING_PONG_CCNT          1' k. A' a/ J5 F; E% Q& |
#define  MCASP_BASEADDR          0x01D00000; v: h. d8 H. W, ^, h2 F. Y
#define  Mcasp_RXEVENTQUE        (0u)8 l8 |3 B$ s0 s1 k+ z" O7 D

0 F1 h5 e8 W+ I8 [4 C1 y7 m8 M$ h/* OPT Field specific defines */* ]; W  ~0 l' v2 E) h
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
% O8 e0 z* D6 A  Z#define OPT_TCC_MASK                        (0x0003F000u)' \' `1 X, i1 H# T6 E' e) D
#define OPT_TCC_SHIFT                       (0x0000000Cu)6 ^: |! ~- w, H
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)) b2 X' M2 Y, N/ o% D( P
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
8 v' o( R8 H! F. C
4 Y5 Q: c# h3 z9 y+ q( v, X  @) ?char ping_buffer[PING_PONG_BCNT];+ y) A; r2 X! ^, c6 P- ?! @5 U0 k3 L8 W
char pong_buffer[PING_PONG_BCNT];
( Q  X  y3 f, d. }& p. V" b! k; X& s3 R7 ^" W& D
9 Z1 h, v6 K1 ?0 J
5 }: c9 B% Z9 }6 [8 r8 a

6 m: ^# Q! A+ z$ z5 B' S% fstatic void ys_edma3_init()
! W! o4 z/ P/ x' V) ]$ {9 n{" _1 X+ f$ l, D* U* I
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& d: H3 a+ x% D# N7 ~0 m4 L+ I        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ q9 Q. g4 i/ Q  S% ]* j6 P
        EDMA3_DRV_Handle hEdma;
% g8 _) C" n5 X  G1 A" B    uint32_t chId   = 0;
! Y4 d% m+ v5 K6 b) U) _    uint32_t tcc    = 0;8 [& w/ B9 P& \2 s) [

) ]- F- f1 q  t    print2arm("edma3 driver init...",0);
) G/ P7 Y6 T. m3 U3 [7 U3 Y- Q6 g* Z7 r
        hEdma = edma3init(0,&result);
1 |& ^$ v. c, E) I$ ^! B8 O; b        if(hEdma)
6 y6 i- Z, i0 |, B        {
% A* o3 s& |9 I* x. I( m                print2arm("edma3init() Passed.",0);) w0 j6 I# E( v1 r3 T' y
        }
; Z  Q8 b0 e" z. d; d1 ]% ^        else
, x( x& L) S. N* y9 s9 a) Z1 _        {
; s6 J! G) \5 C7 x, B6 H2 z# q                print2arm("edma3init() Failed.",0);
/ t, v+ L% x, a7 l9 n        }0 }/ Y* e) A2 E% b; z
       
2 V- r! M$ ?! f+ c$ @        if (result == EDMA3_DRV_SOK)
0 i& X* T; T- l; F* b' P    {
6 J* K4 f4 t4 [( R9 x                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,  Z. r# ^% P' _- V: S  W' ]( Q
                                                       (EDMA3_RM_EventQueue)0,! p: o- w: f- e( V. m( c2 Z
                                                            &edma3_isr, NULL);
- N3 }9 J9 ]+ C2 J; w/ T0 e1 `    }
, H7 }2 {$ S8 s' W6 I! E( i          Q! b# I( q) k) j, G
        if(result == EDMA3_DRV_SOK)
2 [8 ]5 ]: Q$ u, Q6 t! A3 h        {! ]  t3 U4 m5 j  C
                paramSet.srcBIdx    = 0;
: e9 x( f; Y# b- d                paramSet.destBIdx   = 1;
4 T3 q" y/ B/ v9 B6 Y' l7 s: K                paramSet.srcCIdx    = 0;7 f, Z& S7 l6 F5 e4 ]1 ^
                paramSet.destCIdx   = 0;, o3 N/ u) s. L+ v/ p+ U4 X9 o. s
                paramSet.aCnt       = PING_PONG_ACNT;
3 H/ s$ _' ~! q1 {& u5 F' _/ k                paramSet.bCnt       = PING_PONG_BCNT;4 z8 }% C) g) U& G" X: {
                paramSet.cCnt       = PING_PONG_CCNT;7 G2 g- v4 S9 E# ^) v; {4 y
               
0 O/ N" j1 }7 Z3 |                /* For AB-synchronized transfers, BCNTRLD is not used. */
) g! [. a4 c  u  \/ W  n! R                paramSet.bCntReload = PING_PONG_BCNT;5 |$ m/ i, }- I$ n" P# ~, j4 {

2 ]/ R/ [" y) A" [$ _/ J5 {                /* Src in constant mode Dest in INCR modes */
2 j' r( z' x, A  ~) g                paramSet.opt &= 0xFFFFFFFDu;
4 j! ^7 \7 I+ ?1 X6 A. |3 w                //paramSet.opt &= 0xFFFFFFFCu;# z: H- f( i0 ^9 `+ m9 ]/ F
               
" [# Z- o6 t, ]- G' T                /* Program the TCC */
! C! Z* \3 K+ @* |# B) \                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 s) H) b, p7 ?5 o" t1 D" K9 }7 ?7 a7 c. Z. n4 j, S0 Q
                /* Enable Intermediate & Final transfer completion interrupt */  I  h" F7 D, O+ E
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);) j& P* d3 w. Z  _  y* x2 Y( w  X
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 _6 m' k/ E. T+ J
: d# M7 Y: `9 D# }% u) I
                /* AB Sync Transfer Mode *// Q- \$ t# O( w+ B9 R' s4 @% Z
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);9 F- ]5 W* f; K1 Y( Y& [. _
                * G1 `% W9 T- h) Q; V0 n+ \
                /* Program the source and dest addresses for master DMA channel */6 J" ^; }$ U# U) P
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
2 I' `5 _; N+ h" n                paramSet.destAddr   = (uint32_t)(ping_buffer);; O' l8 b. Y* A4 j
6 N/ L& C0 w5 i, V# ]" b3 @
                /* Write to the master DMA channel first. */
; O, H' E1 S4 y+ y* I( I# _0 F# a                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, j5 K$ t) K. i. ]& P0 j6 D
    }      
! B, U8 M5 r0 A  d1 K, d- b7 q* C; t6 T+ a) H% d0 F( L
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 r6 P$ a$ w4 H1 t% Q) m        : z1 ^, g" `# j: E1 y
    if(result == EDMA3_DRV_SOK)
& L/ E. b+ q. Q3 x5 n0 S    {6 a; G6 M: D. |9 d* f4 W
            print2arm("edma3 driver init success.",0);$ i8 c( d& E3 n" J
    } 1 x3 W. [8 D, J* e
}
4 P+ a# L9 S1 m5 g1 }1 k; a% O4 I6 E5 E

+ g" l7 J; q5 q# w; A0 xEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* v+ @5 b1 @3 X- a( _# k# I+ A, M' A+ j! ?3 F  `4 o5 g- s: l
3 [3 |% |% a7 u& y7 h# R4 p2 z6 ^6 |
分享到:  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
7 I9 R# G/ b) Q每次DMA传输完成后都要再次使能传输

  Q1 z4 |5 N6 F6 s$ U& a6 ?6 T  j原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-18 08:15 , Processed in 0.039312 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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