嵌入式开发者社区

标题: edma3中断只能进去一次 [打印本页]

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; k1 i7 Z; D6 j. N% k. y
#define  PING_PONG_ACNT          1
. m) g. U) }9 q7 a#define  PING_PONG_BCNT          8*32*40 + W  l1 _7 V' t9 }
//#define  PING_PONG_BCNT       1 - `4 W! c& p7 m1 l; b. s
#define  PING_PONG_CCNT          19 t, X: y$ V7 S8 \! m. \% l9 _
#define  MCASP_BASEADDR          0x01D00000
, S( t( p+ `( a9 R0 `$ x" @: U# m#define  Mcasp_RXEVENTQUE        (0u)
, u6 C& R  B' H
" T6 F! u+ S/ u/* OPT Field specific defines */
! j7 y8 h9 |6 F6 D1 @#define OPT_SYNCDIM_SHIFT                   (0x00000002u): X+ ~' B5 J; n
#define OPT_TCC_MASK                        (0x0003F000u)
5 ]  c: Q2 i3 e0 _) w4 P9 ^. J#define OPT_TCC_SHIFT                       (0x0000000Cu)
2 R1 w+ ~6 ?* b0 V  X( X) R#define OPT_ITCINTEN_SHIFT                  (0x00000015u)) i& \7 b" c% t; K8 t
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
! e9 Q' [, h0 F. ^% H
2 ~- ?4 j' ~6 U. p/ j& v- Zchar ping_buffer[PING_PONG_BCNT];
* s* f$ a) ?: U+ gchar pong_buffer[PING_PONG_BCNT];* K+ M: T# L+ K' r
8 R  T  ~, \3 }  ~1 A
. d# t3 Q- \: s1 L

