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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 `  Z$ g, U: B, s3 w1 i1 q4 w#define  PING_PONG_ACNT          13 |4 G( L3 E" ~' W) P
#define  PING_PONG_BCNT          8*32*40 9 Y1 U' l- ]+ t! b
//#define  PING_PONG_BCNT       1
) `) H" J; i6 [/ }$ R+ e- R#define  PING_PONG_CCNT          19 ^) S- t/ o7 C" R1 u- u' [
#define  MCASP_BASEADDR          0x01D00000
0 M4 _1 }: u) R' \# O% b#define  Mcasp_RXEVENTQUE        (0u)% F8 b- O$ m! N8 p
# s1 l! k9 \) g
/* OPT Field specific defines */. ^9 |+ ^8 r8 t6 T$ X- J' `
#define OPT_SYNCDIM_SHIFT                   (0x00000002u). Q, d+ w, ]5 w# p- p
#define OPT_TCC_MASK                        (0x0003F000u)" }4 |# e1 v. C/ O
#define OPT_TCC_SHIFT                       (0x0000000Cu)
  O' [, x; ?! q( D1 s* P#define OPT_ITCINTEN_SHIFT                  (0x00000015u)3 p! U& e+ G2 V6 t2 r7 `' z, L8 f
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
6 Q; I6 Z1 S; `4 j9 V. F8 W5 J) z0 M( U' C
char ping_buffer[PING_PONG_BCNT];* u$ g( H0 v) A: ^
char pong_buffer[PING_PONG_BCNT];# T' i% d# z* O) I% F+ N' Q0 C9 t8 J

" a" h* P4 j4 D  n0 z/ s
* x' L# ?- C# C: \5 V6 h+ h
: l4 J5 x( s, H; L& @% y, B& X
3 R- n- B# g* ^6 jstatic void ys_edma3_init()
% o6 t( ~- v* D{
! b& Y8 U' `& D5 T4 Y/ q- Z2 t        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' j! |! x" ~. F        EDMA3_DRV_Result result = EDMA3_DRV_SOK;" _8 }6 V- q! q& T2 N; R: z
        EDMA3_DRV_Handle hEdma;
! F( ~  ~, |  @; D- a+ a3 o    uint32_t chId   = 0;8 s# \) j3 O; c. |) t+ B" j( [
    uint32_t tcc    = 0;; G1 P! h* H5 n7 U$ Y' g
9 T; c- ^8 }9 F
    print2arm("edma3 driver init...",0);
