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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. {9 i  G7 {- y& e6 C7 @#define  PING_PONG_ACNT          1
3 Z( ~' Q" u! u#define  PING_PONG_BCNT          8*32*40 1 R$ ~- {$ q. V+ ]# w2 b& o
//#define  PING_PONG_BCNT       1 ; I! H; Q1 G! h) @4 K; R+ \
#define  PING_PONG_CCNT          1/ S" V) D4 _9 W" v7 Z( I4 z
#define  MCASP_BASEADDR          0x01D00000! \8 G1 [, N7 W/ q7 J
#define  Mcasp_RXEVENTQUE        (0u)
7 K+ w1 m* N. I- ^3 p& I7 ~2 t  B* I8 i  T. O, C
/* OPT Field specific defines */
2 Z! ?9 V: o  E( X: W6 p#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
; L, y2 c4 F- f) A( k: q6 T0 f( R#define OPT_TCC_MASK                        (0x0003F000u)
& u, l* J+ D+ s+ ?, z" l4 }#define OPT_TCC_SHIFT                       (0x0000000Cu)
9 Y. J" j: s# B$ s% I; N! h% [) r#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
6 \. O" s- }5 t#define OPT_TCINTEN_SHIFT                   (0x00000014u)$ J( c1 c. j8 W' \! K. t" Q
; q, H$ ~/ X- R* N- w% c
char ping_buffer[PING_PONG_BCNT];
0 W  C6 c  |5 z1 rchar pong_buffer[PING_PONG_BCNT];8 n6 {2 w3 J/ S

( d+ H0 @# U! n. k; Q. q7 @) `
' v& b( A' i0 Y! n2 f4 `8 u- q9 V( d( i2 o) @; s* Z

& w. j, s  M# [" n; e" V1 astatic void ys_edma3_init()
* f( \2 l5 k2 `2 M' G{' t0 [9 k8 b6 e: [. M1 ~
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: L, o' j, M( ]- W
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- K" e7 M+ {! `7 Y        EDMA3_DRV_Handle hEdma;2 c/ ~$ }8 ]! i9 R  J) [  a
    uint32_t chId   = 0;; v: Z) r7 w" _  g$ R, T2 b
    uint32_t tcc    = 0;
. e$ q  _  a$ ^% G! }
; O8 Z+ f7 s2 g: V0 z- v    print2arm("edma3 driver init...",0);
  a+ i3 U# E% s: ?6 {* p  d  R% a9 U; J
        hEdma = edma3init(0,&result);
2 g9 n$ X0 g& n0 l$ Q6 f8 G. d        if(hEdma)
$ c0 ]( h, Y( ?3 v: w1 ]- p* U* v+ O        {
1 s9 ~# s6 E! S5 _                print2arm("edma3init() Passed.",0);3 _, c# f" R# ?5 n
        }
- Y7 t- Z9 \2 R        else/ Q5 T( g  Y% k2 E% j( c
        {# C! z9 R) A9 ^# d8 r
                print2arm("edma3init() Failed.",0);
" n8 F/ M4 \. m/ U0 q- z- H        }
! d* o5 X0 Y# ^  }2 E) k        3 {. C, x! J( T8 p' Y- ^& a
        if (result == EDMA3_DRV_SOK)
5 x6 W2 |8 F' B  N' d+ o    {
- C* l( g% o* T, O                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
# q9 x7 V  C/ U2 _1 Z2 T$ C! i                                                       (EDMA3_RM_EventQueue)0,
  U" |. L' a# P1 J5 j                                                            &edma3_isr, NULL);
8 k* U7 J# K6 s& e  y) k3 g    }
+ b  @. c4 U5 N" L* j       
5 |5 |1 I& h0 K3 C2 L+ Y6 X        if(result == EDMA3_DRV_SOK)3 O& W0 C2 i" K
        {; o# q8 B( j; j! Q, ?/ D- S- @0 I
                paramSet.srcBIdx    = 0;
$ R6 H0 B0 r- @1 ^- T2 B                paramSet.destBIdx   = 1;6 ^% p8 N8 q& a* U. Q, Z/ u% M
                paramSet.srcCIdx    = 0;
0 W' b" L: X* ~3 y4 H1 R4 `0 G& R# h5 B                paramSet.destCIdx   = 0;# L5 m( n$ a8 G: |) y
                paramSet.aCnt       = PING_PONG_ACNT;0 l- x! Q; B* u$ g( `% L! s- A
                paramSet.bCnt       = PING_PONG_BCNT;
8 k# F6 s0 Z7 @' B! @                paramSet.cCnt       = PING_PONG_CCNT;; S& ]' W2 @7 ^" q" r9 g
                . Q( M# ~/ Y6 Q* {) G' s6 g
                /* For AB-synchronized transfers, BCNTRLD is not used. */  ~# G& v7 ^3 W7 {2 ?) o2 r
                paramSet.bCntReload = PING_PONG_BCNT;3 e1 p6 ]4 Q, l! n0 a) c" N7 n

9 ^0 @. `; m- f3 ^1 R$ R" m                /* Src in constant mode Dest in INCR modes */
4 q8 L, [) ~! E0 {                paramSet.opt &= 0xFFFFFFFDu;
7 I' A  w, e4 G: f1 _/ M                //paramSet.opt &= 0xFFFFFFFCu;
6 {9 S2 Z0 [' }                $ i+ q8 a5 z$ L3 v/ j) r+ i  a& [
                /* Program the TCC */
3 F) r' P: J/ x5 Z  K& _& [/ z$ k                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- y/ k- u2 m4 j7 q, B6 ^8 |
9 y  W# E; T* u, y4 q; f) B3 w. D                /* Enable Intermediate & Final transfer completion interrupt */) c' X" u% @2 m- l1 l
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 h, w4 ]) A& E- n' {; o; C
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 @3 H/ a& Q: i' N! q2 n
" q1 b6 c7 m5 i' c- V) K: D6 C- M
                /* AB Sync Transfer Mode */% z; j2 |3 a6 X+ j0 T- |! T$ P
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 o3 j6 l" e' F                6 |5 `) z! F; V& F, D0 z
                /* Program the source and dest addresses for master DMA channel */
9 ~) l9 s1 K7 E2 [) x  U                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);- D  F0 u1 \6 P2 d9 H' Z, D
                paramSet.destAddr   = (uint32_t)(ping_buffer);
/ u! Z  B- z7 N- J! L7 k* ?& H8 M5 F+ Y9 W. M
                /* Write to the master DMA channel first. */, Q- e$ [4 p- G
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
/ p/ T$ y9 A) O- ~$ M    }       4 Y9 o4 ?; q- d' f( C* l9 G7 ~5 C% X% t; W

2 L8 K1 Y# y$ b0 U) r2 z; c        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, y; {' S; h2 W8 A# B& U
        9 I! K: p8 W2 L4 c4 c
    if(result == EDMA3_DRV_SOK)
- W2 a$ Z" g0 X) H% q2 q/ d    {
, v, m! l% E3 m3 o2 r! d! F            print2arm("edma3 driver init success.",0);1 K; h8 X! [- }: n! S9 W6 V
    } / \& U; R% w) Y, S4 Z' O7 T" B
}
6 a. h1 y) |( S0 G4 U5 a, L% H5 ~. x  `/ ]+ t0 I) b/ a0 o  l4 _  H0 w  r

1 M; a& O  x. Q4 ~% B& M9 `2 E, s4 bEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 X0 N5 e4 P8 H( \$ m6 Y' L! j! f( t6 z$ K# i

% u: @: j( a7 N% z$ d- {
分享到:  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
5 ?$ }% @& [3 R( H每次DMA传输完成后都要再次使能传输
4 T: z5 G) l/ ^6 `5 [
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-19 10:25 , Processed in 0.044347 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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