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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 ?, l: B+ W, B; ^3 ~! |#define  PING_PONG_ACNT          1
: {7 v% ^8 {7 ^! t0 F#define  PING_PONG_BCNT          8*32*40 : c  E" \+ {9 n: u
//#define  PING_PONG_BCNT       1
9 O* ]. p) t4 |5 R2 v/ R#define  PING_PONG_CCNT          13 Z  y( |  ~% o  K1 X# m
#define  MCASP_BASEADDR          0x01D00000
( X3 e1 [$ u0 |2 h! V#define  Mcasp_RXEVENTQUE        (0u)
- _3 f+ }0 i3 t( f8 ?6 ~0 g7 M2 H
/* OPT Field specific defines */
: W( B8 j$ L# i/ k#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
) ^2 _: W# r# H* b+ L#define OPT_TCC_MASK                        (0x0003F000u)* d6 e; T' y& d( h+ v) J- H) r
#define OPT_TCC_SHIFT                       (0x0000000Cu), w  r: X" d+ {2 s
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
! I' @7 H2 H& a& ~#define OPT_TCINTEN_SHIFT                   (0x00000014u)
9 A# @$ [9 k! X6 \1 A8 ~5 X: k; B  _1 ]
char ping_buffer[PING_PONG_BCNT];
: f+ W4 i" `% U$ Q+ Xchar pong_buffer[PING_PONG_BCNT];
! N) [4 Y1 L" V' ^" ~% O
; N$ ?0 {3 x; k
7 a# `& m( I. x& @& c- J8 F% p& w0 z+ _) E
! L. A4 `) c9 m% W
static void ys_edma3_init()  k7 n7 k5 ?7 m7 U5 |4 o
{
: d, U2 s; _$ C: P7 R4 K        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ D* O8 l) i; j6 U        EDMA3_DRV_Result result = EDMA3_DRV_SOK;* L! ?( C/ `; G+ s) N" y7 v
        EDMA3_DRV_Handle hEdma;4 v/ Q8 o) f! F5 W6 W
    uint32_t chId   = 0;5 U& i& S, w& h; M
    uint32_t tcc    = 0;
& [' T, I9 q* w1 F
$ |! D! b# y( k    print2arm("edma3 driver init...",0);6 ]+ m$ @# j9 s$ W1 I9 m

" b. T; ^9 w7 o/ F, m2 j        hEdma = edma3init(0,&result);
; a6 A/ Y3 b1 _' b        if(hEdma)
7 O: g. ~9 s- t' o# G9 ~        {% N* ]( g. m0 h' K* ~! V* D  T: @  O
                print2arm("edma3init() Passed.",0);4 B+ J3 X8 Y6 H* v
        }# o4 j4 H1 [4 ~' q5 y$ |
        else8 s2 u8 d8 j, a3 C
        {
6 _0 Z9 t: B2 v& L$ f6 ~: \                print2arm("edma3init() Failed.",0);
1 F# b; z; D" T1 ~- W' `4 m        }8 ]9 [$ B8 r& N, c3 l
       
* l4 Y2 g* j& A& ?        if (result == EDMA3_DRV_SOK)
; u5 g/ `1 j) m  z9 m4 p* e    {, w" x  [) I% [5 D
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) J1 W. t+ z+ u' k) w) \% h4 X                                                       (EDMA3_RM_EventQueue)0,
( v% W5 N& `7 G9 m/ g                                                            &edma3_isr, NULL);
3 u' T- [+ S& k! V    }/ S$ J* \1 ]8 \4 X9 X, i6 Q. A2 B
       
. e8 T% L8 B0 j4 E3 G: X& \" k5 a        if(result == EDMA3_DRV_SOK)6 y$ Q; ?' i. ?1 x% i. g6 i' _
        {9 _- Y. o/ }8 P  Q1 T* o
                paramSet.srcBIdx    = 0;2 Y7 D# y* C  m
                paramSet.destBIdx   = 1;3 v5 ?8 k! i- W2 o) ^
                paramSet.srcCIdx    = 0;7 E2 ^" N7 c9 L$ W4 A- M7 {
                paramSet.destCIdx   = 0;
" K. {; b8 |1 g. i                paramSet.aCnt       = PING_PONG_ACNT;0 ?% o2 Z( K. B6 ~
                paramSet.bCnt       = PING_PONG_BCNT;
& d$ g" N( F, v; U$ j! f                paramSet.cCnt       = PING_PONG_CCNT;; M5 W" M$ K( h1 K9 k& ^
                1 V& j, J# Q5 b  Z1 ]
                /* For AB-synchronized transfers, BCNTRLD is not used. */
0 r0 F; w7 K9 ]: h* F, s' I6 q                paramSet.bCntReload = PING_PONG_BCNT;
) G/ a5 R% L, b
! d5 B% H& p( V0 d                /* Src in constant mode Dest in INCR modes */
7 I" }2 C3 K& S# _% f( m' D                paramSet.opt &= 0xFFFFFFFDu;
" R# `% L! A8 d! _* [: y! k                //paramSet.opt &= 0xFFFFFFFCu;
, L- ]0 B' W$ Y% u. M' L                & C( A, H  D1 a. @7 v
                /* Program the TCC */" x8 U2 |! Y( G6 a* c& D& m
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 T& i' i" |8 r/ W# F
7 N8 y! n( v0 l# F5 x                /* Enable Intermediate & Final transfer completion interrupt */
* u+ I, L3 J9 s1 L                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 U7 X) Y- x4 Y. v* Z! q$ Y                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 e+ y" N! ?% B+ G, p# u
  O0 D, ]% r; Y8 P                /* AB Sync Transfer Mode */
% j# k* s8 i2 _  q                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( z/ o0 @4 \/ n8 c4 m! ^) B+ g+ O                4 y) \/ R* o- c# t2 }
                /* Program the source and dest addresses for master DMA channel */0 _6 D- i. A0 p8 w, R7 g1 O
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);, |+ s) N1 T3 `# K% ~$ Z1 _5 |
                paramSet.destAddr   = (uint32_t)(ping_buffer);
: T( O2 P2 T# {, M, P, n9 D6 G2 D1 S* E+ |# _: k
                /* Write to the master DMA channel first. */
, t1 l3 C  Q6 M7 `  ]                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
' O+ F5 F1 A0 e% ]2 b0 D    }       : c- r, [$ ~( A, \

) D4 v% L9 {# K; [8 B        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 a# {4 x/ ~7 S0 h) z. b. G
        2 n/ }$ E8 `% @# L, b- R
    if(result == EDMA3_DRV_SOK) , x9 ?* G! ~( G8 E2 c  Y0 \
    {
, w0 _4 h/ L4 \5 ~2 D9 g" R            print2arm("edma3 driver init success.",0);
6 e2 q3 C1 B+ `: W    }
8 `4 I4 A2 R- `3 {. H) m1 I}
9 o8 a: v) z! T$ z. @" G' B$ x8 }: x! t  ]

# \8 e+ ]/ ^1 G- @  a8 ^EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! u/ Q/ z* a. D# a0 s' \0 D
7 w5 E! }6 W! e) [
& y1 k3 @* `) s4 Y8 ]" x* u
分享到:  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: r2 W% N7 J/ [' p; J, y
每次DMA传输完成后都要再次使能传输

& h, x3 V8 z& b) `  |: F原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 10:34 , Processed in 0.037617 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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