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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: {& T8 j' B$ r4 [; u6 s#define  PING_PONG_ACNT          1
! b: q4 A2 a7 p! b% g8 R8 _#define  PING_PONG_BCNT          8*32*40
) ?' m% m7 j1 J# @8 p//#define  PING_PONG_BCNT       1
6 n. f8 S  I( z8 `5 U3 k6 |; V#define  PING_PONG_CCNT          11 t9 j1 w% }/ b& m& |; j
#define  MCASP_BASEADDR          0x01D000000 O3 {1 \( Q! b1 o/ J( j! P
#define  Mcasp_RXEVENTQUE        (0u)
1 c1 S7 I0 U* x" S7 D+ ]
5 ?& a) Y- u, ?" `2 Y( y/* OPT Field specific defines */
7 x' s) s" O* L& U  b: _#define OPT_SYNCDIM_SHIFT                   (0x00000002u)9 b7 V7 J9 O( ^! R& Z% ^8 ?7 b! Y
#define OPT_TCC_MASK                        (0x0003F000u)
3 c2 l7 G$ f9 S# }#define OPT_TCC_SHIFT                       (0x0000000Cu)
9 A0 |. _4 `$ O5 w. T#define OPT_ITCINTEN_SHIFT                  (0x00000015u)1 O* Z) `1 M% u8 @$ X
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
$ t5 v2 ~4 _% d" Y5 p# p8 s0 B: j8 C7 j, I
char ping_buffer[PING_PONG_BCNT];
$ ~, v/ ]0 g! Q3 z# u4 S+ Achar pong_buffer[PING_PONG_BCNT];
: y2 h9 {8 o! u5 G
7 R* R/ {. N+ e9 l+ r
; s1 U* o: a$ R( e% D9 k7 W; J3 @- p) q. o2 w

; f" S9 E6 A: n. I( P  S9 dstatic void ys_edma3_init()
! t/ y3 @) `9 z$ ~4 u8 L' o{6 u, ^: F5 v  p7 x; D0 a* G5 q
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};) C1 r6 _+ l3 B6 R9 q6 I. _
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;! i  `2 ^- `  Q! ?. Q
        EDMA3_DRV_Handle hEdma;
7 L8 ]4 t! \" d. g    uint32_t chId   = 0;4 V' ?6 E8 T( i, w
    uint32_t tcc    = 0;- G4 G# o7 `1 P- |/ O' f7 r$ P
' j! ?9 n' a' w! Q- M
    print2arm("edma3 driver init...",0);3 [+ Q0 E6 l  l5 ^
+ ]$ _" ]" H0 W0 _  w. I/ p
        hEdma = edma3init(0,&result);
) T, @! a- L+ R6 w9 f% b1 N; _        if(hEdma)
6 E, F+ ^( v+ o3 I) i7 z& {/ u        {
, z) z9 m3 ~9 N# ^8 O+ D                print2arm("edma3init() Passed.",0);
: @  b6 R+ B( C        }) }: v; I( l) v, A* s* Z/ g$ }' L
        else
0 y! G$ D' j/ [* S* q  j# T; V        {! R' e6 ~5 ~7 V
                print2arm("edma3init() Failed.",0);
8 {7 V9 d$ I3 k5 A        }
7 W/ ]# F* @8 r3 ?5 @. A4 _9 _        1 U' y: K) d. U. @- i
        if (result == EDMA3_DRV_SOK)! v) L& d: R$ Y% _. _4 R+ o
    {
& R1 h& [- f+ b8 g1 c$ O$ f% g                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 o! q) h* P$ ~0 x% P
                                                       (EDMA3_RM_EventQueue)0,
5 P, G& t. b# ~  c; [                                                            &edma3_isr, NULL);5 _) D6 b1 b' W( W% a8 v0 V7 H1 g
    }
