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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:0 X3 d/ }% o& n
#define  PING_PONG_ACNT          1
" D3 s5 l1 B" R- r; G$ \- S0 E#define  PING_PONG_BCNT          8*32*40
, E8 F. N, H! K; E( j//#define  PING_PONG_BCNT       1 * J! U! y1 M  W& B
#define  PING_PONG_CCNT          1  |4 t2 \5 l6 Z3 S* \3 V6 g; k1 X
#define  MCASP_BASEADDR          0x01D00000
, W; @- p. O' I+ G#define  Mcasp_RXEVENTQUE        (0u). j4 |6 X* p1 n
' n" F  u; |" d, O6 P1 B7 f
/* OPT Field specific defines */
* G* y/ a8 P( v; \# S' H#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
* v- i8 k0 Q# j) A& T- C#define OPT_TCC_MASK                        (0x0003F000u)
9 r& D( \' M# j0 e#define OPT_TCC_SHIFT                       (0x0000000Cu)
6 F' ^: |9 |2 ]  _/ f* A% v#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
+ S! H. E% T0 I( B- j1 L% F3 ?#define OPT_TCINTEN_SHIFT                   (0x00000014u)2 y, C" n( C  h) m* E' {' I

& n2 A8 s5 r2 ^' wchar ping_buffer[PING_PONG_BCNT];) X( @2 ?4 G0 g7 S" t+ P8 v
char pong_buffer[PING_PONG_BCNT];
$ \5 z' c+ A- J! p; u
, r# a# F7 f2 M' U* F- s; H* s+ z! w: r6 W% y. w
7 j  R  p$ K. D$ k, w$ {, D
# Y9 F) {4 e" x* t4 e
static void ys_edma3_init()4 h' Z9 o# A5 [& M" r' `+ b
{; a" C# e" ~* F# J& `
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( n1 z' \( K2 N4 K9 u) W3 Y
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 B& L/ m, ~; ~: r% n% v. C! G
        EDMA3_DRV_Handle hEdma;+ }! t# d7 ^: |3 M+ Q' \3 }5 E
    uint32_t chId   = 0;  y* h( d9 S( D% b8 p* U  w
    uint32_t tcc    = 0;
6 }% y# W1 J  G" L; u, x7 q% d7 K- u$ u( h4 D! M3 p/ }7 {. f% R
    print2arm("edma3 driver init...",0);
- B0 }5 ?/ H  K( W$ O# y5 R! {2 n' B+ R0 Y5 T
        hEdma = edma3init(0,&result);
1 _/ c2 {# _: S/ x) d        if(hEdma)
$ C) F6 E" E& r        {9 V+ @* Y' @# v, E
                print2arm("edma3init() Passed.",0);
0 t7 G. d+ b* S# j        }
. ?. U/ D* V/ k3 _6 D7 a7 @) X        else9 [$ P" e0 w. E2 A- h
        {% n6 v) [6 S8 ?& U6 x5 Z/ F
                print2arm("edma3init() Failed.",0);
2 Y( F. k8 b# ]$ e% O" f6 v        }
$ T: R- ^5 |( D       
5 H: O; B( W2 j! _% E( X/ u        if (result == EDMA3_DRV_SOK)
- X! n4 Z8 r; {4 ]! ^' u    {& l& ?+ J8 u- a9 a; o( c3 B
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ ?" K6 {, N" o& ?- U+ ]                                                       (EDMA3_RM_EventQueue)0,4 X8 ^' g* Y2 g6 m5 B5 r8 ^
                                                            &edma3_isr, NULL);1 I3 J5 z5 \+ T7 [, d
    }7 s# q2 u9 W3 a5 j
       
3 b( m( f9 X6 V+ b. z0 L        if(result == EDMA3_DRV_SOK)
5 q5 A8 `+ H. Y/ h9 v( t! k' f        {
* D, h1 |* z1 P& d4 I6 K% l* `                paramSet.srcBIdx    = 0;
3 ~8 x- g. I0 n                paramSet.destBIdx   = 1;) e  Z/ f. Y* E" D: i
                paramSet.srcCIdx    = 0;5 J+ ^5 D" N0 Q2 Q! a6 K
                paramSet.destCIdx   = 0;% ^+ S% ]) a7 ]* u
                paramSet.aCnt       = PING_PONG_ACNT;
9 S5 H# M: L, h9 [7 {! x                paramSet.bCnt       = PING_PONG_BCNT;4 O8 V" d$ w, s# D, t
                paramSet.cCnt       = PING_PONG_CCNT;
+ l! W! A3 y) U$ ?               
: m  f$ c! Y1 b* F                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 z# {2 h1 A( M1 P1 J                paramSet.bCntReload = PING_PONG_BCNT;
# ~* P  \5 ?' C+ [# w" [  X) Y* [, d" z  Z' |& _5 |
                /* Src in constant mode Dest in INCR modes */
/ k; @; a" k1 d                paramSet.opt &= 0xFFFFFFFDu;
. y# t8 M7 z9 F$ J4 f6 a" |7 ~) y                //paramSet.opt &= 0xFFFFFFFCu;7 n& q1 f8 D2 g  E2 E3 _) U
                # _' G, y$ y2 w: ?
                /* Program the TCC */  b5 S4 d: ^- d, |4 F
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 U$ z9 S7 I: q! X" X+ g6 K3 G% U% f1 y) O) [
                /* Enable Intermediate & Final transfer completion interrupt */
! t. u8 [( Y$ f6 `' F7 m7 j                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( r  V0 {$ S  i/ j: ^                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 u* S$ g% C4 Z' ]
7 ?( s3 o, c: k* r9 C4 M0 P
                /* AB Sync Transfer Mode */% F& s3 Z" y5 K: j$ ?! V6 L
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( S4 w; u% K) x, t2 o                0 N8 r: v& E* G& Q
                /* Program the source and dest addresses for master DMA channel */
% I4 _* }% P( v- n( J                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);3 U, C  A: I( K  l4 Z) A
                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 a# f3 {" }, F: R
. I" H1 x9 J3 f$ o+ F5 g                /* Write to the master DMA channel first. */
7 q8 d2 @1 F( y4 }' _                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
6 z/ I& D# m, W% e0 A- W2 ^    }       # u5 C( p8 J3 ~- a

" C9 v  b0 N' t& U" J9 }8 ?1 J        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* |% E) k0 v0 h" I- R          R4 T( `0 b3 V/ U
    if(result == EDMA3_DRV_SOK)
" f. A4 y1 n. h" ^' E) E' \" O    {
; N% r2 q0 _, J% ?$ X! i# L            print2arm("edma3 driver init success.",0);
- W" X6 k, O0 q  X+ i9 y    }
& M: V  ?  ?$ p# T3 A}
& F5 z2 T( }3 K. @) v9 D  Y- c* I1 X  \; b' U; C  t- h! e
) O1 w, n* V! R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% O5 Q5 l: [' `' M8 W$ P3 k2 h# T( e2 V$ q9 {3 y

. a2 B8 }( K3 Y$ c6 t% I8 \
分享到:  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# \6 n3 D1 y* s9 E4 {0 M" Y
每次DMA传输完成后都要再次使能传输

8 G; h$ B7 ?0 `; \0 L! Z5 K; y原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-14 16:00 , Processed in 0.040484 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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