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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
  y8 i7 [; l0 N3 J#define  PING_PONG_ACNT          1
  s2 O! }' x1 ]! g. e; K" W#define  PING_PONG_BCNT          8*32*40
6 b6 ^3 R5 x- k* V9 _6 M//#define  PING_PONG_BCNT       1
, T4 {, T+ f. Y7 D4 @#define  PING_PONG_CCNT          17 ^8 h; d( ]# {6 W* c
#define  MCASP_BASEADDR          0x01D00000
, v0 D  I. ]/ m9 ]9 `6 n7 F' l#define  Mcasp_RXEVENTQUE        (0u)' k8 K1 I/ h0 D9 t. `
. I, L3 t# a9 P: b( n7 x2 {, K0 A# ], |
/* OPT Field specific defines */
5 v& Q7 j' h0 f#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
" M  @( W) G+ M' s#define OPT_TCC_MASK                        (0x0003F000u)( O% Y5 ^; N2 C3 R
#define OPT_TCC_SHIFT                       (0x0000000Cu); f+ _1 i# ~4 \; H& D8 X4 ~
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)  e- l% A3 Y- O. Z( d9 x
#define OPT_TCINTEN_SHIFT                   (0x00000014u)  c" v+ P  _. q# ?6 N) @
' W8 S! V' T( X0 e+ w; q
char ping_buffer[PING_PONG_BCNT];
' K$ X: s! N/ X% Fchar pong_buffer[PING_PONG_BCNT];
' ~, Y) O+ f9 T1 O" G* N. c
0 Y5 p4 D& J4 ]2 c: L6 z; `
$ j" i- X3 w& k6 u  o( F+ e
2 Y8 W1 [$ t; q+ i' k5 q& W+ z2 {( S8 x( B3 H
static void ys_edma3_init()2 S/ D/ R$ q( r& r; G( L1 [1 Y0 n8 g
{2 X" d* w! m  [7 `
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 x0 |' h1 T" [        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. r" }: z/ z# `: A* N  p        EDMA3_DRV_Handle hEdma;6 k/ a* T) R1 {. J2 @
    uint32_t chId   = 0;
% [  c3 ^# R) g  @: I+ y- C    uint32_t tcc    = 0;, J0 J! ^$ h. k/ S+ \6 t1 t

: B0 f  C8 t' @* {3 l+ u+ U. Y) |% {    print2arm("edma3 driver init...",0);
8 r3 ~! Y* B: W" g# O( `" r+ T6 g6 ]0 ^! ]; V) x) t
        hEdma = edma3init(0,&result);1 d0 J2 _8 {  T# n7 n& m* I- v
        if(hEdma)
. N9 Y! K9 b' s% g& V- \        {
# E- f/ a4 _  \- d                print2arm("edma3init() Passed.",0);  Z( b7 q( x" F. M# v5 H$ i
        }9 [1 w5 |; g9 F
        else  T: |0 O0 z+ `5 R+ e
        {3 K1 W* I0 P$ _; E. x: g7 X
                print2arm("edma3init() Failed.",0);, Z/ g6 [+ r! W6 A
        }
& T: X& O  _& l9 G$ k        . I$ G$ y2 b+ E9 S, q4 A8 z
        if (result == EDMA3_DRV_SOK)
6 o% o0 G! x# W0 }( \1 X9 T    {$ O/ `& {1 n6 c- I
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 |7 q5 o6 M, ^7 B7 Q3 X! T
                                                       (EDMA3_RM_EventQueue)0,
7 E& J: c  h2 l3 U% C* M2 r# h, X                                                            &edma3_isr, NULL);
% S& g0 {# G( v2 s. f    }- F7 a1 B% F9 Y* ~- }
       
- j4 k& _" R0 u- ~. K        if(result == EDMA3_DRV_SOK)9 k/ O) W+ D  K. r( d: [8 V
        {
) p: I( a8 q7 D( w# P                paramSet.srcBIdx    = 0;
* j3 q, ^( O4 A/ F* p3 x                paramSet.destBIdx   = 1;0 `3 N; |& n; {9 P5 N" W6 A
                paramSet.srcCIdx    = 0;$ Z7 Z1 F0 @: m$ o* d; s
                paramSet.destCIdx   = 0;6 P8 s8 h' D% ^1 ^5 w. M2 J
                paramSet.aCnt       = PING_PONG_ACNT;
% }' G1 p5 r, y                paramSet.bCnt       = PING_PONG_BCNT;0 V% a% b+ F0 Z$ Y& b
                paramSet.cCnt       = PING_PONG_CCNT;8 m. i9 S  Z  \; |5 r! Q% H: H- y
               
4 c9 ]1 q. J8 z                /* For AB-synchronized transfers, BCNTRLD is not used. */
9 g7 R, t, Y$ H" d0 j5 V0 g                paramSet.bCntReload = PING_PONG_BCNT;) S) E) n6 O6 ~5 j+ N% O

4 R/ w7 h* i& I5 |* ?                /* Src in constant mode Dest in INCR modes */* M+ G7 H* U# z: t$ E
                paramSet.opt &= 0xFFFFFFFDu;* H6 N* H9 f, `3 N4 n
                //paramSet.opt &= 0xFFFFFFFCu;5 V( [( {1 ]9 ~
               
( i9 e$ T1 v0 V1 z; w, _1 j) S                /* Program the TCC */: m. Z5 `- ]+ _. V( [
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 v6 t- T5 V6 q. ^9 p, d% b
; I( Q3 `, x* x" L                /* Enable Intermediate & Final transfer completion interrupt */' P, l. V/ F+ m' _0 f, B
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# q+ O$ J# a1 X% E# Z+ K+ f7 g# b                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& V# C, o/ L2 |# w, \/ R
# P$ C' I" D3 F, g3 Q
                /* AB Sync Transfer Mode */
) U) H# u- Q$ q" w3 i# }! t8 U                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" t9 G7 W& l7 T+ W/ ~                ' G5 W* [& _+ U, L2 h0 l4 s
                /* Program the source and dest addresses for master DMA channel */
8 m; E: w7 k5 @. B! z! a. m) H) s                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);* }3 u9 L9 `$ ~7 M
                paramSet.destAddr   = (uint32_t)(ping_buffer);1 g  B. h1 v  e" Y+ a
# D5 b5 a  U6 |5 ~# D& ^& {
                /* Write to the master DMA channel first. */  L& ?9 ?! r  V9 ?
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, g* x3 z$ p: c* i: N; U% K
    }       / z( i$ M. p2 C% _; d) O. B6 E

" }3 C5 K3 b, I# f        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ w, o/ ^* j" w9 A1 B4 j, H        7 d! }# Y9 q* }& I' c# D% o& Z
    if(result == EDMA3_DRV_SOK)
6 J8 D" o6 L: z' N4 t    {1 G3 _. U8 a* g$ V' @5 a2 y1 {" ^
            print2arm("edma3 driver init success.",0);1 Y! r" q) m! T2 a  T$ r
    } 4 k2 F9 j9 E3 Z  ~( i5 h
}
8 n* j& Z) C: y' Q; s
3 z% H6 q; N+ l6 x
( }' J; i  E1 u. g$ |EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 u7 U6 B4 q  n1 v7 J2 l0 m
1 J# g/ }8 m4 x( v3 d. J
8 ]. j& j- ^+ t$ |: o1 x! X
分享到:  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
4 v) g2 K% R: y每次DMA传输完成后都要再次使能传输
8 T& o- m% K3 b2 M7 p
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-11 06:47 , Processed in 0.040046 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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