嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' _" {  e4 I3 b! O
#define  PING_PONG_ACNT          1
0 N+ b$ E( r0 E+ s; \1 X! ~#define  PING_PONG_BCNT          8*32*40 - s5 D) E1 ?4 z
//#define  PING_PONG_BCNT       1
3 W# t/ S# \$ j5 v) [#define  PING_PONG_CCNT          1# u1 l7 P7 K& X& N6 w/ z( c
#define  MCASP_BASEADDR          0x01D000002 U: Q0 t; f7 Z. T7 x
#define  Mcasp_RXEVENTQUE        (0u)
% E- X% b) E: Q3 a! {7 ~5 L: c
0 z  k" D- ^+ D/* OPT Field specific defines */
+ z2 v0 M% X. K% l) f. R#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 ]5 k% D" G6 i8 ~& ]#define OPT_TCC_MASK                        (0x0003F000u)
# O+ I- e# g2 P) n5 {- u7 t#define OPT_TCC_SHIFT                       (0x0000000Cu)
! F! c+ D$ N2 E! A$ ]: K7 i  Y5 |#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
2 K) p; n4 m) ^1 a9 A#define OPT_TCINTEN_SHIFT                   (0x00000014u): i- @# r  j$ q: V! N
* Y; ~- H, h# Q
char ping_buffer[PING_PONG_BCNT];
" x5 j, r( k+ S: Vchar pong_buffer[PING_PONG_BCNT];8 A# L& i- l" b9 M: B* b3 y
/ K1 o% j5 m, T! k' E5 _

0 S' U5 U) S( w8 L/ t& @, d* G+ u

0 Z' y0 I9 u4 S, ^4 j8 L7 q( nstatic void ys_edma3_init()' i' E0 Z7 L; W$ A( ?! V' J% c' _
{
5 L7 W8 |9 [/ u7 `# E5 a        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 S) ?9 Z1 ]5 E6 ^  Z( T" S
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; f2 o& P; Q6 u% L, n: M        EDMA3_DRV_Handle hEdma;6 P7 F) ^' l+ f/ Z
    uint32_t chId   = 0;: t6 D: R5 {7 p) S. Q7 D6 t1 D. y
    uint32_t tcc    = 0;3 y4 G) T$ S4 Z8 f* c* v

0 \# y: c3 p( G4 {6 i' Y2 ^    print2arm("edma3 driver init...",0);
- A, L) F6 p1 o
  _& P  {  {8 {* j; C$ T- A        hEdma = edma3init(0,&result);
# O7 }2 s1 }6 }1 f0 f1 o8 W        if(hEdma): p) m- h; M5 P8 m! h
        {
8 j2 j4 u- j! t  K; f                print2arm("edma3init() Passed.",0);
6 O) H# z5 y& P) e" b) }        }
$ A; |: w+ W6 g8 a5 W' f9 r8 E" E        else' }% m$ L0 F/ i
        {
& i" @1 E3 n( s* h                print2arm("edma3init() Failed.",0);
8 u7 F2 q/ r' `" ]7 T) g4 @        }
( U- B3 T' E9 `6 G+ J/ }( ]       
9 k& i4 X9 ~' E        if (result == EDMA3_DRV_SOK)1 T; D* {2 L- t
    {
% `, Y' b" {. b                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ T7 K5 ]* [/ G. U
                                                       (EDMA3_RM_EventQueue)0,7 n* i; w/ ~+ X* ?
                                                            &edma3_isr, NULL);
/ x1 ?9 u1 t0 Q$ M1 k5 b) g7 T    }
$ b1 }6 R8 d4 L3 _8 [: C% l       
3 Y) j* \4 ~5 r8 ?0 n8 F3 {! t  w        if(result == EDMA3_DRV_SOK)4 J2 l0 u  S- I2 N1 e: V. T
        {
: k8 h3 p7 `/ o7 b; t                paramSet.srcBIdx    = 0;
4 s7 F# [( X7 U2 D                paramSet.destBIdx   = 1;
& ]7 Z6 |9 o; B* G5 Y                paramSet.srcCIdx    = 0;0 V8 r/ z3 p( {" H3 b! Z8 Y0 Y. w, ]
                paramSet.destCIdx   = 0;
6 g: z3 |# `2 f; y* M$ A1 v% {                paramSet.aCnt       = PING_PONG_ACNT;) b# i, s3 d4 |# [' q; y
                paramSet.bCnt       = PING_PONG_BCNT;1 D  Y8 m& V5 ?8 N5 ]$ N
                paramSet.cCnt       = PING_PONG_CCNT;+ }4 Q% i$ ]. s  t( m* D) Q) r& @0 ~
                  Q: d5 v* N9 a% c5 i$ X
                /* For AB-synchronized transfers, BCNTRLD is not used. */
, y" Q9 }( p0 V: X1 C; k! t                paramSet.bCntReload = PING_PONG_BCNT;
# Y( \" U; o4 r( I
  R) v6 O' j; V  p( |                /* Src in constant mode Dest in INCR modes */9 f% J( M5 h5 E' W# E7 d% O
                paramSet.opt &= 0xFFFFFFFDu;
