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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

edma3中断只能进去一次

[复制链接]

10

主题

30

帖子

158

积分

注册会员

Rank: 2

积分
158
跳转到指定楼层
楼主
发表于 2015-4-22 22:01:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% B% d( z: A. v. p: s/ n( h+ \; ]
#define  PING_PONG_ACNT          1
6 {; G: o; n4 [# E: D: \  ?" H* ?#define  PING_PONG_BCNT          8*32*40 0 a4 j) ?) _0 a" n8 e
//#define  PING_PONG_BCNT       1
/ L! h. S4 O: \6 N) {- h#define  PING_PONG_CCNT          1
0 q2 U0 K* U( n; k2 x! A+ L#define  MCASP_BASEADDR          0x01D000005 t5 z* [- ?1 G; v! |$ H
#define  Mcasp_RXEVENTQUE        (0u)
! ]$ y. Y0 v- G( |! G% R& x' Z
- d) l) U# O/ h$ J/* OPT Field specific defines */
* H  \$ v/ u: x" J" ]$ m" _" Z#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
4 m" Z# ^& x2 {+ Q# ~#define OPT_TCC_MASK                        (0x0003F000u). h1 Y* ?7 k- e! M
#define OPT_TCC_SHIFT                       (0x0000000Cu)5 v" a& l6 r" _5 I) O3 L2 p& U( \. Z
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
. W, m9 F: t# }1 z( Q#define OPT_TCINTEN_SHIFT                   (0x00000014u)
* W& [3 M: u" O8 A% B; u
; a: e3 |: R3 X# u2 ]  `char ping_buffer[PING_PONG_BCNT];
0 a$ L; g) Q% y0 w* |char pong_buffer[PING_PONG_BCNT];
1 x1 q: ?) D+ O) P9 u9 J4 A
: ?' Z/ _( [4 K1 ^- P
5 T; R! o5 s$ O1 e" E
0 E4 v6 t, |2 d9 j  D& _+ X5 U
static void ys_edma3_init()% K0 Y8 P; q* y7 @( ?0 z
{: J! X) A& I, _: F
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, q/ c, _- y; X        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- E3 Z4 E' {# {        EDMA3_DRV_Handle hEdma;
, w/ ?; L" t  {1 Q, b9 d8 G    uint32_t chId   = 0;
$ I  w9 a$ u# v) i9 @- O0 e. V) Q    uint32_t tcc    = 0;0 M" r, W' r5 y0 S

/ d* U' F8 y: b/ b) l# |5 W    print2arm("edma3 driver init...",0);9 B- |: |5 v7 P, n+ j+ s7 q$ Q
" @4 |" n4 t, C( k$ Y+ _" Y
        hEdma = edma3init(0,&result);
' E/ |$ N/ L5 @7 I3 Y' L) N        if(hEdma)% t/ K4 y. C" v0 E9 Q( \
        {' Z$ p6 d, p1 J' @" ~
                print2arm("edma3init() Passed.",0);9 q7 f' Y. R7 U' c
        }2 A; O% K8 `$ `7 K/ o6 v8 \
        else6 C# t7 w7 R9 A9 z! z
        {& |+ o! y7 ^+ o& n& ]: @
                print2arm("edma3init() Failed.",0);
! N" _* {+ a" w; K/ D" Q# V, U7 `- z) w        }
! F: s# U' P# m4 {4 Q' K" A       
! h2 }& S7 M& M: U$ y* b  D8 Y$ ]        if (result == EDMA3_DRV_SOK)9 u3 U0 z. I: w- ~
    {
6 S7 x- C0 W/ v: h                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 j) _- u5 u4 M% o6 G
                                                       (EDMA3_RM_EventQueue)0,! S+ z9 ^3 @' y
                                                            &edma3_isr, NULL);
  D) g! P* ~- U. P, x) s, N8 x6 F    }
