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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:! y' `1 v7 C+ m' j7 b
#define  PING_PONG_ACNT          1
, E1 G1 d" u, `% \#define  PING_PONG_BCNT          8*32*40
7 K/ P, q) k. q//#define  PING_PONG_BCNT       1
% A% D- u& q0 @+ [0 \  X/ Y& S#define  PING_PONG_CCNT          1# V4 V% p! N3 z
#define  MCASP_BASEADDR          0x01D00000# j$ E1 t7 \6 M7 }3 p* u
#define  Mcasp_RXEVENTQUE        (0u)0 M2 W' M% w3 X- E" E

/ Z2 b6 c) [0 j5 `1 W/* OPT Field specific defines */
* S# ~" B) B# d' G2 y) f. d#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
. a& [; W. n* i7 `4 Z#define OPT_TCC_MASK                        (0x0003F000u)
$ ~. |! k" k7 g2 j5 y#define OPT_TCC_SHIFT                       (0x0000000Cu)
6 Z$ q, i+ c1 M#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# Y& s) Q5 m0 b2 l* M% Y#define OPT_TCINTEN_SHIFT                   (0x00000014u)
' \" F9 J" r* p. A* x1 J1 _* t; L5 P( C( f* r* a
char ping_buffer[PING_PONG_BCNT];
, V3 \2 ?8 t: X1 f- Mchar pong_buffer[PING_PONG_BCNT];$ z) [6 p1 w8 a

% N3 K% |: M+ \: O0 p  K' F$ t: m& z6 m/ V( n, y

2 ?$ u1 B; c6 x2 c2 N% z# O6 z
$ Z8 K. f9 _! R6 a. nstatic void ys_edma3_init()! ^" q2 L! V. T: w; X' m" q
{& @9 v# @$ Y. e, v
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 o( Z4 y! I1 V5 `        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ P( ?% K  ~3 Q3 s; P
        EDMA3_DRV_Handle hEdma;
% `. L3 @  |% D' @/ {    uint32_t chId   = 0;
' X; `$ Q( `1 T. Q3 n5 Q    uint32_t tcc    = 0;
3 `, Y7 k: V5 V( u# `5 [) }8 y/ U, V7 X$ S# i
    print2arm("edma3 driver init...",0);' c6 N1 z& L( X( o; d
/ |/ M- o7 y! D3 j+ _6 `
        hEdma = edma3init(0,&result);+ F9 z) i5 @& E* o! }
        if(hEdma)9 F; h: E* {, W5 `- z5 r
        {
( \9 o! V5 q( ]! V+ m                print2arm("edma3init() Passed.",0);
( Z  E% A, E2 m- ]: n0 K        }
) {. V: J) G4 X% y# h6 t: k& O* L; A        else$ M2 j. `) I: Y7 B) g1 I% C( E
        {8 p8 S) _2 ~9 o
                print2arm("edma3init() Failed.",0);
4 x0 G4 u( s2 @8 }        }1 ~# a1 p0 y1 ~, T3 k
       
. ~3 _) q% s6 u6 B& g        if (result == EDMA3_DRV_SOK)
3 s0 G) Q; v$ d    {' o% I) f2 [4 z" D% ]2 G
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' Q0 y$ ]7 E6 {/ e( G8 w                                                       (EDMA3_RM_EventQueue)0,; q5 F& F, T1 o7 v3 ~, f
                                                            &edma3_isr, NULL);
. L: G- C# V$ o    }
# E: H' q$ C2 Z1 b8 _       
# B3 k3 M% M( B( j        if(result == EDMA3_DRV_SOK)
& c. Z7 A1 S. [" M* K$ @5 n5 \        {, E7 z# z2 m3 F) h6 s% s  L
                paramSet.srcBIdx    = 0;
, J1 m, c5 z8 T7 A1 r                paramSet.destBIdx   = 1;
! y1 i$ t. g' f' e* N/ X                paramSet.srcCIdx    = 0;7 H0 v7 X0 E/ H; J# D8 @4 F" z
                paramSet.destCIdx   = 0;/ n) @9 T( C" n/ m
                paramSet.aCnt       = PING_PONG_ACNT;
( N+ g9 N3 F* ?                paramSet.bCnt       = PING_PONG_BCNT;
' l# l, D. I' z# q* W                paramSet.cCnt       = PING_PONG_CCNT;
/ e" M) U, R( Q( I                % _/ P( C8 N: Q3 m' ^- ^4 _0 w3 r
                /* For AB-synchronized transfers, BCNTRLD is not used. */4 P% ]0 K/ y4 Z. `( ~
                paramSet.bCntReload = PING_PONG_BCNT;
6 |  |  s4 ?4 W! d/ Q; S. X; S) s4 ~/ P0 B+ h9 {& s
                /* Src in constant mode Dest in INCR modes */! E. q5 h+ C' r+ m6 e! s% f
                paramSet.opt &= 0xFFFFFFFDu;
% e/ l% K) A4 h" Q/ D                //paramSet.opt &= 0xFFFFFFFCu;( Y+ a* O% ^/ y, e* D
                8 M  i5 g* Z; J, `. T
                /* Program the TCC */+ n. o8 a7 x- ]$ r1 F4 Q
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" D5 _! J5 g6 I- C- [; G
1 A. B7 N! i1 B& T                /* Enable Intermediate & Final transfer completion interrupt */
# H+ T- b% X, Y! I, @: q( g, ?                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% Q3 C0 o5 C1 i2 p                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);* A. l* t# e/ {

( U, M/ ^% W0 F" o; ]) O                /* AB Sync Transfer Mode */
+ |" ~' W+ F, z0 n8 y) _) E                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);- T3 q% t, V0 I7 x8 o: ?7 b
                % w2 U4 U" [) ~6 _2 d
                /* Program the source and dest addresses for master DMA channel */
( X& ~$ u% Q9 B$ q) \8 z8 C                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);! B( V4 C! g1 S/ v* R2 D# U. \3 V
                paramSet.destAddr   = (uint32_t)(ping_buffer);
3 Q. J2 }  H" X4 ~+ k" m/ J( W3 H5 Y1 A$ {- j  g
                /* Write to the master DMA channel first. */
- i% L$ ^& }" d! k, _6 X                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);. k! D' L3 g# z
    }       % l/ [' q6 I% z' C; u; p. e( i8 S
5 [3 t5 N; c- e( d2 l; O* P
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* A: B$ B% G& \5 F# W$ [  n1 B        5 V4 }, u9 J) a% Z0 V( o: @
    if(result == EDMA3_DRV_SOK) 6 q4 ~5 W% s- R4 [+ I1 E
    {( h1 `; T- f) s, Z  f" B# q
            print2arm("edma3 driver init success.",0);( o0 ~: f$ H2 F, j9 n
    }
9 `9 B: ]; J" v8 e( l}
6 ?! W- j! ?3 ~' d
/ ~$ W- T; J9 `& u, G
3 C5 M( n: R5 i& rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 E/ ~  P+ [6 p9 w

% H1 r0 F- \" O% S5 m9 e) `  k
分享到:  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
0 Z+ x8 W' o) r0 F1 R+ C6 y) E. F每次DMA传输完成后都要再次使能传输
5 B+ c6 Z4 `4 @3 d
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-9 19:29 , Processed in 0.043170 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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