0 y/ |+ n6 e. w! ~2 |% }                //paramSet.opt &= 0xFFFFFFFCu;, {5 W/ T, X! e% |; s% }+ q9 B
                  }; m/ \# [3 D2 I7 m
                /* Program the TCC */
. g* `, C) n+ b& o! u& e* }                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! q6 [3 j3 o& G! n8 g' [' m9 F! {, Q# g. }
                /* Enable Intermediate & Final transfer completion interrupt */, {( [  o1 N; s/ N  `
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);$ t) [8 k6 x$ F( |3 r/ X
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- n( B8 h9 N. f5 s' w5 z

) L7 S  K, A4 N4 y- t                /* AB Sync Transfer Mode *// e/ a! S% F' i( H9 i. ?
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);( m+ Y# k. b# E% D' [! }
               
1 u  w- ~3 L5 p, J6 w( D8 w4 |. B( @                /* Program the source and dest addresses for master DMA channel */
4 K( V3 \9 @+ }/ Z9 n1 s2 f: l                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);: k9 @: u, w, u* }; ?2 g
                paramSet.destAddr   = (uint32_t)(ping_buffer);. i1 K* Q; x2 |" j( ^7 O! z0 x7 X8 ^

4 J6 c3 K0 r4 v. T) C8 o+ V" D# S) ~                /* Write to the master DMA channel first. */: ~& _' A1 N" |* f3 l. M$ b5 F- h
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);% G5 N( S3 v# L8 g) T# g
    }      
" `* m& S* p" u2 f6 `$ z1 [* B- |" ]9 s
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);0 F6 D/ l% C2 ^1 g- T
       
; N* j) k2 N% u  [7 ]3 P  m    if(result == EDMA3_DRV_SOK)
" t/ a! H2 T. Z. H; d* L    {
- S  l$ \3 n+ X/ R, @$ a4 y            print2arm("edma3 driver init success.",0);( K+ s& f7 d# ]( h* e/ f
    }
6 Q4 k$ y9 Y  o6 C+ P# H}
! v$ J$ H6 x! l3 F7 D2 t
1 B5 a; b" ~' C& n; T, g1 t' ~' ]! w7 \; C, g: }+ D' v! l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# q$ b2 g: N4 p) N+ |- x

5 Z" I) T, ~6 Q# p+ g; {) w6 q9 K& g7 ]$ [+ |$ Y

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47+ U3 e4 R; i  y3 }3 Y% X
每次DMA传输完成后都要再次使能传输

  Q% w$ `. @9 g" b6 }; I+ z原来是这样,我明天去试试,谢谢了!




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