& d' m. @$ e4 E7 t# n
0 ]' }6 S9 R9 E8 Z' E0 c! vstatic void ys_edma3_init()4 v9 }) B, G/ ^( F* b$ |3 N4 D
{6 o) ^* {3 a* ~. B8 P6 l
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ r; V% i. P: }5 D# F' u
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;2 P( J3 `) _# S3 e5 e  ~
        EDMA3_DRV_Handle hEdma;  z, i- ~7 [: o+ b# }
    uint32_t chId   = 0;
( G2 f7 H- W2 y9 ]* a: W: T8 u7 y    uint32_t tcc    = 0;
( E9 ~7 s. J- S+ E2 Q# f4 M' y& |' u! m( Z: W0 ~& ]1 _
    print2arm("edma3 driver init...",0);
/ ?% h: ]% M! ^1 N8 X/ o; z( H* t2 g5 y
        hEdma = edma3init(0,&result);
( ~/ I$ K" S" V        if(hEdma); h* h3 X6 J$ F# [
        {, J' i: A' {# A% a) b, @
                print2arm("edma3init() Passed.",0);& i8 ^! x  T- {' @) y
        }
/ x5 Q" I* L0 c, [* d2 _+ [3 r        else
9 w( P) j2 b8 C5 \+ y        {1 B. |- |  B: l- c6 I. t
                print2arm("edma3init() Failed.",0);5 F$ b( `( z" i2 Y
        }
0 q- m6 P9 n: V: g9 k2 c       
0 j3 u$ `% F: T" X1 g' @        if (result == EDMA3_DRV_SOK)
1 a/ d, {0 y- a% f2 V( L- v& w' C    {
' B! [' C# a( _+ R& C4 j% E                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,5 z: N1 i" U0 S3 k2 w& d
                                                       (EDMA3_RM_EventQueue)0,0 ?/ Z8 p' W2 e( `: }1 d( P/ j+ M
                                                            &edma3_isr, NULL);) U4 h7 c4 Z: H
    }  K8 \$ w3 R6 d5 j4 O! }
        + t2 C2 ]& {( b, M" Y+ C0 y( c$ I5 b
        if(result == EDMA3_DRV_SOK)
1 p8 M9 G6 N3 @( q2 y3 ^) @        {
" i; f& I7 F- z- z4 K2 `                paramSet.srcBIdx    = 0;
# N* e* P8 O  E8 J; _* B; Z                paramSet.destBIdx   = 1;
2 Q$ B+ {) h1 z9 J  m                paramSet.srcCIdx    = 0;% _* k  m/ X' ]) i) x2 z" H
                paramSet.destCIdx   = 0;
0 X; t( J) o( s4 B5 {                paramSet.aCnt       = PING_PONG_ACNT;, C1 X& {- a# a* F# Z" |) U
                paramSet.bCnt       = PING_PONG_BCNT;3 c) B- W" ?5 V1 G: J6 p8 D7 {
                paramSet.cCnt       = PING_PONG_CCNT;
: Y6 x8 T# b8 T  W3 r               
/ b7 e. b" W) f) M4 k! t9 c                /* For AB-synchronized transfers, BCNTRLD is not used. */
" p& `. f1 t1 v' ]% k                paramSet.bCntReload = PING_PONG_BCNT;! b$ a4 }+ e- c( h+ l, G1 B

: |4 L: V) D7 s1 ]" c4 }  \                /* Src in constant mode Dest in INCR modes */  I& d  n6 d4 }- S( h
                paramSet.opt &= 0xFFFFFFFDu;
' I! t- \" a' X                //paramSet.opt &= 0xFFFFFFFCu;
5 I/ n6 ]$ l, M               
4 G( c9 ~8 o+ K, d7 M                /* Program the TCC */
% z. d( C5 E" u; J3 `  I                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);, I* Y0 @. L8 L6 `, b2 S# M5 M

1 F" s# b6 ^* b$ W$ O                /* Enable Intermediate & Final transfer completion interrupt */0 l; K4 p* V) \3 n- _: V; P; z; p% s
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
- Z6 ]" N: {: c) V; H2 `                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 q  J9 s5 s0 M$ y' R1 S

7 e8 T; m7 o: {6 P: k0 \                /* AB Sync Transfer Mode */
  f6 |! v4 N+ r% c' }  ?& w                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 f% k: h5 A! U* @9 _; ^* l' F
                7 r( J9 X6 V+ X0 \  G
                /* Program the source and dest addresses for master DMA channel */
' N& D  e" R7 ^* Z4 {! ^                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
* p/ w7 I1 r' I8 a( p' I                paramSet.destAddr   = (uint32_t)(ping_buffer);
' A4 O& [% S% f5 c! k9 s" S2 p2 d5 u$ g8 q; J* ~. H
                /* Write to the master DMA channel first. */
4 u: k2 y( D: R5 f0 A0 v                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
9 p2 c% ?- T; G) u6 D. E/ H    }      
( S8 V- T/ O) y& ?/ F) u2 B, j. P0 q* `4 @7 z
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* N6 Q8 c. }* h( A, o2 B9 @6 N       
; y( C( e9 l: ^* C1 i" [% G) W, x    if(result == EDMA3_DRV_SOK) 8 s3 M9 g4 t5 W7 ^/ o" w
    {
& _. x* w% S3 F: ^$ P% V            print2arm("edma3 driver init success.",0);
7 Y7 C+ i2 z; k$ u# {- S) F* n    }
9 m) ^. B; T, k8 c}1 E  Q1 f$ _7 y, w$ q0 H
% t2 A. W, ~. ^' y5 R- U
5 t5 D9 N7 Z+ g+ p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" _3 {, E% x8 y6 t/ o0 x/ l' c
) H5 [6 N; O1 T8 f9 I2 f9 D4 Y; ~+ B. B# R5 E

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:474 }* G' q" O; {! u) X7 U
每次DMA传输完成后都要再次使能传输
) U+ t$ t7 `4 e
原来是这样,我明天去试试,谢谢了!




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4