嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 o: i$ ]7 k9 ~#define  PING_PONG_ACNT          1
4 I& d2 X6 ~# N6 K; M( q& b#define  PING_PONG_BCNT          8*32*40
1 L3 E0 C. U  R1 \% _! j* M4 A) I" \//#define  PING_PONG_BCNT       1
3 Y' E' o: D  }#define  PING_PONG_CCNT          1
! M8 I& i; h1 a1 |& U9 ~" O#define  MCASP_BASEADDR          0x01D00000# N% g7 X: |3 v. g9 b
#define  Mcasp_RXEVENTQUE        (0u)8 a6 }9 t& F9 k, _. T4 Q( [
1 q7 O8 Y: {  K  L( T4 P
/* OPT Field specific defines */0 O4 H7 w7 o' z6 e" g" ^
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)$ I# H& a! ^/ ^1 Z  s2 c
#define OPT_TCC_MASK                        (0x0003F000u): K& B( F. K+ X3 l! C& g. ^
#define OPT_TCC_SHIFT                       (0x0000000Cu)# }: f3 h% ?7 S+ a
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
  U$ L( U7 ~9 Q0 D/ h' V: `#define OPT_TCINTEN_SHIFT                   (0x00000014u)3 r! u7 M! E5 q9 u. R" K
. B9 T, f5 P8 j' Z& c! |
char ping_buffer[PING_PONG_BCNT];" T* h9 f* b* M
char pong_buffer[PING_PONG_BCNT];
2 ?3 z! J6 _1 Z* L. x7 g) ?+ c' N2 v# P# b+ p; D- H

' n5 E) n% M4 k/ P- S
' ^. r& R6 x0 t" l2 C# f; q: K) h" z6 B! [! `' |
static void ys_edma3_init()
& C/ l  z( Q5 Y4 C1 o{
; S7 L0 g$ a/ \9 J% {3 i        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
  ?9 ?* m5 M% B, M3 y* p        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 d( ^, D9 g9 G( p! Z        EDMA3_DRV_Handle hEdma;- K; [" _) |' ?1 I2 `' H/ c
    uint32_t chId   = 0;
8 g# |( ]1 |9 G' {- o8 l    uint32_t tcc    = 0;
8 x  ?5 j8 V0 ?* F6 ?( E2 ?& v5 V% W
    print2arm("edma3 driver init...",0);! z( g" Q3 L- }. b' D" X$ `

* I: Z- P* A7 n8 w* c# p# d: S" \& _        hEdma = edma3init(0,&result);
8 l0 S8 h  h- S+ j" Q- Y& A        if(hEdma)0 w8 P' {/ H6 n1 a- D! ?
        {
6 p1 G/ U. r9 G; i; i: V+ ?                print2arm("edma3init() Passed.",0);1 L3 x% p6 @  C4 @7 t% h/ w/ t$ y9 J
        }
6 E7 F& k) z: y% y, x) G: @        else
1 A% h) j) P3 R! s" A        {
7 a' l/ {' A  _( U                print2arm("edma3init() Failed.",0);2 x+ O6 Z) p" {9 X
        }" _! o; o! `. g0 G+ z# L9 q" w0 O1 ?
        5 @- k* Z2 Y- U3 m  H' c* E$ W! h
        if (result == EDMA3_DRV_SOK)+ G! R- R: F/ Z* W: o0 o
    {
* ?) Q0 J  H! Z/ T                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
  p& |* D- ~2 {: G                                                       (EDMA3_RM_EventQueue)0,2 b2 d' V- g9 r% S" r
                                                            &edma3_isr, NULL);7 N5 x4 s+ ?# p! i! B
    }# V# Z2 V$ y. n) [
       
, T6 P3 J) O3 ?1 X2 t) a, G/ y        if(result == EDMA3_DRV_SOK)
" |- I6 T# u6 K/ ]        {
' O; s* ~" t9 ~3 r# L9 c                paramSet.srcBIdx    = 0;
1 D/ E+ C+ p& z# P  r3 x/ F; N                paramSet.destBIdx   = 1;
* `/ E+ V& K/ W: l% `# P. j                paramSet.srcCIdx    = 0;
3 R; R( ^# ^1 n3 _7 P. s0 G                paramSet.destCIdx   = 0;
: q' C( h( C' X8 Y& R' d                paramSet.aCnt       = PING_PONG_ACNT;' z* l2 }' W8 y; j  h
                paramSet.bCnt       = PING_PONG_BCNT;
4 F( n, X% m; b                paramSet.cCnt       = PING_PONG_CCNT;0 O1 [# o6 j& G- U& d4 A
                & P8 W& Q, D0 D
                /* For AB-synchronized transfers, BCNTRLD is not used. */
9 f5 q! z9 F2 n7 h5 p" Q8 E) d                paramSet.bCntReload = PING_PONG_BCNT;% V3 d/ k# r7 R, ~% F0 h

) S1 j5 C; S2 u4 ~8 E' N0 j                /* Src in constant mode Dest in INCR modes */% v# B# F, ?4 h, s% |
                paramSet.opt &= 0xFFFFFFFDu;
. O; C0 O5 L& d4 v+ R5 n, z                //paramSet.opt &= 0xFFFFFFFCu;
0 o/ y* g% S4 b3 J1 s               
, F9 Q: J1 D8 y$ v' A' I, Z                /* Program the TCC */
& W. M4 W$ F& J8 a1 o, o                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);5 D3 P2 Y6 A5 t, m5 p# M$ J( |- E. C

- a7 u" s4 Q3 r8 }/ E. b- D3 X                /* Enable Intermediate & Final transfer completion interrupt */
, l# S( {! E2 i+ P7 |2 D                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# M# [$ G; P  t: [) E4 |! j9 H
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& }& X- y. \  c' B4 @! z' h

/ G6 u+ u( T( X: D/ N% ~" ~1 _. {                /* AB Sync Transfer Mode */
$ z$ |9 p/ ~% F/ I9 D! u* p9 \                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' ]. B' |( k! K; h0 d6 O
                . h/ I7 G, ^* a
                /* Program the source and dest addresses for master DMA channel */' ?0 ?  \! \. w9 N
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);5 L9 D. W+ N* j- Z" g# o/ {
                paramSet.destAddr   = (uint32_t)(ping_buffer);
$ A7 H1 w, n. n8 j2 Z9 U: I) O9 j5 @
                /* Write to the master DMA channel first. */. @1 e, B, ]& j6 Z* B* D5 E: |
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, w% E: \- ~- E
    }       0 e- `5 m! v3 d5 s! r3 ]  T* T
  {! \7 P9 h% u* e, ?+ D7 m0 z
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. v( H& W2 ?3 G
       
2 f1 h2 ~" h1 h, ?$ Q# c" X    if(result == EDMA3_DRV_SOK)
' B1 D, ^; h& n1 z% v' g/ t    {
6 }6 \) l$ a+ I( r6 \$ K: o            print2arm("edma3 driver init success.",0);+ K/ V1 x  {4 _# [+ K* ?4 E8 `
    }
) U5 P0 P+ L+ b" }6 U, v% G1 }2 ~}
" q4 D* _& F  h& r+ i
9 l, p! J# D. u' D  J* U1 D) |' }6 Q, V* [- {) ~" |) r; I
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ q; O& w# m- k
& a/ O: ?$ ^/ V; r. f) D- w% O$ p) G1 `7 x

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, z# ?1 n; V6 R& {( |每次DMA传输完成后都要再次使能传输

; R; H% D& y$ L# [* N原来是这样,我明天去试试,谢谢了!




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