9 X5 j. h% F% {  u. j* m       
3 U, d3 |& X$ T4 |) Q        if(result == EDMA3_DRV_SOK)
3 k: n: Z# o4 k- L# e5 Y4 s1 g        {
- K3 V0 L. m$ ]2 C                paramSet.srcBIdx    = 0;4 @: F& R' s, s- C+ L# V
                paramSet.destBIdx   = 1;+ A( E' P4 }) w! y+ i
                paramSet.srcCIdx    = 0;& V3 J8 {* I: _& ]" L! H' C0 D# [* v" G
                paramSet.destCIdx   = 0;
" i) P; V9 a- e& E" o( C$ r                paramSet.aCnt       = PING_PONG_ACNT;
" m8 `5 D9 m) L9 ?1 N                paramSet.bCnt       = PING_PONG_BCNT;
2 t- l# C! d+ H* B% u: G  U2 t% y3 p) k                paramSet.cCnt       = PING_PONG_CCNT;
- B& y9 b7 f$ s9 h/ P* m4 X                . l7 L1 f5 @& Q
                /* For AB-synchronized transfers, BCNTRLD is not used. */; G9 d& `8 Q: b" U. Q* b9 o- K
                paramSet.bCntReload = PING_PONG_BCNT;
7 n6 X1 c& d1 V: F) F! m: f8 t( o1 a* g4 r4 v  ]- N8 [
                /* Src in constant mode Dest in INCR modes */
( v) I1 |( S' B4 j! U! K$ K% y* x                paramSet.opt &= 0xFFFFFFFDu;) u; q5 M. {+ }4 b
                //paramSet.opt &= 0xFFFFFFFCu;
+ r8 O; u& e* a+ ?; [( D                3 b; e9 Z( p, |+ f
                /* Program the TCC */1 }* J, H% M' D7 c7 b+ T' r( V- @( P" a
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);) `$ v9 |5 A! k! l  I
3 k) b$ s* ^# t& a
                /* Enable Intermediate & Final transfer completion interrupt */
% b+ L: ^) v& d- A/ V3 w1 x                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);" {9 p- \7 V7 V6 E8 n; w) p
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 Z7 I* e1 L# b; ~- G9 S4 _
7 C, t  _; ~. p
                /* AB Sync Transfer Mode */
$ N3 M3 |+ @( S+ L: L                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: e+ r. l# ?, ^1 M& ?1 e5 w
               
" i1 T+ Z( ^6 f+ U                /* Program the source and dest addresses for master DMA channel */
# ^6 b9 z6 a1 [& V9 q5 q$ r/ I; r                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ T- _& @2 l0 @+ X; c
                paramSet.destAddr   = (uint32_t)(ping_buffer);
9 v6 ?- F; n8 H! g0 e+ B; z8 g) f2 L1 c2 m, |" S! {6 K- R
                /* Write to the master DMA channel first. */
7 Q- @/ o, E* V( M; t+ G                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);) f8 I* f/ n9 J: I8 M" `
    }      
! J1 B2 P7 o0 j6 S5 e9 ~
6 o9 h  I; O( l9 v        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: l  e: a- Q+ B6 a; t       
  m0 |5 `- M4 S5 @    if(result == EDMA3_DRV_SOK) 7 u3 ^) i' J3 D6 M& Y
    {4 E: U. k! ]$ U: P% k2 O( f! }& o" z
            print2arm("edma3 driver init success.",0);! k$ p% w( {/ `/ O9 J0 d
    }
  T% ^7 \+ A9 n& |. o- o4 a) L}
- D- K" ^1 i1 J  g
& ?- y* X" `1 v8 }) j% I
# A" c/ b  i3 jEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# E0 P2 M( g. Q! x2 b7 Q* G+ C# }7 O# M# q3 w3 M1 `# w) H% P6 b+ N/ ^
" J* L6 W1 l; G/ o1 ?; K
分享到:  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
" B9 m- v& m# l: k, ~6 `  ]: ^每次DMA传输完成后都要再次使能传输

% R! V0 d! c" `, O' q原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 12:23 , Processed in 0.038468 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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