4 |- S' X9 t$ x; g       
4 j& i4 d- j2 {3 {$ ?        if(result == EDMA3_DRV_SOK)
, l/ s8 k. F( p* j" w        {
* H) `6 ]( O7 q4 _, l7 q* L7 p% T9 ~                paramSet.srcBIdx    = 0;
) E7 {' u+ x! r9 N# |                paramSet.destBIdx   = 1;
+ K% s6 k' V& O4 k; W4 y                paramSet.srcCIdx    = 0;
* I6 x3 c3 e+ ^3 L                paramSet.destCIdx   = 0;+ D  w: C9 s! h2 V2 r( S3 e+ }
                paramSet.aCnt       = PING_PONG_ACNT;, }8 H! l7 E5 }9 w) L
                paramSet.bCnt       = PING_PONG_BCNT;
+ C; [  P: y1 W6 i, S& ?                paramSet.cCnt       = PING_PONG_CCNT;
; s; w% A; @* Z# N7 P2 r/ A- M* }) V                ; N& G. p' `1 ^. m
                /* For AB-synchronized transfers, BCNTRLD is not used. */8 W! M4 g: x+ G0 S5 ?( {
                paramSet.bCntReload = PING_PONG_BCNT;
7 Z' p7 z6 O' v2 h7 c! A
3 m" _4 l. `, E                /* Src in constant mode Dest in INCR modes */2 o: {+ [3 N( N! M7 B
                paramSet.opt &= 0xFFFFFFFDu;
* T% P1 q( Z) \) V                //paramSet.opt &= 0xFFFFFFFCu;
/ W6 z2 E$ F/ V3 {$ w4 L  I1 k4 O               
5 N0 [1 s* b  o4 w  i6 B                /* Program the TCC */
& l7 d" n4 Z3 s3 m) q" G/ U( `# @                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);% h# g5 m- ^+ E9 l. k9 E

: o4 A7 z4 P$ y3 y; w; |                /* Enable Intermediate & Final transfer completion interrupt */) T% _; r9 `9 t9 `5 B: ~
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. e, {+ Z/ v0 s2 v% b  W; t
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
" Y* D0 E6 K) O3 T% s6 G* j
, V$ D" b1 r! w, K: Q9 n. N                /* AB Sync Transfer Mode */
% j5 _7 ~: E- O6 o1 L* u- C                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
  y" n6 S. g9 d, R7 Z1 K               
6 ?7 `/ U0 `3 l+ C0 F) g                /* Program the source and dest addresses for master DMA channel */
( W( t7 h  t1 W5 i                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
9 N8 [, A) }1 c4 a9 ]                paramSet.destAddr   = (uint32_t)(ping_buffer);
! x, ?! O  b! s+ {: \; E3 K9 n( _: _6 ?! C3 Z" t2 {# h. j1 p
                /* Write to the master DMA channel first. */
6 V, l0 I( {! {- i6 i& e2 u. H" c: Z                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 ]: i' q) M. r# S    }       - U9 |% R1 |  G$ `1 O; K  a
) i1 k) ^9 i# @
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 M$ e0 }/ o# I3 k7 Q6 B. V" c" ?
        * c5 |- K9 U: f* n7 t
    if(result == EDMA3_DRV_SOK)
0 s4 {) ^' J$ Y* o- r# _, D3 q8 J    {( X7 M  v- X* B7 h% z4 U( C
            print2arm("edma3 driver init success.",0);+ g" [* {- _" q/ }! H) z
    }
3 Q: Y8 X0 N& X4 ?% D) F}& \3 l# w0 ]" y7 J) O2 b7 I5 E& K

1 u! G. l4 N* R! t9 `+ Q; N) \+ g3 c4 g6 J: f
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ }4 P4 o& R3 A; ?

% U; ~7 W  B6 `6 n: |% p  [$ s7 V0 V, S) ~8 k1 l& y
分享到:  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
! B6 U' b2 F, Y* N3 K1 ~" i每次DMA传输完成后都要再次使能传输
% w; s* B/ _0 B$ T$ r# |6 Q, o! m
原来是这样,我明天去试试,谢谢了!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 19:53 , Processed in 0.041948 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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