/ P! F! F% ?5 R+ M! D0 W5 |
; c3 g% M: x* E$ n        hEdma = edma3init(0,&result);
& U( W% J- v$ U% f9 a        if(hEdma)( y  X+ q$ A0 Z; u* n5 `4 o7 @
        {
  |, F$ H: ~' ?5 {) d                print2arm("edma3init() Passed.",0);! F) G- D' k. i% j, r+ E" J* y
        }7 x' u5 }& ]" }  @6 o: n, H5 M3 R
        else
' M/ [6 [& Q6 ]+ o* e  t        {
0 H5 [% Q: c7 y# l/ {" Z( x* Y. c                print2arm("edma3init() Failed.",0);6 l: g; Q4 G) ^7 `4 a4 J4 ^$ ~
        }
; L' O/ x! m; s* S$ @       
  M$ P1 H1 Q0 y* \8 D% }3 m% R        if (result == EDMA3_DRV_SOK)5 Q+ f" `& p$ f" p7 M6 E
    {
3 b; u, Q. s" H( ~" V                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,8 s: {9 z1 E( h& S: W! X! v! y
                                                       (EDMA3_RM_EventQueue)0,
9 v" f$ }" p( H9 f$ N5 M1 F! s& L                                                            &edma3_isr, NULL);5 e3 b- l0 T6 E9 ^9 _
    }" _9 v' t5 }3 G! J2 _
       
: s% \7 m# x( h- A/ N3 e5 A6 T        if(result == EDMA3_DRV_SOK)5 U$ i+ u; U( P" S  v
        {  s6 _  }0 G& L4 p/ I; Y5 t9 O
                paramSet.srcBIdx    = 0;
4 R% F4 S3 b# b* H3 I: D( n$ U                paramSet.destBIdx   = 1;6 o5 s7 k6 m" R* K5 z
                paramSet.srcCIdx    = 0;
+ V& U1 ]5 j: N- T                paramSet.destCIdx   = 0;
. ^# V& D& G4 I7 k  o& r* j2 p                paramSet.aCnt       = PING_PONG_ACNT;
5 X% I( ]4 h4 y( W. @" @& H2 W- O; b                paramSet.bCnt       = PING_PONG_BCNT;
" V+ R0 j  G  n* x2 D                paramSet.cCnt       = PING_PONG_CCNT;% ]+ N& A) O: S* o) k
               
- R( Z! X& x* t# I3 o- s# I                /* For AB-synchronized transfers, BCNTRLD is not used. */! K$ k- o5 A2 ?6 K
                paramSet.bCntReload = PING_PONG_BCNT;
- b8 A, u8 z+ N8 _4 K: H( b
) `( Q/ u: Z6 ~3 R& L: j* L                /* Src in constant mode Dest in INCR modes */$ K* m4 U) {& T3 [9 j7 |+ |" E
                paramSet.opt &= 0xFFFFFFFDu;& T* P7 z, L2 \% Y( f
                //paramSet.opt &= 0xFFFFFFFCu;
2 U+ o1 c4 G+ H9 S; _- S3 w                  W3 r% Y. m! ^4 A3 V
                /* Program the TCC */
' g0 M9 k8 L. q: W' f& Y" r' W& {                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);& L- F0 d  }/ N2 C
! Y1 s4 p) m( B- c/ y
                /* Enable Intermediate & Final transfer completion interrupt */! h8 R1 n( q& Y: H
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, H6 m1 n& }3 C& F; d, o                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, ~( b  y9 t& G. s

. K4 w. k3 B( g6 b8 ?. c9 e                /* AB Sync Transfer Mode */
8 q& G, P9 J8 F" O* S7 `* m/ D                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 K4 v6 b5 b/ G2 a+ H9 n               
9 u0 K. b4 ~- S% s; t$ Z2 ?0 B% M                /* Program the source and dest addresses for master DMA channel */0 L; E0 _. b1 d0 [$ C" f
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
5 E( |  k. I! r' y  k4 q6 G' [4 H                paramSet.destAddr   = (uint32_t)(ping_buffer);
8 y- c' C( Q: c. M- {  Y( D
8 Y9 v+ n0 t7 A3 Y. t$ X& d2 I                /* Write to the master DMA channel first. */
: F# G8 l2 y/ H& r) H                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);2 t6 l, R/ J3 M
    }      
; l1 t, h5 R9 e0 \: B& L& b
  p6 `  D2 E* _( P1 u: g. Q        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. Q/ r+ g% [1 r( m/ t2 B/ c- b        * o; q. u0 l- b5 `
    if(result == EDMA3_DRV_SOK) . M% X5 C/ `% |( g1 b0 W) Q
    {
1 c3 p% x' I8 q9 u& n            print2arm("edma3 driver init success.",0);
3 T( [" i0 d# S    } 7 @2 c/ v! @7 t9 H. t
}
7 D* _1 R8 Q7 j; f( S( R0 w# }; f9 Z! s: t# z  ^7 A

$ C; U+ ]& [; ^$ q3 |  sEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ J. e& H; G8 N$ @8 c

. H* q+ s* N* a2 k: p. G9 b5 D" Q$ `7 _+ k6 ?0 Z! r  ?% S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
板凳
 楼主| 发表于 2015-4-29 23:25:56 | 只看该作者
Lewis 发表于 2015-4-24 10:47- }+ h. h- J4 s% L- Y3 N
每次DMA传输完成后都要再次使能传输

1 p  F& B, {" n+ n3 N% o( @7 H原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

0

主题

184

帖子

1137

积分

QQ游客

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-5 17:25 , Processed in 0.039444 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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