嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
9 b  Q( a& @. c! ^+ ~+ m! G4 V#define  PING_PONG_ACNT          1
0 t( p) M; d- o3 h* a5 x#define  PING_PONG_BCNT          8*32*40
( }' F" }+ y( B+ G' A1 s//#define  PING_PONG_BCNT       1 2 ^$ U4 d4 H( Q% {/ P; N
#define  PING_PONG_CCNT          1
8 L3 w: N) ~/ j9 r! L  r#define  MCASP_BASEADDR          0x01D00000
+ @! P8 `& K/ A+ O5 P5 \#define  Mcasp_RXEVENTQUE        (0u)/ m/ A5 `$ e, X$ F9 v1 x

) P4 S6 I9 @/ D/* OPT Field specific defines */4 _4 F6 ~0 z( ?/ F
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)* s5 k- [9 k! \) z0 {! }
#define OPT_TCC_MASK                        (0x0003F000u)3 X) R+ H4 i3 R# w- y3 ]7 [
#define OPT_TCC_SHIFT                       (0x0000000Cu)3 k8 J& B/ k% Q- y& p0 ^3 N8 `
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)' V' j3 u/ p7 M- c0 Y/ c
#define OPT_TCINTEN_SHIFT                   (0x00000014u). R4 G! \) e. @- m' [
% @# H" u+ r5 W, T. R2 R
char ping_buffer[PING_PONG_BCNT];
4 q$ J& i9 u, D. n+ {8 y$ c! `2 mchar pong_buffer[PING_PONG_BCNT];
5 Q, C8 T. g2 d4 d  L: b9 Q3 V% W& g. N. t6 z' [
3 @2 _+ @2 W, C

9 Z1 F' E3 |3 S* F; O( \. x1 r" N' K' w
static void ys_edma3_init()" W9 w# R7 m. W
{* V" e2 }" _8 f# D' s) ]/ Z$ f
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};9 ?' M7 K8 B6 B6 z4 I  |8 q
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;: N0 {- ]( a( k" `8 A
        EDMA3_DRV_Handle hEdma;
) X9 O0 ^" Q. i; e* x    uint32_t chId   = 0;. \6 ]# ?$ _8 y9 F# A
    uint32_t tcc    = 0;# a1 G9 B% a9 z$ T
3 c- n" e2 i0 f: W! Z# y9 X+ q
    print2arm("edma3 driver init...",0);
0 b3 F* A* K! y' ]; _( ~& T# L) I% I+ w0 A+ X1 m
        hEdma = edma3init(0,&result);
( l- E9 |; K- l/ k+ Y* q$ ?5 ]( Z4 ]        if(hEdma)* x7 j6 _- f2 B2 |6 n' i
        {
( {: ?" t9 y8 b) k  U$ q4 [3 }                print2arm("edma3init() Passed.",0);
; t  a% o# f9 d2 w0 e% O0 K        }) T" W6 u" I' g* T( I) {6 B7 R; j
        else! C; m- {  J- E! |3 \- Q% Y% ^
        {- ^( P  P. \/ Z. i8 n
                print2arm("edma3init() Failed.",0);# o) B! S( H9 A
        }
6 r0 E9 \+ Y+ P+ O3 |; D       
4 C: Z& |2 H; P, _        if (result == EDMA3_DRV_SOK)
$ Q3 b0 N& {" g% K+ ?; m, a& Y7 k    {5 S( C3 U4 Q6 i& h8 {6 {2 V
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 E( m% t+ j& M! ^! d6 b1 h                                                       (EDMA3_RM_EventQueue)0,+ c' U0 A! s8 O8 T0 {: y& z
                                                            &edma3_isr, NULL);
' f2 p. |6 a$ u8 [# B& ^1 c  N7 J: a    }
  F$ l4 G% x. j6 \       
. B! I5 l/ y: M  X% \        if(result == EDMA3_DRV_SOK)
/ r. `9 W2 Z; T1 |8 V' \6 `9 @        {
( {2 v' U! \0 a+ ^/ O3 J+ h) B                paramSet.srcBIdx    = 0;4 V; S5 V# P% B9 R- l; |" x! K
                paramSet.destBIdx   = 1;/ m, D, R, a8 ]7 X+ s, o0 _( R/ `) W7 x
                paramSet.srcCIdx    = 0;& G: O6 q1 ?! h! C+ I
                paramSet.destCIdx   = 0;
; B! j- ~% w( ]2 O4 s                paramSet.aCnt       = PING_PONG_ACNT;& q/ k  \. {: H6 m# Y1 n# p+ P
                paramSet.bCnt       = PING_PONG_BCNT;0 Y1 }: x; v/ U/ x- b! D
                paramSet.cCnt       = PING_PONG_CCNT;
% @# d/ o' S: @8 D               
; X; Q6 S0 t# y/ _. q                /* For AB-synchronized transfers, BCNTRLD is not used. */
0 c! g' W# g4 z. F7 t                paramSet.bCntReload = PING_PONG_BCNT;
$ M- L3 `- B/ X1 {# F; e' c5 x# a4 o
                /* Src in constant mode Dest in INCR modes */
- Q% g/ W( M% a, `                paramSet.opt &= 0xFFFFFFFDu;
. C- F2 T$ `) i$ f) b8 o                //paramSet.opt &= 0xFFFFFFFCu;: d3 \5 ]1 Z2 x
               
5 Y9 F' i9 V$ \1 X  p4 V                /* Program the TCC */  z6 s- x0 N- |
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) D. |  U" ]4 j  ~2 R  {
) z% {- X+ o& A# F                /* Enable Intermediate & Final transfer completion interrupt */' \7 T/ Y8 m/ J, q
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ k% p9 j) v/ p# h# h. B, y' v+ n) e, ?
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- H2 S% \+ }; V5 |0 M, a4 c* u7 }2 z, G

; _! M+ w0 d' H! w6 s' y                /* AB Sync Transfer Mode */: t! j4 x- Q4 z2 B' f6 t# m
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
/ }7 u$ g% l' H$ y8 p+ m$ i5 Z                1 Q2 q; `( J; f% t
                /* Program the source and dest addresses for master DMA channel */
0 w# X" A( [& o# J0 ^" a                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);# o) \, _' z  V. {
                paramSet.destAddr   = (uint32_t)(ping_buffer);! A' |" f. h; M; G: A& S

4 y  G+ S  g2 G+ T5 N                /* Write to the master DMA channel first. */
7 h3 b7 x: n! V8 N1 q                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
4 U2 ?1 P: r: a" r0 k! Q4 E, m& d9 u2 `    }      
. d( i* @8 r% ^: r: k( z4 s
* o% p3 J5 z! i. f% M0 Q# h+ S# w        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
  a  h9 I6 B. d8 C. G0 i        . _9 P9 W6 N6 ?7 p  n; \
    if(result == EDMA3_DRV_SOK)
$ Y6 ]+ d' |( G4 m9 Y7 J. n8 Z    {8 O3 M. N! g2 h; s
            print2arm("edma3 driver init success.",0);! E) ?# Q' h9 I3 N' l, n+ M* ]  O; w
    }
& d1 _9 B! U2 @  O}: T+ f5 R' Y, h# o0 J6 k: m) u
) J4 H4 [% y  S6 l3 E' e

+ D, G& |$ Z5 e7 _( YEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: ~$ T& n: b7 z6 F; k6 F% ]

1 Y% w4 q1 F: ?8 J8 l4 U; J" g

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& y; i3 j/ b. A5 h每次DMA传输完成后都要再次使能传输
8 j& _+ I" b3 B( ?
原来是这样,我明天去试试,谢谢了!




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