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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* B3 Q" k8 o! p1 \
#define  PING_PONG_ACNT          1
+ [) f( k; s- k#define  PING_PONG_BCNT          8*32*40 ( H' V  q; O, ]- m% G2 v+ t8 X
//#define  PING_PONG_BCNT       1 1 X/ x/ K' V" Z% N1 F  z. ?7 M
#define  PING_PONG_CCNT          13 b) q, [6 i0 l. C& M5 I
#define  MCASP_BASEADDR          0x01D00000
1 X0 |  N( S# M5 p' I#define  Mcasp_RXEVENTQUE        (0u)
6 R& F4 H6 F, r( S) R( B3 h: f3 F# f' K0 T7 z
/* OPT Field specific defines */
3 |9 Z/ f2 V* J. u8 y1 t9 G( T1 e#define OPT_SYNCDIM_SHIFT                   (0x00000002u)% B, D1 g- S* M3 }- P( K
#define OPT_TCC_MASK                        (0x0003F000u)
; Q1 a8 ?. C! U0 L* U* R' x2 R) d2 v#define OPT_TCC_SHIFT                       (0x0000000Cu)( g6 `- t) q8 i% e
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)' x4 ?/ p+ R5 ]' @2 g" W; \; C" W
#define OPT_TCINTEN_SHIFT                   (0x00000014u)4 _) z/ R# E& g$ l

% F2 `1 t* C5 e: h3 E; Gchar ping_buffer[PING_PONG_BCNT];- g" O& l6 S% X/ d8 F) ?
char pong_buffer[PING_PONG_BCNT];
- `7 S8 u& t$ x
$ p* q( `2 {- G1 W, ~% F/ r, |9 j0 Y3 U: X0 C' u2 w
2 n/ A/ g% y, [' f* w
4 w- t/ P0 B# x6 ?. e
static void ys_edma3_init()# r+ I1 v8 P* J
{6 G0 a/ n5 r+ R
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ D3 v% @4 t! N7 F# ?$ f: I, B
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;, M- \* o7 `( W. g3 P/ ^! \
        EDMA3_DRV_Handle hEdma;
0 u/ s0 n# i; k9 q' m    uint32_t chId   = 0;) n9 B# A! F5 z" @) l) l) V
    uint32_t tcc    = 0;
) v% I7 l( Z6 I6 s. ?  ^2 w& j. n1 a" Q
    print2arm("edma3 driver init...",0);' W5 q0 |2 Q8 B

4 q/ s9 i: Z% U7 r) f2 q" k        hEdma = edma3init(0,&result);* L4 A# O7 I# A# V1 J
        if(hEdma)/ k3 \& ]; p: Z/ w
        {0 r1 j: t. E$ J2 n/ Z* G8 Y: h
                print2arm("edma3init() Passed.",0);
7 L! x; s" R& r; f  c0 S: u        }6 u8 c9 q9 y7 T+ q
        else
' @% ^; P# ^, L' X        {
# ^" T! T2 J1 l5 m4 l, q: |5 x; I                print2arm("edma3init() Failed.",0);
0 S1 j5 V2 w) L% R& I, d- K        }. B. c8 Z3 v8 o" b/ w. T
        7 b3 {. }* k: }8 [9 X  M( @
        if (result == EDMA3_DRV_SOK)% l. i4 _; Q2 f/ y, l9 a
    {  j- F+ Q  T8 m! C4 u
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,) w6 E/ h* n+ z) u
                                                       (EDMA3_RM_EventQueue)0,
, [! M6 e' |! D- \" T& ?4 W4 p1 ]                                                            &edma3_isr, NULL);
( l$ _2 ^# ~/ ]5 @: A4 A    }
- c4 V6 ^; z0 @  ^$ A7 f% B        % D1 l1 R: t# a. R" }' c, }
        if(result == EDMA3_DRV_SOK)" A* H$ ^) Q1 }9 E3 ~7 t- \
        {- Q/ g& Z" N9 J# Q2 a
                paramSet.srcBIdx    = 0;
' n, i$ D3 s4 L% F                paramSet.destBIdx   = 1;
% w0 S. h3 m7 H                paramSet.srcCIdx    = 0;
% K! |% j4 l+ S4 k- ^0 z" l% V) M/ ^                paramSet.destCIdx   = 0;
6 D- D- e; a* W, f" ]5 A; l0 i2 M                paramSet.aCnt       = PING_PONG_ACNT;
9 {8 J- w- C8 V: b' m4 V4 \                paramSet.bCnt       = PING_PONG_BCNT;6 @. @" |9 x4 `- [6 i! T0 G
                paramSet.cCnt       = PING_PONG_CCNT;
( O5 f: L! T& j4 w, z               
  U/ w0 k7 w) |9 r                /* For AB-synchronized transfers, BCNTRLD is not used. */
  \5 a  a; X7 g0 X; {1 B0 c                paramSet.bCntReload = PING_PONG_BCNT;. N% W* N1 J. t* a3 I, s

$ |5 W: ?( M( g, |5 z" g! z                /* Src in constant mode Dest in INCR modes */" n, Z6 B1 p! _( ?  F) Z
                paramSet.opt &= 0xFFFFFFFDu;
9 X7 d5 C! z- O% s6 D9 V1 C7 W                //paramSet.opt &= 0xFFFFFFFCu;  o1 J( c/ R* E& n: M0 x; ~
               
) I$ q0 S& M. s# m0 V  b  e                /* Program the TCC */
1 _* `5 O( j3 G/ [( p  E                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ p* ], A, i0 W" V
' Y9 H* J% d: s6 Q# W1 b6 m
                /* Enable Intermediate & Final transfer completion interrupt */# r6 I& S6 h9 z7 L8 e0 _
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, M- T! w/ z  M* ^, ], X( O                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 C/ S$ w" i5 C# q

! ~8 `8 {6 g! w8 C# E9 u4 e( M                /* AB Sync Transfer Mode */$ I" ]) L7 ^4 j2 y; f
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% O9 B/ ~0 T3 t6 {: E/ \               
( V0 a$ o: V- y4 s                /* Program the source and dest addresses for master DMA channel */$ k0 L5 L! c( c0 j
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
' t- M  r$ e; z                paramSet.destAddr   = (uint32_t)(ping_buffer);
! x& o8 ?+ t; K' g1 ^7 O. t# B- R
                /* Write to the master DMA channel first. */
% z; O6 k+ O  s4 C# g; F; z5 e: z/ B  n                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
- }& [8 B9 m6 Z0 G: _. r( }    }      
% ?% G( j1 w4 U1 @( v  X; B  P/ F6 i3 s. }% ~! U6 t0 m
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
1 k5 z2 G3 J( m& ?       
" s6 T* \1 Z8 w! N, Y! q    if(result == EDMA3_DRV_SOK)
. y& |2 m$ l3 P- ?* k# ]    {
0 a; l+ D4 S+ ?5 ^3 Y" C6 N            print2arm("edma3 driver init success.",0);7 {# @) O. a* T8 Q3 E
    }
9 E% X7 {9 }: Q}5 t: h" M3 ~# A; Q5 x8 Q% B: i. R

' q5 v3 f$ V8 \% c: l  @0 s' F) M9 _$ o7 I3 S  l2 T9 J
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 h; E1 F  [0 Y, ^5 F$ V. r  d/ M9 ?  t
( A; [7 E4 G/ L4 e) g! R' X! b
分享到:  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
/ z, o! B. O; O6 I每次DMA传输完成后都要再次使能传输
% D6 K7 z/ ~+ g
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-16 03:03 , Processed in 0.052886 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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